Diagonale des endlichen Kantors

20

Ausgehend von einer Liste von NGanzzahlen mit jeweils NZiffern wird eine Zahl ausgegeben, die sich von der ersten Ziffer aufgrund der ersten Ziffer, der zweiten Ziffer aufgrund der zweiten Ziffer usw. unterscheidet.

Beispiel

Angesichts dieser Liste:

1234
4815
1623
4211

Die 2932erste Ziffer der ersten Ziffer unterscheidet sich von der ersten Ziffer der ersten Ziffer, die zweite Ziffer unterscheidet sich von der zweiten Ziffer der zweiten Ziffer usw. Daher wäre dies eine gültige Ausgabe.

Eingänge

  • Sie können sowohl die Liste als auch Nals Eingabe oder nur die Liste verwenden, wenn Sie dies wünschen.
  • Jede Ganzzahl in der Liste muss so viele Stellen haben wie die Länge der Liste ( N)
  • Zahlen haben keine führenden Nullen
  • Die Eingabeliste muss Zahlen und keine Zeichenfolgen enthalten.
  • Sie können Eingaben als Funktionsargumente STDINoder ähnliches verwenden.
  • Sie können davon ausgehen, dass die Liste nicht länger als 10 Elemente sein wird (und keine Zahl in der Liste größer als 2147483647).

Ausgänge

  • Es reicht nicht aus, dass die Ausgabe nicht in der Liste enthalten ist. Die Ziffern müssen sich wie oben beschrieben unterscheiden.
  • Sie können eine beliebige Ziffernauswahlstrategie verwenden, die die Einschränkung verschiedener Ziffern berücksichtigt.
  • Die Nummer darf keine führenden Nullen haben
  • Sie können die Nummer über ausgeben STDOUT, von einer Funktion zurückgeben usw.

Testfälle

Input:
12345678
23456789
34567890
45678901
56789012
67890123
78901234
89012345

Possible output: 24680246


Input:
1

Possible output: 2

Wertung

Das ist , also gewinnt die kürzeste Antwort in Bytes.

Tödlich
quelle
Müssen wir also die STDINGanzzahl konvertieren , bevor wir sie analysieren?
Undichte Nonne
@KennyLau-Eingabe muss aus Zahlen bestehen. Wenn Ihre Sprache Ziffern direkt analysieren kann, müssen Sie nichts konvertieren.
Fatalize
Aber STDINist Zeichenfolge standardmäßig ...
Leaky Nun
Konvertieren Sie dann die Eingabezeichenfolge in eine Liste von Ganzzahlen.
Fatalize
Können wir eine Ziffernliste ausgeben?
Conor O'Brien

Antworten:

4

Gelee, 8 7 Bytes

1 Byte gespart dank Dennis.

DŒDḢỊ‘Ḍ

Probieren Sie es online!

Erläuterung

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.

Konvertiert jede Ziffer in 1, mit Ausnahme von 0und 1wird zu 2.

Undichte Nonne
quelle
8

CJam ( 15 bis 14 Bytes)

qN/ee{:=i2%)}%

Online-Demo

Vielen Dank an Adnan für die Einsparung von einem Byte.

Präparation

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
}%
Peter Taylor
quelle
1
@Adnan, das funktioniert, danke. Alternativ i2%)könnte 49&)direkt mit Zeichen anstatt mit ASCII-Codes gearbeitet werden.
Peter Taylor
7

Python 2, 47 45 Bytes

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

Vielen Dank an @xnor für das Golfen mit 2 Bytes!

Teste es auf Ideone .

Wie es funktioniert

`x`ergibt eine Stringdarstellung der Liste x .

Für den ersten Testfall ergibt dies den String

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

[1::n+3]jedes abruft (n + 3) -ten Zeichen - wobei n die Länge von x mit dem zweiten Ausgang. Bei 2 Zeichen ,wird die erste Ziffer der ersten Ziffer, die zweite Ziffer der zweiten Ziffer usw. abgerufen.

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

Wir nehmen nun die Zahl modulo 10 n ÷ 2 , um die erste Ziffer im Bereich [0, 4] abzubilden .

Für 93579135 erhalten wir 93579135% 50000000 = 43579135 .

Schließlich addieren wir zum letzten Ergebnis 10 n ÷ 9 , was - von 9 auf 0 umlaufend - alle Ziffern um 1 (kein Übertrag) oder 2 (mit Übertrag) erhöht .

Für 43579135 erhalten wir 43579135 + 11111111 = 54690246 .

Dennis
quelle
4

MATL, 11 10 9 Bytes

VXd9\QV!U

Nimmt nur einen Spaltenvektor von ganzen Zahlen als Eingabe. Nwird nicht geliefert.

Probieren Sie es online

Erläuterung

    % 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
Suever
quelle
1
@ LuisMendo Oh verrückt. Es sieht so aus, als hätte es ein Problem mit der führenden Null, wenn die erste Ziffer lautet 2: matl.tryitonline.net/…
Suever
VielleichtVXd9\QV!U
Suever
Oh, ich hätte nicht gedacht, Null zu führen ...
Luis Mendo
@ LuisMendo Ist es wichtig, dass sie nicht einzigartig sind? Solange sie nicht den gleichen Wert wie die Eingabe haben, sollte das keine Rolle spielen.
Suever
Du hast vollkommen recht. Ich habe falsch darüber nachgedacht
Luis Mendo
3

Pyth, 11 Bytes

jk.eh!ts@`b

Einfache Schleife, ändern Sie jede Ziffer auf 1, außer 1 wird 2.

orlp
quelle
Schöne Verwendung des impliziten Qund k! Sie können jedoch ein Byte mit während der s.eh-12@`b
Zifferntransformation speichern
3

Retina, 39 38 37

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

1 Byte gespeichert danke Martin!

Erfordert einen nachgestellten Zeilenvorschub in der Eingabe.

Erhält Diagonalen und übersetzt 0 und 2-9 zu 1 und 1 zu 2.

Die Grundidee, um die Diagonalen zu erhalten, besteht darin, ein Capture für jede Zeile über die aktuelle Zeile zu verschieben und dann ein Capture zu verbrauchen, das mit einem Zeichen übereinstimmt, und dann das nächste Zeichen beizubehalten.

Probieren Sie es online aus

FryAmTheEggman
quelle
3

J, 26 22 Bytes

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

Ähnliche Annäherung an die anderen unter Verwendung der <= 1undincrement Methode der Diagonale.

Verwendung

Benötigt nur die Liste der ganzen Zahlen als Argument.

   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
Meilen
quelle
Tut mir leid, die 1-
Serie
2

Python 2, 54 Bytes

d,r=1,""
for n in input():r+=`1+-~n/d%9`;d*=10
print r
orlp
quelle
Kommt mir bekannt vor. -~n
Erik der Outgolfer
2

Java, 94 Bytes

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;}

Reine numerische Operationen für den Gewinn! :)

Beispiel Input / Output:

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

Volles Programm (mit ungolfed 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();
    }
}
Undichte Nonne
quelle
2

Java, 93 Bytes

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;}

Ungolfed

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;
}

Ausgabe

Input:
12345678
23456789
34567890
45678901
56789012
67890123
78901234
89012345

Output:
99991999

Input:
1234
4815
1623
4211

Output:
9999
Marv
quelle
1

J, 37 Bytes

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

Kann wahrscheinlich Golf spielen, aber ich habe vergessen, ob es einen Befehl für "Diagonalen" gab.

Conor O'Brien
quelle
Ich habe es schon einmal gesehen verwendet, Martin verwendet , um die anti-Diagonalen hier .
FryAmTheEggman
@FryAmTheEggman Ja, das ist knapp. Ich suche immer noch, aber es könnte nicht sein.
Conor O'Brien
Dies scheint eine führende Null zu ergeben, wenn die Diagonale mit einer 9 beginnt.
Zgarb
Sie können die Zifferntabelle erstellen, wenn Sie die Eingabe nmit übernehmen <list> (#:~#&10) <n>. Die erste Diagonale mit gefunden werden , (< 0 1) |: <list>wo (< 0 1)sie ein Feld für die Achsen auszuwählen, die beide mit mit|:
Meilen
1

Reng v.3.3, 60 Bytes

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

Für Reng war das ziemlich einfach. Probieren Sie es hier aus! Die Eingabe ist eine durch Leerzeichen getrennte Liste von Zahlen.

1: init

k1-#kaiír1ø

k ist die Anzahl der Eingänge (Anzahl der Zahlen), und wir dekrementieren um 1 und stellen für die Schleifenstufe wieder her. aiíNimmt alle Eingaben. rKehrt den Stapel für die Verarbeitung von Eingaben um.geht zur nächsten Zeile.

2: Schleife

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

1[Nimmt den obersten Gegenstand vom Stapel und legt ihn auf einen neuen Stapel. åteilt es in Ziffern auf. {$}drückt einen Codeblock, der die Operation "drop" enthält; Dies wird mehrmals wiederholt k( k*) und der Codeblock wird gelöscht ( $. k1-#kdekrementiert k. )9(setzt 9den STOS und -subtrahiert den TOS vom STOS. #ospeichert diese Zahl in ound a$;löscht alle Mitglieder des Stapels. ]schließt den übergeordneten Stapel. osetzt ozurück auf Das ist unsere Ziffer, die wir speichern. )Verschiebt sie nach unten, damit wir unsere Schleife fortsetzen können. Prüft snormalerweise auf Nichteingabe (dh Gleichheit mit -1), aber wir können sie verwenden, um aus unserer Schleife auszubrechen, wennk == -1 . Sos^geht auf wenn k == -1. $fällt kvom Stapel und unsere Schleife beginnt von vorne.

3: endgültig

                     ~; !nb$<

<richtet den Zeiger nach links und $fällt kvom Stapel. bist ein linker Spiegel, also treten wir durch ihn hindurch, aber er prallt zurück, wenn wir auf einen Spiegel mit Stapelbedingung treffen ;. !nGibt nur dann eine Ziffer aus, wenn wir nach links gehen. ~Beendet das Programm, wenn wir mit dem Drucken fertig sind.

Conor O'Brien
quelle
1

Mathematica 52 Bytes

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

Dies folgt dem Ansatz von Peter Taylor und anderen (ohne Verwendung von ASCII-Codes).

Beispiel

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

2112

DavidC
quelle
1

ClojureScript, 58 Zeichen

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

Die Typanforderungen machten dies etwas länger als nötig, und map-indexedso viele Zeichen zu haben, half nicht.

Häufig sind meine Einsendungen auch für Clojure gültig, dies nutzt jedoch einige von ClojureScripts Leakiness mit JavaScript. Die Subtraktion einer Zahl und eines Strings zwingt den String zu einer Zahl - also (- 9 "5")gleich 4.

MattPutnam
quelle
1

PHP, 46/41/40 Bytes

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;

Verschiedene Ziffernwähler zum Vergleich. Ich dachte, "9-stellig" wäre am kürzesten, aber der Sonderfall, der erforderlich ist, um eine Null aus der ersten Ziffer herauszuhalten, überfordert sie.

Aus CLI-Argumenten gespeist:

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

Ruby, 21 Bytes

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

Ein volles Programm. Laufen Sie mit der -nFlagge. Verwendet die folgende Abbildung: n -> n%2+1.

xsot
quelle
1

JavaScript (ES6), 41

Der% 9 + 1-Trick stammt aus Suevers Antwort. Ausnahmsweise einmal .reduceBeats .map. Beachten Sie, dass der +=Operator verwendet wird, um Klammern zu vermeiden.

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

Perl, 18 Bytes

Beinhaltet +1 für -p

Führen Sie mit den Eingabezeilen auf STDIN. Ausgang ist 1, außer 2, wenn die Diagonale 1 ist

cantor.pl

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