Das Puzzle
Ein kleines Rätsel, das ich während meiner Schulzeit gehört habe, ging ungefähr so ...
- Der Fragesteller würde mich bitten, ihm eine Nummer zu geben;
- Wenn der Fragesteller die Zahl hört, führt er wiederholt eine Art Transformation durch (zum Beispiel könnte er sagen, zehn ist drei ), bis er schließlich die Zahl 4 erreicht (an diesem Punkt würde er mit vier abschließen, ist magisch ).
- Jede Zahl scheint schließlich in vier umwandelbar zu sein, egal was passiert.
Ziel war es, die Transformationsfunktion herauszufinden und dieses Rätsel dann selbst zuverlässig zu lösen.
Die Lösung
Die Transformationsfunktion bei jedem Schritt war zu
- Nehmen Sie die betreffende Nummer,
- Zählen Sie die Anzahl der Buchstaben in der englischen Wortdarstellung, ignorieren Sie einen Bindestrich oder Leerzeichen oder "und" (z. B. "zehn" enthält 3 Buchstaben, "vierunddreißig" enthält 10 Buchstaben, "einhundertdreiundvierzig"). enthält 20 Buchstaben).
- Geben Sie diese Anzahl von Buchstaben zurück.
Für alle Zahlen, die ich jemals testen wollte, konvergiert dies gegen 4. Da "vier" auch vier Buchstaben enthält, würde es hier eine Endlosschleife geben; Stattdessen wird es lediglich konventionell als Magie bezeichnet , um die Sequenz zu beenden.
Die Herausforderung
Ihre Herausforderung besteht darin, einen Code zu erstellen, der eine Zahl vom Benutzer liest und dann Zeilen druckt, in denen die Transformationsfunktion wiederholt angewendet wird, bis "Vier ist Magie" erreicht ist.
Speziell:
- Lösungen müssen vollständige Programme an und für sich sein. Sie können nicht nur Funktionen sein, die einen Zahlenfaktor in der Eingabe berücksichtigen.
- Die Eingabe muss von der Standardeingabe gelesen werden. (Piping von "Echo" oder die Verwendung der Eingangsumleitung ist in Ordnung, da dies auch von stdin geht)
- Die Eingabe sollte in numerischer Form erfolgen.
- Für jede Anwendung der Transformationsfunktion sollte eine Zeile gedruckt werden:
a is b.
wobei a und b numerische Formen der Zahlen in der Transformation sind. - Punkte (Perioden) sind erforderlich!
- Die letzte Zeile sollte natürlich sagen ,
4 is magic.
. - Der Code sollte für alle Zahlen von 0 bis 99 eine korrekte Ausgabe erzeugen .
Beispiele:
> 4
4 is magic.
> 12
12 is 6.
6 is 3.
3 is 5.
5 is 4.
4 is magic.
> 42
42 is 8.
8 is 5.
5 is 4.
4 is magic.
> 0
0 is 4.
4 is magic.
> 99
99 is 10.
10 is 3.
3 is 5.
5 is 4.
4 is magic.
Der Gewinner ist die kürzeste Einsendung nach Anzahl der Quellcodezeichen, was ebenfalls korrekt ist .
BONUS
Sie können auch versuchen, bei jeder Anwendung der Transformationsfunktion eine Version des Codes zu schreiben, die die ENGLISCHEN NAMEN für die Zahlen ausgibt. Die ursprüngliche Eingabe ist immer noch numerisch, aber die Ausgabezeilen sollten die Wortform der Zahl haben.
(Doppelter Bonus für das Zeichnen von Formen mit Ihrem Code)
(EDIT) Einige Klarstellungen:
- Ich möchte, dass das Wort in allen zutreffenden Fällen auf beiden Seiten erscheint, z
Nine is four. Four is magic.
- Die Kapitalisierung ist mir jedoch egal. Und es ist mir egal, wie Sie die Wort-Token trennen, obwohl sie getrennt werden sollten:
ninety-nine
ist in Ordnung,ninety nine
ist in Ordnung,ninetynine
ist nicht in Ordnung.
Ich betrachte diese Kategorie als separate Kategorie für den Bonuswettbewerb in Bezug auf die Herausforderung. Wenn Sie sich also dafür entscheiden, machen Sie sich keine Sorgen, dass Ihr Code länger als die numerische Version ist.
Sie können gerne eine Lösung für jede Version einreichen.
quelle
Antworten:
GolfScript -
10196939291909486 Bytes90 → 94
: Feste Ausgabe für Vielfache von 10 .94 → 86
: Umstrukturierter Code. Verwenden der Basis 100 zum Entfernen nicht druckbarer Zeichen.86 → 85
: Kürzere Besetzung der Saite.quelle
"magic."
, er fasst es ziemlich gut zusammen.d
wird vom)
as extrahiert100
und als Radix für die Basisumwandlung verwendet.Perl, ungefähr 147 char
Locker basierend auf der Lösung von Platinum Azure:
quelle
pop
ohne Argumente. Außerhalb eines Unterprogramms wirdpop
entfernt und der letzte Wert, der@ARGV
die Liste der Argumente ist, an das Perl-Programm zurückgegeben. Es könnte genauso gut durch ersetzt werdenshift
, aber das fügt weitere 2 Zeichen hinzu. Siehe: p3rl.org/pop'.'
, das 2 für\n
oder 1 ist, wenn Sie Leerzeichen im'. '
(Leerzeichen ist das Zeilenumbruchliteral) zählenCommon Lisp 157 Zeichen
Neue konformere Version, die jetzt Formulareingaben liest und Leerzeichen und Bindestriche ignoriert:
In lesbarer Form:
Und einige Testläufe:
Und die Bonusversion mit 165 Zeichen:
Geben
quelle
Python 2.x, 144
150154166ZeichenDies trennt die Zahl in Zehner und Einsen und fasst sie zusammen. Die unerwünschte Eigenschaft des pseudo-ternären Operators
a and b or c
,c
die zurückgegeben wird, wennb
0 ist, wird hier missbraucht.Die vorherige naive Version (150 Zeichen). Codieren Sie einfach alle Längen als Ganzzahl.
quelle
n,"is",p,"."
? Ich denke, Sie speichern noch einige Zeichen, wenn ich richtig zähle).
.int()
, sagt etwas aus derstruct
oderbase64
Module ...C - mit Zahlenwörtern
445431427421399386371359 *356354 †348347 ZeichenDas ist es. Ich glaube nicht, dass ich das kürzer machen kann.
Alle Zeilenumbrüche dienen der Lesbarkeit und können entfernt werden:
Unten ist es etwas unminimiert, aber immer noch ziemlich schwer zu lesen. Weiter unten finden Sie eine besser lesbare Version.
Erweitert und kommentiert:
Über die codierte Zeichenfolge am Anfang
Die Namen der Zahlen werden nach einem sehr einfachen Schema komprimiert. Häufig verwendete Teilzeichenfolgen werden durch einstellige Indizes im Namensarray ersetzt. Eine "Nachschlagetabelle" mit zusätzlichen Namenseinträgen wird am Ende für Teilzeichenfolgen hinzugefügt, die im ersten Satz nicht vollständig verwendet wurden. Suchvorgänge sind rekursiv: Einträge können auf andere Einträge verweisen.
Der komprimierte Name für 11 lautet beispielsweise
elM
. Dieprint()
Funktion gibt die Zeichene
undl
(Kleinbuchstaben 'L', nicht Nummer '1') wörtlich aus, findet dann aber dieM
und ruft sich selbst mit dem Index des 29. Eintrags auf (ASCII 'M' - ASCII '0'). in die Nachschlagetabelle. Diese Zeichenfolge wirdevL
also ausgegebene
undv
ruft sich dann erneut mit dem Index des 28. Eintrags in der Nachschlagetabelle auf, deren
wörtlich ausgegeben wird. Dies ist nützlich , weilen
auch in verwendet wird ,eL
füreen
(verwendet nacheight
ineighteen
), die verwendet wird ,tO
fürteen
(verwendet für jeden anderen-teen
Namen).Dieses Schema führt zu einer ziemlich signifikanten Komprimierung der Nummernnamen, während zum Dekomprimieren nur eine geringe Menge Code erforderlich ist.
Die Kommas am Anfang und Ende der Zeichenfolge berücksichtigen die vereinfachte Art und Weise, wie Teilzeichenfolgen in dieser Zeichenfolge gefunden werden. Wenn Sie hier zwei Zeichen hinzufügen, werden später weitere Zeichen gespeichert.
Über den Missbrauch von
main()
argv
Wird ignoriert (und daher in der komprimierten Version nicht deklariert), wird der Wert von argc ignoriert, aber der Speicher wird wiederverwendet, um die aktuelle Nummer zu speichern. Dies erspart mir nur die Deklaration einer zusätzlichen Variablen.Über den Mangel an
#include
Einige werden sich beschweren, dass das Weglassen
#include <stdio.h>
Betrug ist. Es ist überhaupt nicht. Das angegebene ist ein völlig legales C-Programm, das auf jedem mir bekannten C-Compiler korrekt kompiliert wird (allerdings mit Warnungen). Da keine Prototypen für die stdio-Funktionen vorhanden sind, geht der Compiler davon aus, dass es sich um zurückgegebene cdecl-Funktionen handeltint
, und vertraut darauf, dass Sie wissen, welche Argumente übergeben werden müssen. Die Rückgabewerte werden in diesem Programm sowieso ignoriert und sind alle cdecl-Funktionen ("C" -Aufrufkonvention), und wir wissen tatsächlich, welche Argumente übergeben werden müssen.Ausgabe
Die Ausgabe erfolgt wie erwartet:
* Die vorherige Version hat die Markierung in zwei Teilen der Spezifikation verfehlt: Sie hat keine Null verarbeitet und statt stdin Eingaben über die Befehlszeile vorgenommen. Durch die Behandlung von Nullen wurden Zeichen hinzugefügt, aber durch die Verwendung von stdin anstelle von Befehlszeilenargumenten sowie einiger anderer Optimierungen wurde die gleiche Anzahl von Zeichen gespeichert, was zu einer Wäsche führte.
† Die Anforderungen wurden geändert, um zu verdeutlichen, dass das Zahlenwort auf beiden Seiten von "ist" gedruckt werden sollte. Diese neue Version erfüllt diese Anforderung und implementiert einige weitere Optimierungen, um die erforderliche zusätzliche Größe (mehr als) zu berücksichtigen.
quelle
J, 107
112Zeichen(Newline nur zur besseren Lesbarkeit)
Verwendung und Ausgabe:
quelle
T-SQL, 413
451499Zeichen(Nicht, dass ich ernsthaft vorschlage, dass Sie dies tun würden ... eigentlich wollte ich nur einen CTE schreiben)
Benutzen:
Kehrt zurück
quelle
CREATE FUNCTION d(@ int) RETURNS int AS BEGIN Declare @l char(9),@s char(50) Select @l='066555766',@s='03354435543668877987' if @=0 return 4 if @<20 return 0+substring(@s,@+1,1)return 0+substring(@l,@/10,1)+substring(@s,@%10+1,1)END
Java (mit Boilerplate),
308290286282280 ZeichenIch bin sicher, Groovy würde viel davon loswerden.
Erläuterung und Formatierung (alle Kommentare, Zeilenumbrüche und führenden / nachfolgenden Leerzeichen wurden in der Anzahl entfernt):
Ziemlich einfach, aber
Bearbeiten: Verwenden Sie kein Hex mehr, dies sind weniger Tastenanschläge
quelle
String[]a
anstelle von verwendenString[] a
.Windows PowerShell: 152
153184Bytebasierend auf der vorherigen Lösung, mit mehr Einfluss von anderen Lösungen
quelle
$input
müssen jedoch erhalten bleiben, da Sie einen Enumerator nicht direkt aufrufen könnenint
. es funktioniert, wenn manstring
zuerst durchgeht :-)C, 158 Zeichen
(Ursprünglich basierend auf Vlads Python-Code, hat er sich einen Trick aus Tom Sirgedas 'C ++ - Lösung geliehen, um ein paar weitere Zeichen herauszuquetschen.)
erweiterte Version:
quelle
Python, 129
133137148ZeichenZum Aufwärmen ist hier meine erste Version (verbessert einige Zeichen gegenüber dem vorherigen besten Python).
PS. Nach ein paar Redaktionen ist es jetzt ungefähr zwanzig Zeichen kürzer:
quelle
C #: 210 Zeichen.
Gequetscht:
Erweitert:
Tricks, die dieser Ansatz verwendet:
Console.
zu erstellenC.
?:
) anstelle vonif/else
.\n
mitWrite
Escape - Code stattWriteLine
Write
Funktionsaufrufs zu ermöglichenquelle
int[] z
wäre kürzer, da es das nicht brauchtnew[]
"magic"
zuobject
, wäre implizit rufenToString()
aufy
durch Zugabe""
. Aber weil es+
eine höhere Priorität hat als?:
, müssen Sie es in den wahren Teil anstatt in den falschen Teil setzen :x!=4?y+"":"magic"
.Perl: 148 Zeichen
(Perl:
233181212206200199198185179149148 Zeichen)r
ist nicht erforderlich.Lassen Sie uns diesen Ball mit einem bescheidenen Versuch in Perl ins Rollen bringen.
Tricks:
Zu viele!
quelle
@u=split$x,'43350435543668877988';
Ihre Kommas verwenden unnötige 19 Zeichen, dieundef
bei jedem Zeichen auf Teilungen aufgeteilt werden. Ich verwende sie$x
als undefinierte Variable, um "undef" - total zu ersetzen Einsparungen: 11 Zeichen. Wenn Sie dasm
In entfernenchomp
, wird ein weiterer Charakter von Ihrer Punktzahl abgezogen.sub r
ganz verlieren - Sie verwenden es nur einmal und können alles durch ein einziges verschachteltes Ternär ohne Parens ersetzen. Meine Version ist derzeitJavaScript 1.8 (SpiderMonkey) - 153 Zeichen
Verwendung:
echo 42 | js golf.js
Ausgabe:
Mit Bonus - 364 Zeichen
Ausgabe:
quelle
Haskell, 224
270ZeichenUnd wenig lesbarer -
quelle
C ++ Stdio-Version, minimiert: 196 Zeichen
C ++ Iostreams-Version, minimiert: 195 Zeichen
Original, nicht verkleinert: 344 Zeichen
quelle
#define
das noch kürzer sein würde, da es mehrere Token ersetzen könnte.printf("is magic".\n)
=>puts
.printf("%d",p)
=>puts(atoi(p))
. Nicht nur kürzer, sondern auch schneller.while(p!=4)
könnte verkürzt werden aufwhile(p-4)
. Ein ganzer Charakter, ich weiß, aber immer noch. :-)Delphi: 329 Zeichen
Einzeilige Version:
Formiert:
Wahrscheinlich Platz für etwas mehr Quetschen ... :-P
quelle
C #
314286283274289273252 Zeichen.Gequetscht:
Normal:
Edit Dykam: Hat einige sorgfältige Einfügungen und Änderungen vorgenommen:
object
von geändertstring
"magic"
.o
, damit ichbreak
diefor
Schleife außerhalb verschieben kann , was zu einer führtdo-while
.o
Zuweisung sowie diev
Zuweisung, wobei weiterhin die Berechnung derl
Argumente in die Funktionsargumente insgesamt eingefügt wird , wodurch die Notwendigkeit fürl
. Auch die Zuordnung vonm
.int[] x
,int[]x
ist auch legitim.using System.Linq
war zu viel, um dies zu einer Verbesserung zu machen.Bearbeiten 2 Dykam Das int-Array wurde in ein char-Array / einen char-String geändert und die richtigen Arithmetiken hinzugefügt, um dies zu korrigieren.
quelle
Lua, 176 Zeichen
oder
quelle
C - ohne Zahlenwörter
180175*172167 ZeichenAlle Zeilenumbrüche dienen der Lesbarkeit und können entfernt werden:
Etwas unminimiert:
* Die vorherige Version hat die Markierung in zwei Teilen der Spezifikation verfehlt: Sie hat keine Null verarbeitet und statt stdin Eingaben über die Befehlszeile vorgenommen. Der Umgang mit null hinzugefügten Zeichen, aber die Verwendung von stdin anstelle von Befehlszeilenargumenten spart noch mehr, was zu einer Nettoeinsparung führt.
quelle
Perl,
123122 ZeichenIch habe gerade festgestellt, dass es nicht erforderlich ist, in STDOUT auszugeben. Geben Sie stattdessen in STDERR aus und deaktivieren Sie ein anderes Zeichen.
Und eine Version, die buchstabierte Zahlen zurückgibt:
279278276280 ZeichenDies entspricht zwar der Spezifikation, ist jedoch nicht zu 100% gut formatiert. Nach Zahlen, die mit Null enden, wird ein zusätzliches Leerzeichen zurückgegeben. Die Spezifikation sagt:
Das ist allerdings irgendwie wieselhaft. Eine korrektere Version bei
282281279283 Zeichenquelle
Python:
quelle
N = input()
(oderraw_input()
) und eliminierensys
.she-bang
in einer Code-Golf-Antwort sehe ;-)C ++, 171 Zeichen (#include weggelassen)
quelle
#include
da angenommen wird, dass die Funktionen nurint
Parameter annehmen . Sie können sogar einen Schlaganfall speichern, indem Siemain
zurückkehrenint
.Ruby, 164 Zeichen
entschlüsselt:
quelle
Lua
185190199Perioden hinzugefügt, io.read hinzugefügt, () beim letzten Druck entfernt
mit Zeilenumbrüchen
quelle
n=io.read()
(+11 Zeichen), um die Regel zum Lesen der Nummer von der Standardeingabe zu erfüllen. Wenn Sieprint('4 is magic.')
zu ändern ,print'4 is magic.'
werden 2 Zeichen gespeichert. Durch Entfernen;
nach)
wird 1 Zeichen gespeichert. Dieprint
Verwendung von Kommas scheint zu schummeln, aber die Spezifikation ist unklar. Könnte es auch ändernprint(n,'is',m,'.')
, um 2 Zeichen zu sparen.PHP-Code
//////////// testen ////////////////
////// Ergebnisse /////////
quelle
$l='4335443554366887798866555766';for($b=(int)fgets(fopen('php://stdin','r'));($a=$b)-4;){$b=$a<20?$l[$a]:$l[18+$a/10]+($a%10?$l[$a%10]:0);echo"$a is $b.\n";}echo"4 is magic.\n";
Perl - 130 Zeichen
5.12.1 (130 Zeichen)
1211231321361405.10.1 (134 Zeichen)
125127136140144Geschichte verändern:
20100714:2223
- Änderung auf Aufmerksamkeit von Mobrule zurückgesetzt , aber($_%10&&$u[$_%10])
→(($_%=10)&&$u[$_])
, das ist die gleiche Anzahl von Zeichen, aber ich habe es getan, falls jemand einen Weg sehen könnte, es zu verbessern20100714:0041
-split//,'...'
→'...'=~/./g
20100714:0025
-($_%10&&$u[$_%10])
→$u[$_%10]
20100713:2340
-while$_
→until/\D/
+ unnötige Klammern entfernt20100713:xxxx
-$=<>;chop;
→$_=pop;
- mit freundlicher Genehmigung von mobruleHinweis: Ich war es leid, die Antworten anderer in Kommentaren zu verbessern, daher bin ich jetzt gierig und kann hier nur meine Änderungen hinzufügen :) Dies ist eine Abspaltung von Platinum Azures Antwort - zum Teil Hobbs , Mobrule und Platinum Azure .
quelle
$_%10&&...
Konstrukt losgeworden sind , haben Sie die Spezifikation für Eingaben 20,30,40, ...ARGV
,STDIN
echo bar | xargs perl foo.pl
Schamloses Perl mit Zahlenwörtern (329 Zeichen)
Ziemlich direkt aus dem C-Code von P Daddy angepasst, mit einigen Verbesserungen,
p()
um das Gleiche mit Perl-Primitiven anstelle von C-Primitiven und einem meist neu geschriebenen Mainloop zu erreichen. Siehe seine für eine Erklärung. Zeilenumbrüche sind alle optional.Randnotiz: Es ist schade, dass Perl
print
nur true / false zurückgibt. Wenn es eine Zählung zurückgeben würde, würde es mir 7 Schläge ersparen.quelle
Ruby, 141 Zeichen:
quelle
quelle