Spiel mit angehängten Zahlen
Schreiben Sie eine Funktion / ein Programm, das 2 ganzzahlige Parameter, ganzzahlige Parameter oder ganzzahlige Variablen , eine Startnummer und eine maximale Anzahl von Iterationen akzeptiert. Der Code sollte das folgende Spielbeispiel ausführen, um eine neue Nummer zu konstruieren, und wiederholen, bis die Nummer eine einzelne Ziffer übrig hat. z.B.
3 7 2 = (3 + 7) & (7 + 2) = 10 9
1 0 9 = (1 + 0) & (0 + 9) = 1 9
1 9 = (1 + 9) = 10
1 0 = (1 + 0) = 1
Im Grunde genommen wird jede einzelne Ziffer genommen und dem Nachbarn hinzugefügt, und dann wird auch das Ergebnis der nächsten Addition angehängt.
Die maximale Iterationszahl dient zum Schutz vor Endlosschleifen. Wenn die maximale Anzahl erreicht ist, sollte der Code die letzten 5 Ziffernschritte ausgeben. Die gleiche Ausgabe sollte beim Beenden durch Erreichen einer einzelnen Ziffer erfolgen. Wenn weniger als 5 Schritte aufgetreten sind, geben Sie nur die gültigen Zahlen aus.
Die Ausgabe sollte wie folgt aussehen ( Step: Number
) und die letzten 5 Schritte der abgeschlossenen oder beendeten Schritte enthalten:
func(3541, 50)
würde genau dieses Ausgabeformat erzeugen:
6: 1411
7: 552
8: 107
9: 17
10: 8
func(3541, 5)
würde produzieren:
1: 895
2: 1714
3: 885
4: 1613
5: 774
Die gesamte Berechnung ist:
1: 895
2: 1714
3: 885
4: 1613
5: 774
6: 1411
7: 552
8: 107
9: 17
10: 8
Wenn weniger als 5 Schritte vorhanden sind, drucken Sie einfach die ausgeführten Schritte aus.
Verwenden Sie nur eingebaute Bibliotheken. Die Parameter können von jedem Ort aus eingegeben werden (was für Ihre Sprache am einfachsten ist). Keine Begrenzung für die maximale Ganzzahlgröße, und wenn es Überläufe gibt, lassen Sie es abstürzen.
Da dies aus Puzzle-Sicht nicht allzu schwierig ist, gebe ich bis Sonntag, den 25., 20.00 Uhr (UTC + 8) Zeit, um Einsendungen für die akzeptierte Antwort zu berücksichtigen. An diesem Punkt wird die kürzeste Sprache der Gewinner sein.
BEARBEITEN:
Herzlichen Glückwunsch an Howard, der mit einer Antwort von 48 GolfScript gewonnen hat .
Besonders zu erwähnen ist der 2. Platz Marinus mit einer 66 APL Antwort .
Mein persönlicher Favorit (voreingenommen gegenüber JavaScript) war die Antwort von core1024 .
func(3541, 5)
soll 5 Schritte oder 10 drucken?Antworten:
GolfScript,
4846 ZeichenVielen Dank an Peter Taylor für eine Verbesserung um zwei Charaktere.
Erwartet beide Zahlen auf dem Stapel. Versuchen Sie es online .
Beispiele:
quelle
.,,
und die endgültige Karte in nur umwandeln{': '*}%
.APL (66)
Das linke Argument ist die maximale Iterationszahl und das rechte Argument ist die Startnummer.
Erläuterung:
∆←⍺{
...}⍕⍵
: Übergebe das linke Argument als Zahl und das rechte Argument als Zeichenfolge an die Funktion, die die Liste der Zahlen berechnet, und speichere sie in∆
:(1<⍴⍵)∧⍺>0:
: Wenn die Anzahl der Stellen mehr als 1 beträgt und die Anzahl der verbleibenden Iterationen mehr als0
:⍎¨⍵
: bewerte jede Ziffer2+/
: summiere jedes Paar⍕¨
: formatiere jede Zahl als String∆←,/
: verketten die Zeichenfolgen und speichern in∆
∆,(⍺-1)∇⊃∆
: return∆
, gefolgt vom Ergebnis der Anwendung dieser Funktion∆
mit einer Iteration weniger⋄⍬
: Wenn nicht, geben Sie die leere Liste zurück∆,⍪⍳⍴∆
: Paar jedes Element von∆
mit seinem Index in∆
{
...}/
: für jedes Paar:(⍕⍵),': ',⍺
: gibt einen String mit dem Index:
gefolgt von der Nummer zurück↑¯5↑
: Verwandle die Liste der Zeichenfolgen in eine Matrix, damit sie in separaten Zeilen angezeigt werden, und nimm die letzten 5 ElementePrüfung:
quelle
3 {...} 3541
.:
ersten)Mathematica, 172 Zeichen
Das ist viel zu lang, dank der Funktionsnamen von Mathematica und der hässlichen Handhabung von Zeichenfolgen (das eigentliche "Spiel" besteht nur aus 76 dieser Zeichen), aber hier ist es trotzdem:
Es erwartet die Eingangsnummer in Variable
n
und die maximale Anzahl von Iterationen inm
.Mit weniger Golf:
quelle
Ruby, 106 Zeichen
Ich bin nicht 100% klar in den Eingaberegeln, aber wenn ich
n
einen String nehmen kann, kann ich 5 Zeichen speichern, und wenn ich vordefinierte Variablen verwenden und ein Programm anstelle einer Funktion schreiben kann, kann ich weitere 9 speichern.Erzeugt eine Funktion,
f
die wie folgt aufgerufen werden kann:f[3541, 6]
f[372, 50]
f[9999, 10]
quelle
J -
9692 charIch hatte dies zunächst gelöst, vorausgesetzt, dass alle Spiele beendet waren, und dies kam zurück, um mich während des Testens in den Arsch zu beißen. Das linke Argument ist die Anzahl der Schritte, das rechte Argument ist die Startposition, die als Zahl oder als Zeichenfolge angegeben werden kann.
Dies ist ein bisschen zu golfen und gewunden, um zufriedenstellend zu entgolfen, also sage ich Folgendes:
(<@>:@[(' '-.~[:,@":2+/\"."0@]^:)":)
Dieser Teil führt das Spiel für die angegebene Anzahl von Schritten aus.2+/\
ist verantwortlich für das Hinzufügen jedes Ziffernpaares und<@>:@[
zusammen mit den^:
Steuerelementen, die die Zwischenschritte des Spiels erfassen.(#\(,': '&,)&":"0,)@}.@({.~,i.0:)@:".
Dieser Teil formatiert alle Ergebnisse alsstep: result
.({.~,i.0:)
stellt sicher, dass wir nicht zu viele Schritte machen,#\
gibt die Schrittnummern an und das(,': '&,)&":"0
Bit fügt den Doppelpunkt und das Leerzeichen hinzu.(-@(<.5<.#){.])
Dieser Teil schneidet die relevanten fünf oder weniger Schritte aus der vollständigen Liste aus.<.
bedeutet "Minimum von".Es funktioniert, aber wenn Sie mit einer ausreichend großen Zahl beginnen, werden die Ergebnisse des Spiels schnell größer, was dazu führt, dass J von Ganzzahlen zu ungenauen Doppelwerten wechselt. Hier sind einige Beispiele:
quelle
Javascript 139
144 150Ungolfed
quelle
Perl,
8684Mit Zeilenumbrüchen zur besseren Lesbarkeit:
+ Bearbeiten: Keine Entschuldigung dafür, dass die
-n
Befehlszeilenoption nicht verwendet wurde , und dann lautet die Punktzahl 82 = 81 + 1 :Und wenn ein möglicher Integer-Überlauf in Ordnung ist, ist dies 81 = 80 + 1
quelle
Javascript, 247
278288307ZeichenFormatiert
Bearbeiten 1 : Ternär entfernt
Edit 2 : Umgedrehte Logik zum "Überspringen" des Index 0
Edit 3 : Rekursiver Aufruf überarbeitet.
Geige
quelle
Bash + Coreutils, 115 Bytes
Ausgabe:
quelle
JavaScript (ECMAScript 6 Draft) - 134 Zeichen
Beispiele:
quelle
Javascript, 182 Bytes
quelle
Perl,
166147138129 BytesUngolfed:
Ich hoffe, es ist in Ordnung, dass es einige zusätzliche leere Zeilen druckt, wenn das Ganze weniger als 5 Schritte dauert.
quelle
(('')x5, @o, "$i: $s")
mit(@o, "$i: $s")
undjoin"\n", @o[-5..0]
mitjoin"\n", @o[-5..-1]
. Dann haben Sie 3 Bytes Vorsprung;)Java
524405365 Zeichen [414 Byte]Golf Version:
class A{static int n=0;List<String> s=new ArrayList<>();void c(int b,int r){String d=b+"";if(r==0||b <= 9){int m=s.size();for(int i= m>=5?m-5:0;i<m;i++)System.out.println(s.get(i));return;}String l="";for(int i=0;i<d.length()-1;i++)l+=d.charAt(i)+d.charAt(i+1)-96;s.add(++n+":"+l);c(Integer.valueOf(l),--r);}public static void main(String[] a){new A().c(3541,50);}}
Lesbare Version:
quelle
chatAt
MethodeInteger.valueOf(digits[i] + "") + Integer.valueOf(digits[i + 1] + "");
Sie dies tun(digits[i] + digits[i+1] - 96)
JavaScript 133 Bytes
Ungolfed:
quelle
Java, 341 Zeichen
371 ZeichenFormatiert:
Dank user902383 konnte ich den Code um 30 Zeichen reduzieren, indem ich den String nicht in ein Array aufteilte und -96 anstelle von "Integer.valueOf ()" verwendete.
quelle
class a{public static void main(String[] a) {p(3541, 50);}static void p(int n,int k){Queue<String> q=new LinkedList();int c=0;while(n>9&&c<k){c++;String r="";String p=""+n;for(int i=0;i<p.length()-1;i++)r+=((p.charAt(i)+p.charAt(i+1)-96));n=Integer.parseInt(r);q.add(c+": "+n);if(q.size()>5)q.remove();}for(String s:q){System.out.println(s);}}}
Dart,
602588 BytesDart ist wahrscheinlich eine der schlechtesten Sprachen, um dies zu tun ... Ich muss einen besseren Weg finden, um dies zu tun.
Sowieso ist hier mein Eintrag:
Eingabe über Konsole
Und die ungolfed, leicht unminimierte Version:
quelle
PERL
135 129/125125/121 BytesEs hat den gleichen Fehler wie Tals Antwort
Bearbeiten Sie 129 Bytes als Funktion:125 Bytes als Funktion:125 Bytes als Konsolenskript (ohne den Hashbang):121 Bytes als Konsolenskript (ohne den Hashbang):
Erweitert:
Testen Sie mit
c(372,4);
:Testen Sie mit
c(3541,50);
:quelle
C # - 269
Lesbar:
Verwendung:
Ausgabe:
quelle
Cobra - 363
Ein ziemlich deprimierendes Ergebnis ... aber hey, ich habe immer noch Java besiegt.
Es sollte immun gegen Integerüberläufe für die praktischen Testfälle sein.
quelle
Python 2.7,
174173158 ZeichenVerwenden Sie viele Zeichenfolgen, um die Aufgabe zu erledigen.
Python 2.7, 155 Zeichen
Version, die eine Funktion definiert
Leicht ungolfierte Version:
quelle
Haskell, 154
Beispielverwendung:
Um es lesbarer zu machen, benutze
putStr
:quelle
putStr $ 3541#50
und vergleichen Sie es mit dem Beispiel des OP. Ansonsten bin ich froh, dass hier ein Haskell-Typ ist.Groovy -
191182 ZeichenBasierend auf der auf Groovy 2.2.1 portierten Lösung von Thomas Rüping :
Ausführung und Ausgabe:
Ungolfed:
quelle
** C
186179174 **Etwas weniger Golf (Minigolf?)
Weisen Sie einfach genügend Speicherplatz zu, um fünf Ergebnisse zyklisch zu speichern. Die äußere Schleife läuft weiter, bis wir das Limit erreichen oder eine einzelne Ziffer erreichen. Die innere Schleife addiert die letzte Ziffer der Zahl zur letzten Ziffer von 1/10 der Zahl und addiert diese, multipliziert mit der entsprechenden Potenz von 10, zum Ergebnis. Teilen Sie die erste Zahl durch 10 und wiederholen Sie den Vorgang, um die Gesamtsumme zu erhalten. Dann drucken Sie bis zu den letzten fünf Ergebnissen aus.
Die nächste Herausforderung besteht darin, zu sehen, ob ich mich genug rasieren kann, um einige Skriptsprachen beim Golfspielen zu übertreffen.
Bearbeiten: Kompiliert jetzt mit Warnung, aber fünf Zeichen werden durch Entfernen der "Void" -Deklaration entfernt
quelle
C # -
309330320306 BytesGolf Version:
Verbrauch: F (3541,50);
Ungolfed-Version zur besseren Lesbarkeit:
Verbesserungsvorschläge sind immer willkommen! ;)
Bearbeiten: String.Empty wurde entfernt und durch "" ersetzt, um 10 Bytes zu sparen.
Edit 2: Danke an malik für den Tipp mit den Strings!
quelle
.ToCharArray()
. A string = char array.ToString()
, zu tun+""