유한 캔터의 대각선


20

N각각 N숫자 가있는 정수 목록이 주어지면 첫 번째 숫자 때문에 첫 번째 숫자와 두 번째 숫자 때문에 두 번째 숫자 등이 다른 숫자를 출력합니다.

이 목록이 주어지면 :

1234
4815
1623
4211

숫자 2932의 첫 번째 숫자는 첫 번째 숫자의 첫 번째 숫자와 다르고 두 번째 숫자는 두 번째 숫자의 두 번째 숫자와 다릅니다. 따라서 유효한 출력이됩니다.

입력

  • 목록과 N입력 을 모두 사용 하거나 원하는 경우 목록 만 사용할 수 있습니다.
  • 목록의 각 정수는 반드시 목록의 길이 ( N) 만큼 많은 자릿수를 갖습니다.
  • 숫자는 앞에 0이 없습니다
  • 입력 목록에는 문자열이 아닌 숫자가 포함되어야합니다.
  • 입력을 함수 인수,를 통해 STDIN또는 이와 유사한 것으로 사용할 수 있습니다.
  • 목록이 10 요소보다 길지 않다고 가정 할 수 있습니다 (목록의 숫자가보다 큼 2147483647)

출력

  • 출력이 목록에없는 것으로 충분하지 않습니다. 숫자는 위에서 설명한대로 달라야합니다.
  • 다른 숫자의 제약 조건을 따르는 숫자 선택 전략을 사용할 수 있습니다.
  • 숫자는 선행 0을 가질 수 없습니다
  • 를 통해 숫자를 출력 STDOUT하거나 함수에서 반환 할 수 있습니다 .

테스트 사례

Input:
12345678
23456789
34567890
45678901
56789012
67890123
78901234
89012345

Possible output: 24680246


Input:
1

Possible output: 2

채점

이것은 이므로 바이트 단위의 최단 답변이 이깁니다.


STDIN파싱하기 전에 정수를 정수 로 변환해야 합니까?
Leaky Nun

@KennyLau 입력은 숫자 여야합니다. 언어에서 숫자를 직접 구문 분석 할 수 있으면 아무것도 변환 할 필요가 없습니다.
16:12시에 치명적

그러나 STDIN기본적으로 문자열입니다 ...
Leaky Nun

그런 다음 입력 문자열을 정수 목록으로 변환하십시오.
16:12시에 치명적

자릿수 목록을 출력 할 수 있습니까?
코너 오브라이언

답변:


4

젤리, 8 7 바이트

Dennis 덕분에 1 바이트가 절약되었습니다.

DŒDḢỊ‘Ḍ

온라인으로 사용해보십시오!

설명

DŒDḢỊ‘Ḍ    Main link. Takes list as argument.
D          Convert each integer to decimal.
 ŒD        Get the diagonals.
   Ḣ       Get the first diagonal.
    Ị      Check if every digit <= 1.
     ‘     Increment every digit.
      Ḍ    Convert back to integer from decimal.

변환은 각각의 숫자는하기 1를 제외 0하고 1해진다 2.


8

CJam ( 15 14 바이트)

qN/ee{:=i2%)}%

온라인 데모

1 바이트 절약을위한 Adnan 에게 감사합니다 .

해부

qN/    e# Split input on newlines
ee{    e# Label each line with its index and map:
  :=i  e#   Get the character at the same index (i.e. diagonalise)
  2%)  e#   Compute (ASCII value mod 2) + 1
       e#   Maps 0 1 2 3 4 5 6 7 8 9
       e#     to 1 2 1 2 1 2 1 2 1 2
}%

1
@Adnan, 잘 작동합니다. 감사합니다. 또는 ASCII 코드가 아닌 문자로 직접 작업 i2%)할 수도 있습니다 49&).
피터 테일러

7

파이썬 2, 47 45 바이트

lambda x,n:int(`x`[1::n+3])%(10**n/2)+10**n/9

2 바이트를 골라 낸 @xnor에게 감사드립니다!

Ideone에서 테스트하십시오 .

작동 원리

`x`리스트 x 의 문자열 표현을 생성합니다 .

첫 번째 테스트 사례의 경우 문자열을 제공 합니다.

[92345678, 23456789, 34567890, 45678901, 56789012, 67890123, 78901234, 89012345]

[1::n+3]모든 (n + 3) 번째 문자를 검색합니다. 여기서 n 은 두 번째 문자로 시작하는 x 의 길이입니다 . 에 대해 2 자를 계산 ,하면 첫 번째 숫자의 첫 번째 숫자, 두 번째 숫자의 두 번째 숫자 등을 검색합니다.

[92345678, 23456789, 34567890, 45678901, 56789012, 67890123, 78901234, 89012345]
 ^          ^          ^          ^          ^          ^          ^          ^

이제 [0, 4] 범위의 첫 번째 숫자를 매핑하기 위해 숫자 modulo 10 n ÷ 2 를 취합니다 .

들어 93579135 , 우리가 얻을 9천3백57만9천1백35퍼센트에게 = 43,579,135 50,000,000을 .

마지막으로, 마지막 결과 에 10 n ÷ 9 를 더합니다. 9 에서 0으로 줄 바꿈 하여 모든 숫자를 1 (캐리 없음) 또는 2 ( 캐리 포함) 씩 증가시킵니다 .

들어 43579135 , 우리가 얻을 + 11111111 = 54690246 43579135을 .


4

MATL, 11 10 9 바이트

VXd9\QV!U

정수 열 벡터 만 입력으로 사용합니다. N제공되지 않습니다.

온라인으로 사용해보십시오

설명

    % Implicity grab input as column vector of numbers
V   % Convert the input column vector into a 2D character array
Xd  % Grab the diagonal elements of the character array
9\  % Take the modulus of each ASCII code and 9
Q   % Add 1 to remove all zeros
V   % Convert the result to a string
!   % Transpose to yield a row vector of characters
U   % Convert back to an integer (as per the rules)
    % Implicitly display result

1
트윗 담아 가기 그 첫 번째 숫자 인 경우 비록 앞에 0이 문제가 같습니다 2: matl.tryitonline.net/...
Suever

아마VXd9\QV!U
Suever

오, 나는 제로를 선도 생각하지 않았다 ...
Luis Mendo

@LuisMendo 고유하지 않은 것이 중요합니까? 입력과 동일한 값이 아닌 한 중요하지 않습니다.
Suever

당신 말이 맞아요 나는 그것에 대해 잘못 생각하고 있었다
Luis Mendo

3

Pyth, 11 바이트

jk.eh!ts@`b

간단한 루프, 1이 2가되는 것을 제외하고 모든 숫자를 1로 변경하십시오.


암시의 좋은 사용 Q하고 k! 그래도 숫자 변환 중에 1 바이트를 절약 할 수 있습니다.s.eh-12@`b
Jakube

3

망막, 39 38 37

(?<=(.*¶)*)(?<-1>.)*(.).*¶
$2
T`d`121

1 바이트 덕분에 Martin을 구했습니다!

입력에 후행 줄 바꿈이 필요합니다.

대각선을 가져오고 0과 2-9를 1과 1을 2로 변환합니다.

대각선을 얻는 기본 아이디어는 현재 행 위로 각 행에 대한 캡처를 푸시 한 다음 문자를 일치시키기 위해 캡처를 사용한 후 다음 문자를 유지하는 것입니다.

온라인으로 사용해보십시오


3

J, 26 22 바이트

1+1>:i.@#{"_1"."0@":"0

대각선 의 <= 1increment방법을 사용하는 다른 방법 과 비슷한 접근 방식 .

용법

인수로 정수 목록 만 필요합니다.

   f =: 1+1>:i.@#{"_1"."0@":"0
   f 1234 4815 1623 4211
2 1 1 2
   f 92345678 23456789 34567890 45678901 56789012 67890123 78901234 89012345
1 1 1 1 1 2 1 1

1 줄을 끊으
셔서


2

자바, 94 바이트

int c(int[]d){int p=1,r=0,l=d.length,i=0;for(;i<l;p*=10)r+=(d[l-++i]/p%10==1?2:1)*p;return r;}

승리를위한 순수한 숫자 연산! :)

샘플 입력 / 출력 :

8            <-- size
12345678     <-- start of list
23456789
34567890
45678901
56789012
67890123
78901234
89012345     <-- end of list
21111211     <-- result from ungolfed code
21111211     <-- result from golfed code

전체 프로그램 (골프가없는 코드) :

import java.util.Scanner;

public class Q79444 {
    int cantor_ungolfed(int[] data){
        int power = 1;
        int result = 0;
        for(int i=0;i<data.length;i++){
            result += (((data[data.length-i-1]/power))%10==1? 2 : 1)*power;
            power *= 10;
        }
        return result;
    }
    int c(int[]d){int p=1,r=0,l=d.length,i=0;for(;i<l;p*=10)r+=(d[l-++i]/p%10==1?2:1)*p;return r;}
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] input = new int[n];
        for(int i=0;i<n;i++){
            input[i] = sc.nextInt();
        }
        System.out.println(new Q79444().cantor_ungolfed(input));
        System.out.println(new Q79444().c(input));
        sc.close();
    }
}

2

자바, 93 바이트

String k(int n,int[]a){String s="";for(int i=0;i<n;)s+=(a[i]+s).charAt(i++)<57?9:1;return s;}

언 골프

String k(int n, int[] a) {
    String s = "";
    for (int i = 0; i < n; ) 
        s += (a[i] + s).charAt(i++) < 57 ? 9 : 1;
    return s;
}

산출

Input:
12345678
23456789
34567890
45678901
56789012
67890123
78901234
89012345

Output:
99991999

Input:
1234
4815
1623
4211

Output:
9999

1

J, 37 바이트

f@(9&-@"."0@((>:@#*i.@#){f=:[:,":"0))

골프를 쳤을지도 모르지만 "대각선"명령이 있으면 잊어 버렸습니다.


이전에 사용했던 것을 보았습니다. Martin은 대각 대각선을 여기에서 사용했습니다 .
FryAmTheEggman

@FryAmTheEggman 그래, 가까이. 나는 아직도 찾고 있지만 없을 수도 있습니다.
코너 오브라이언

대각선이 9로 시작하면 이것은 0을 나타내는 것처럼 보인다.
Zgarb

n사용 하여 입력하면 숫자 표를 만들 수 있습니다 <list> (#:~#&10) <n>. 첫 번째 대각선은 다음과 (< 0 1) |: <list>같이 (< 0 1)둘을 사용하여 축을 선택할 수있는 상자가있는 곳에서 찾을 수 있습니다.|:
miles

1

Reng v.3.3, 60 바이트

k1-#kaiír1ø          ~; !nb$<
1[å{$}k*$k1-#k)9(-#oa$;]o)ks^$

Reng에게는 다소 단순했습니다. 여기 사용해보십시오! 입력은 공백으로 구분 된 숫자 목록입니다.

1 : 초기화

k1-#kaiír1ø

k입력 수 (숫자 수)이며 1 씩 감소하고 루프 단계로 복원합니다. aií모든 입력을받습니다. r입력 처리를 위해 스택을 반대로합니다. 다음 줄로갑니다.

2 : 루프

1[å{$}k*$k1-#k)9(-#oa$;]o)ks^$

1[맨 위 항목을 스택에서 새 스택으로 가져옵니다. å숫자로 나눕니다. {$}"drop"연산을 포함하는 코드 블록을 푸시합니다. 이 k시간 이 반복 됩니다k* ) 상기 코드 블록은 삭제되어 ( $. k1-#k감소율이 k. )9(9STOS에서 및 -감산은 STOS로부터 TOS. #o매장이 수 o, 및 a$;스택의 모든 구성원을 삭제합니다. ]상위 스택을 닫는다. o둔다는 o다시 맨 위; 이것은 우리가 저장하고있는 숫자입니다. )루프를 계속할 수 있도록 맨 아래로 옮깁니다. s일반적으로 비 입력 (즉, 등식 -1)을 확인하지만, 루프에서 벗어날 때 사용할 수 있습니다. k == -1그래서s^때 올라갑니다k == -1. 스택에서 $떨어지면 k루프가 다시 시작됩니다.

3 : 최종

                     ~; !nb$<

<포인터를 왼쪽으로 지시하고 스택에서 $떨어집니다 k. b는 왼쪽 거울이므로, 우리는 그것을 통과하지만 ;스택 조건 거울을 때리면 되 ounce니다 . !n우리가 떠날 경우에만 숫자를 인쇄합니다. ~인쇄가 끝나면 프로그램을 종료합니다.


1

매스 매 티카 52 바이트

FromDigits[Mod[#,2]+1&/@Diagonal[IntegerDigits/@#]]&

이것은 Peter Taylor와 다른 사람들의 접근 방식을 따릅니다 (아스키 코드를 사용하지 않고).

FromDigits[Mod[#,2]+1&/@Diagonal[IntegerDigits/@ #]]&[{1234,4815,1623,4211}]

2112


1

ClojureScript, 58 자

#(int(apply str(map-indexed(fn[i x](- 9(get(str x)i)))%)))

유형 요구 사항으로 인해 필요 이상으로 약간 길어졌으며 map-indexed많은 문자가 도움이되지 않았습니다.

종종 내 제출물은 유효한 Clojure이지만 JavaScript와 함께 ClojureScript의 누출을 사용하고 있습니다. 숫자와 문자열의 뺄셈은 숫자에 문자열 강제 변환 -입니다 (- 9 "5")같습니다 4.


1

PHP, 46/41/40 바이트

while($a=$argv[++$i])echo($b=9-$a[$i-1])?$b:1;

while($a=$argv[++$i])echo$a[$i-1]==7?6:7;

while($a=$argv[++$i])echo($a[$i-1]%2)+1;

비교를위한 다양한 숫자 선택기. 나는 "9 자리"가 가장 짧을 것이라고 생각했지만 첫 번째 자리에서 0을 유지하는 데 필요한 특별한 경우가 압도적입니다.

CLI 인수에서 공급 :

php -r "while($a=$argv[++$i])echo($b=9-$a[$i-1])?$b:1;" 12345678 23456789 34567890 45678901 56789012 67890123 78901234 89012345
86421864

1

루비, 21 바이트

$><<$_[$.-1].hex%2+1

전체 프로그램. -n플래그로 실행하십시오 . 다음 매핑을 사용합니다 n -> n%2+1..


1

자바 스크립트 (ES6), 41

% 9 + 1 트릭은 Suever의 답변에서 빌 렸습니다. 한 번만 .reduce이깁니다 .map. 참고 +=연산자는 괄호를 방지하기 위해 사용된다.

a=>+a.reduce((t,n,d)=>t+=(n+t)[d]%9+1,'')

1

펄, 18 바이트

에 +1 포함 -p

STDIN의 입력 라인으로 실행하십시오. 대각선이 1 인 경우 출력은 2를 제외하고 1입니다.

cantor.pl

#!/usr/bin/perl -p
pos=$.;$_=/1\G/+1

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.