有限カントールの対角線


20

NそれぞれがN数字の整数のリストを指定すると、最初の数字のために最初の数字とは異なる数字を出力し、2番目の数字のために2番目の数字などを出力します。

このリストを考えると:

1234
4815
1623
4211

数字2932の最初の数字は最初の数字の最初の数字と異なり、2番目の数字は2番目の数字の2番目の数字と異なります。したがって、有効な出力になります。

入力

  • リストとN入力の両方を使用することも、必要に応じてリストのみを使用することもできます。
  • リスト内の各整数には、リストの長さと同じ桁数が必要です(N
  • 数字には先行ゼロはありません
  • 入力リストには、文字列ではなく数字を含める必要があります。
  • 入力を関数の引数としてSTDIN、またはを介して入力できます。
  • あなたはリストが10要素より長くないことを仮定するかもしれません(そしてリスト内の数はより大きいことはありません2147483647

出力

  • 出力がリストにないだけでは不十分です。上記で説明したように、数字は異なる必要があります。
  • 異なる桁の制約を尊重する任意の桁選択戦略を使用できます。
  • 番号に先行ゼロを含めることはできません
  • を通じてを出力することができSTDOUT、関数などからそれを返します。

テストケース

Input:
12345678
23456789
34567890
45678901
56789012
67890123
78901234
89012345

Possible output: 24680246


Input:
1

Possible output: 2

得点

これはであるため、バイト単位の最短回答が優先されます。


STDIN解析する前に整数に変換する必要がありますか?
リーキー修道女

@KennyLau入力は数字である必要があります。言語で数字を直接解析できる場合は、何も変換する必要はありません。
16

しかし、STDINデフォルトでは文字列が...ある
漏れ修道女

次に、入力文字列を整数のリストに変換します。
16

数字のリストを出力できますか?
コナーオブライエン

回答:


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は2 番目の文字から始まるxの長さです。の2文字,を考慮して、最初の数字の最初の数字、2番目の数字の2番目の数字などを取得します。

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

10 n ÷2を法とする数を取り、範囲[0、4]の最初の数字をマッピングします。

93579135、我々が得る93579135% 50000000 = 43579135を

最後に、10 n ÷9を最後の結果に追加します。これは、すべての桁を1(桁上げなし)または2(桁上げあり)で増分します(9から0に折り返します)。

43579135、我々が得る= 54690246 43579135 + 11111111


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
@LuisMendoおっと。それは最初の桁があるときにかかわらず、先頭にゼロの問題があるように見えます2matl.tryitonline.net/...
Suever

たぶんVXd9\QV!U
スーバー

ああ、私はゼロをリードすると考えていなかった...
ルイスMendo

@LuisMendoユニークではないことは重要ですか?入力と同じ値でない限り、問題ではありません。
-Suever

あなたはまったく正しい。私はそれを間違った方法で考えていました
ルイス・メンドー

3

Pyth、11バイト

jk.eh!ts@`b

単純なループ。1が2になる以外は、すべての数字を1に変更します。


暗黙的Qおよびk!ただし、数字変換中に1バイトを保存できますs.eh-12@`b
。–ジャクベ

3

網膜、 39 38 37

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

マーティンに感謝して1バイト節約しました!

入力に末尾の改行が必要です。

対角線を取得し、0と2-9を1と1と2に変換します。

対角線を取得するための基本的な考え方は、現在の行の上に各行のキャプチャをプッシュし、キャプチャを使用して文字に一致させ、次の文字を保持することです。

オンラインで試す


3

J、26 22バイト

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

対角線の<= 1およびincrementメソッドを使用した他のユーザーへの同様のアプローチ。

使用法

引数として整数のリストのみが必要です。

   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



2

Java、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

Java、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))

おそらくゴルフはできますが、「対角線」のコマンドがあるかどうか忘れていました。


私はそれが以前に使用されたことを見ました、マーティンはここで対角線を使用しました
FryAmTheEggman

@FryAmTheEggmanそうだね。私はまだ探していますが、ないかもしれません。
コナーオブライエン

対角線が9で始まる場合、先行ゼロが生成されるようです。
Zgarb16年

nを使用して入力を取得する場合、数字テーブルを作成できます<list> (#:~#&10) <n>。最初の対角はで見つけることができる(< 0 1) |: <list>場所(< 0 1)で、両方を使用して、軸が選択するためのボックスがある|:
マイル

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[スタックから一番上のアイテムを取り出して新しいスタックに入れます。å数字に分割します。{$}操作「ドロップ」を含むコードブロックをプッシュします。これが繰り返される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は左向きのミラーなので、そこから入り;ますが、スタック状態のミラーを押すと跳ね返ります。!n離れる場合にのみ数字を出力します。~印刷が完了したらプログラムを終了します。


1

Mathematica 52バイト

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

これは、Peter Taylorなどのアプローチに従います(Asciiコードを使用しません)。

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桁」が最も短いと思いましたが、最初の桁のゼロを保持するために必要な特別なケースがそれを圧倒します。

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

JavaScript(ES6)、41

%9 + 1のトリックは、Sueverの答えから借用しています。一度、.reduceビート.map+=演算子は括弧を避けるために使用されることに注意してください。

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

1

Perl、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.