Bei einem Standard-Zahlenschloss wie auf dem Bild. Zum Entsperren richten Sie die 4 Zahlen im Code in der Kombinationszeile aus. Nach Jahren des treuen Dienstes wurden Sie aus der Schlossfabrik entlassen und haben sich entschlossen, Rache zu üben, indem Sie die Schlösser nicht durcheinandergebracht haben, bevor Sie sie abschicken, und so jedes Schloss mit der Kombination belassen, um sie auf der Kombinationslinie zu entsperren.
Sie wissen auch, dass Sie anhand der Reihenfolge der Zahlen in den anderen Zeilen herausfinden können, welche Zahlen in der Kombinationszeile enthalten sein müssen (und daher die Kombination, mit der sie entsperrt werden soll).
Wenn jeder Zeile des Schlosses eine Nummer zugewiesen wird, die von Zeile 0 für die Kombinationszeile (die Zeile, die das Schloss entsperrt) bis Zeile 9 beginnt. Wenn beispielsweise die Nummern in Zeile 4 lauten 5336
, ist dies die zu entsperrende Kombination 1992
.
Leider wurden die Schlösser bereits verpackt und Ihre Sicht auf jedes Schloss ist verdeckt, sodass Sie nur Zahlen in verschiedenen Schlosszeilen sehen können.
Die Herausforderung
Bei 4 Ziffernpaaren, wobei die erste Ziffer der Ganzzahl die Zeilennummer und die zweite Ziffer die in dieser Zeile erscheinende Zahl darstellt, muss die Zahlenkombination für das Schloss ermittelt werden. Zum Beispiel, wenn Sie Folgendes eingeben:
57 23 99 45
Dann sollte es ausgeben:
2101
Oder
25 78 63 15
und
3174
Angenommen, die Eingabe besteht immer aus 4 positiven ganzen Zahlen in der Form `25 64 72 18.
Dies ist Code-Golf , also gewinnt das kürzeste Programm in der Anzahl der Bytes.
Auch dies ist meine erste Frage, daher ist jedes Feedback willkommen.
57 23 99 45
. Das sind nicht vier Paare von ganzen Zahlen, sondern vier ganze Zahlen. Bei einigen Antworten wird davon ausgegangen, dass es sich um eine Zeichenfolge handelt, bei anderen wird davon ausgegangen, dass die Zeichenfolge als 4-Zoll-Zeichenfolge verarbeitet wurde.0
s).Antworten:
CJam,
98 BytesLiest die Ziffernpaare als Befehlszeilenargumente. Um den Code online auszuprobieren , wechseln Sie
ea
zu "lS/
Aus simuliertem STDIN lesen".Beispiellauf
Wie es funktioniert
Der Zeichencode der Ziffer d ist 48 + d . Betrachtet man also die zweistellige Zeichenkette xy, ergibt eine Zahl zur Basis 9 9 * (48 + x) + (48 + y) = 10 * (48 + x) + y - x ≡ y - x (mod 10) .
quelle
"99"
wird tatsächlich als Array interpretiert[57 57]
durchb
;"xy"9b
ist implementiert als9 * ord(x) + ord(y)
. Das sollte ich zu meiner Antwort hinzufügen.CJam,
131211 ZeichenDank user23013 sind es jetzt nur noch 11 Zeichen :)
Erklärungen:
Probieren Sie es online aus
Ich weiß, dass man mehr Golf spielen kann. Aber dies ist mein erster wirklicher Versuch bei CJam und ich bin durch Erfahrung eingeschränkt :)
Alternativ die anderen Methoden, um dasselbe in einem zusätzlichen Zeichen zu tun:
oder
oder
quelle
l~]
. Ich habe das Gefühl, dass das Parsen der Eingabe mit weniger als drei möglich sein sollte, aber ich habe noch nie CJam verwendet: /4{ri_A/-A%}*
ist ein Byte kürzer.4{Ar:--A%}*
.Golfscript (14
13)Probieren Sie es hier online aus
Es ist so ziemlich das Gleiche wie die Lösung von Optimizer , jedoch in einer anderen Sprache. Eine andere Herangehensweise ist schwierig, da das Problem recht einfach ist. Die Entscheidung
liegt also definitiv bei Optimizer, dessen Eintrag ohnehin früher war.Für die gleiche Anzahl von Bytes können Sie tun
quelle
- 10
.GNU DC , 14 Bytes
Borrowing @ Dennis 'cleverer Base 9-Trick :
Eingabe-Ganzzahlen, die aus STDIN gelesen werden, eine pro Zeile.
Erläuterung:
Ausgabe:
Vorherige Antwort, 18 Bytes:
Weil ich dachte, ich könnte mich damit den "Golf" -Sprachen nähern (tat es aber nicht):
quelle
9i[?A%nd]dxxxx
C
646356 oder 61Wenn die Eingabe aus der Datei weitergeleitet werden kann
Wenn die Eingabe auf stdin geschrieben werden soll
Liest die vier Zahlen in einer Schleife und verarbeitet sie dann, indem die erste Ziffer vom Wert subtrahiert und das Ergebnis Modulo 10 gedruckt wird.
Einsparungen durch verschiedene Kommentare unten und die Verwendung von Putchar anstelle von printf
quelle
scanf
Äußerefor()
wie folgt setzena,i;main(){for(;i++-4;printf("%d",(a-a/10)%10))scanf("%d",&a);}
a*.9
anstelle vona-a/10
while
Schleife verwenden unda
als Argument deklarierenmain
:main(a){while(scanf("%d",&a)>0)printf("%d",(a-a/10)%10);}
Python 3, 64
Einfach.
Es kann kürzer sein, wenn ich
[2, 1, 0, 1]
stattdessen drucken darf ( 46 ):quelle
str((i-i//10)%10)
direkt anstelle einer Sekunde nehmenmap()
. Ich habe auch mit Generatoren angefangen, aber festgestellt, dass eine tatsächlichefor
Schleife kürzer geworden ist.print(''.join((i-i//10)%10for i in map(int,input().split())))
. Auch wenn Räume in der Ausgabe allowd sind , können Sie vermeiden ,join
und die Verwendung Tupel-Auspacken:print(*((i-i//10)%10for i in map(int,input().split())))
.C 92
Eingabe von der Kommandozeile. Subtrahiert den ersten ASCII-Code jedes Arguments vom zweiten, addiert 10 und nimmt modulo 10.
Ich denke, dies ist das erste Mal, dass ich ein
printf
mit vier%
s und ohne Komma geschrieben habe (das Komma ist in der#define.
)quelle
#define f scanf("%c%c ",&a,&b);putchar(48+(9*a+b)%10)
gefolgt vona,b;main(){f;f;f;f;}
wäre 18 Bytes kürzer.scanf
notwendig ist, dascanf
Leerzeichen nur als Trennzeichen verwendet werden sollen. Alchymist hat in C eine noch bessere Idee. Aber es sieht so aus, als hätten Sie sie bereits mit Ihrer Cjam-Antwort gewonnen.a(n)
weggelassen werden kann, dann habe ich bemerkt, dass das Umstellenprintf("%d%,...)
Ihres Makros ein paar Bytes einsparen würde und schließlich wurde ich ein wenig mitgerissen ... - Das Leerzeichen wird benötigt, da%c
ein beliebiges Zeichen gelesen wird Zeichen, so würde es im zweiten Lauf 32 in speicherna
. - Das Schlagen von CJam mit C sollte sich als schwierig erweisen.printf()
ist schon so lange meine Antwort ...Java - 203 Bytes
Nur weil es hat ein Java - Eintrag sein, sah ich eine schöne Gelegenheit , diesen Code eine Chance zu geben (erste Vorlage überhaupt) Golf spielen.
Wenn es Raum für Verbesserungen gibt, würde ich mich freuen, davon zu erfahren ;-)
quelle
Lua - 46 Zeichen
Liest drei Zeichen gleichzeitig (gib mir die kleine Gnade, am Ende ein Leerzeichen einzugeben), und obwohl a und b string-y sind ... ba erlaubt MAGICALY ihnen, eine gesunde Baby-Ganzzahl zu empfangen. Prüft der Wrap-Around während des Druckvorgangs.
quelle
JavaScript ES6 -
5343 BytesZiemlich einfache Funktion, verwendet Regex, um die Zahlen zu erhalten. Probieren Sie es unter http://jsfiddle.net/efc93986/1/ aus . Wenn Funktionen nicht zulässig sind, ein eigenständiges Programm mit 52 Byte:
Da ES6 derzeit nur unter Firefox funktioniert, funktioniert der folgende Code mit 70 Byte in jedem modernen Browser:
quelle
1+
....?
anstelle von verwenden können/\d+ ?
. Der Raum nach der Rückkehr kann weggelassen werden. Da keine spezifischen E / A angegeben wurden, sollten Sie in der Lage sein, eine Funktion zu verwenden.a-a[0]
statt1+a[1]-a[0]
sollte auch funktionieren.Python 2 - 33 Bytes
Akzeptiert durch Kommas getrennte Benutzereingaben. ZB Eingabe:
Ausgabe:
Wenn die Ausgabe genau mit dem Beispiel übereinstimmen muss, ist sie viel länger. 47 Bytes:
quelle
input()
funktioniert nicht in meinem Python 2-Interpreter.APL, 14
Die Erklärung
⎕
erfolgt über den Bildschirm. Durch Leerzeichen getrennte Werte werden als Array analysiert.{...}¨
Geben Sie für jede Nummer die Funktion ein.⍎¨⍕⍵
Nimmt das Argument, erstellen Sie ein Array mit seinen Ziffern.--/
berechnet Einheiten minus zehn.10|
mod 10.quelle
J -
2015Die non-verb Form (als Anweisung anstelle der Funktionsdefinition) ist 5 Zeichen kürzer:
Die Verbform, die ein schöner Zug ist :
Dieses Verb wird für die Beispieleingaben verwendet:
quelle
Haskell
6058Ziffern mit einem Buchstaben, eine echte Nemesis im Golfsport von Haskell.
quelle
Perl:
3840Ausgabe:
quelle
abs
ist nicht notwendig;x - x/10
kann nicht negativ sein. 3. Wenn Sie die Flags-040pe
(normalerweise als 5 Byte gezählt) verwenden, um über durch Leerzeichen getrennte Eingaben zu iterieren, können Sie den Code auf kürzen$_=($_-int$_/10)%10
. 4. Wenn Sie Befehlszeilenflags vermeiden möchten, können Sie dennoch einige Bytes sparen,$/=$;
indem Sie den Aufruf von festlegen und entfernensplit
.Ruby, 35 Bytes
Erläuterung
Die Eingabe wird als Befehlszeilenargumente verwendet.
String#bytes
Gibt ein Array von Ganzzahlen (ASCII-Zeichencodes) zurück. Nur der Unterschied zwischen dem letzten und dem ersten Zeichencode ist von Bedeutung, nicht die Ganzzahlen selbst.quelle
C # & LinqPad: 104
quelle
C ++ 118
quelle
#include<iostream>
undstd::
vorcin
undcout
. 2. Sie brauchen die Bedingung nicht, wenn Sie sie weglassena=a%10
. 3. Sie brauchen nicht die Variablenb
undc
die Zeilenvorschübe und (mit einigen Änderungen) die Klammern um die for-Schleife.#include<iostream>
undusing namespace std;
PHP - 90 Zeichen
Ich dachte, ich würde Codegolf ausprobieren, also hier ist es, mein erster Versuch - kann wahrscheinlich mehr Golf gespielt werden.
58 Zeichen (mit freundlicher Genehmigung von Ismael Miguel)
Greifen Sie mit auf die Datei zu
quelle
<? for($i=0;$i<4;)echo abs($_GET[n][$i]%10);
der 44 Zeichen lang ist. Zugriff von einem Browser mitfile.php?n[]=xx&n[]=yy&n[]=xy&n[]=yx
. (ungetesteter Code)$_GET
aber es zeigt 57% 10 und ich brauche (5-7)% 10<? for($i=0,$a=$_GET[n];$i<4;++$i)echo abs($a[$i][0]-$a[$i++][1]%10);
. Leider ist es 65 Bytes lang. (habe das$i
letzte Inkrement vergessen ) Oder Sie könnten versuchen , mit einer Länge von 61 Byte<? for($i=0;$i<8;)echo abs($_GET[n][$i++]-$_GET[n][$i++]%10);
auf den Browser zuzugreifenfile.php?n[]=x&n[]=y&n[]=x&n[]=y&n[]=x&n[]=y&n[]=x&n[]=y
.$_GET['n']
. Habe meine Antwort bearbeitet.<? for($i=0,$a=$_GET[n];$i<8;)echo abs($a[$i++]-$a[$i++]);
. Das%10
ist nutzlos und das sieht einfach besser aus. Sie können auch mit darauf zugreifenfile.php?n[]=xyxyxyxy
. Diese Lösung ist 58 Byte lang.Python 3, 60
Eingabe und Ausgabe genau wie angegeben, obwohl keine nachgestellte Zeile ausgegeben wird. Hier zwei interessante Tricks: 1) Ersetzen von zwei Anrufen
int()
durch einen Anrufeval()
und 2) Verwenden vonjoin()
, um zu erhaltena-b
, und Negieren nachb-a
Bedarf. Glücklicherweise gibt Pythons Modulo-Operator positive Werte aus, auch wenn das erste Argument negativ ist!quelle
eval('-'.join(x))
Trick ist brillant.)