Hintergrund
Sie arbeiten für einen Brettspielhersteller und müssen für ein Spiel Holzkacheln mit den Zahlen von 0 bis n herstellen . Einige Kacheln wären jedoch ohne weiteres nicht mehr zu unterscheiden, z . B. 6und 9. Um dies zu vermeiden, müssen Sie Zahlen, die mit anderen (und nur mit diesen) verwechselt werden können, mit einem eindeutigen Punkt versehen, z. B. mit Kacheln wie 9.oder 6089..
Leider müssen Sie dafür ein altes, aber programmierbares Holzstichgerät verwenden, dessen Oberfläche so kaputt ist, dass Sie jedes Zeichen des Programms in einem unbeschreiblich langwierigen Prozess von Hand codieren müssen. Zum Glück versteht das Gerät jede vorhandene Programmiersprache. Sie suchen also das kürzeste Programm, das solche Kacheln druckt.
Aktuelle Aufgabe
Schreiben Sie das kürzeste Programm, das:
- Übernimmt eine positive ganze Zahl n als Eingabe. Wie die Eingabe gelesen wird, liegt bei Ihnen.
- Gibt jede der Zahlen von 0 bis n ( einschließlich 0 und n ) genau einmal in einer Reihenfolge Ihrer Wahl aus, die durch ein einzelnes Leerzeichen (einschließlich Zeilenvorschub) getrennt ist. Die Zahlen sind ohne führende Nullen auszudrucken.
- Fügt einen Punkt (.) An jede Zahl an, die sich bei Drehung um π (180 °) in eine andere gültige Zahl verwandelt, auch wenn diese Zahl größer als n ist. Die 0 und 8 Ihrer Schrift sind rotationssymmetrisch und die 9 ist eine gedrehte 6. Die 2 und 5 unterscheiden sich bei der Drehung. Die 1 ist nicht rotationssymmetrisch. Zahlen mit führenden Nullen sind ungültig.
Beispiele
Jede der folgenden Zahlen muss genau so gedruckt werden:
2
4
5
6.
8
9.
16
60
66.
68.
69
906
909.
8088.
9806.
9886
9889.
60
sein60.
?8088.
in Ihren Beispielen eine nicht rotationssichere ZahlAntworten:
Pyth - 34
38Ich muss mich bei @ Sp3000 dafür bedanken, dass ich 4 Bytes entfernt habe. Ich hatte ursprünglich eine zusätzliche Überprüfung,
&@JK
die sicherstellte, dass die Nummer eine 6 oder 9 enthielt, aber nachdem ich die Antworten vor dem Posten durchgesehen hatte, las ich seine Antwort und bemerkte, dass meine identische Übersetzung und Umkehrung dies bereits erledigten.Vielen Dank auch an @isaacg für den Hinweis, dass Strings iterabel sind und Sie Set-Operationen für sie verwenden können. Auch zum Erstellen des aktuellen Codes;)
Erläuterung:
quelle
K
und verwenden müssenJ
- verwenden Sie stattdessen einfach Zeichenfolgen. UmschaltenK
auf <Graviszeichen> 69 undJ
auf <Graviszeichen> N spart ein paar Zeichen, wie sie inliningK
im resultierenden Programm. Das Kürzeste, was ich mit dieser Technik erreichen konnteVhQJ``N+J*\.&nJX_J``69``96&eN!-J"0689
, waren 34 Zeichen. (Zwei Backticks sind wirklich eins.)hell`o wo`rld
_
vor dem zu haben`96
.CJam,
46444342 BytesIch denke, es gibt Raum für Verbesserungen.
Teste es hier.
Erläuterung
quelle
n
in Eingabe.CJam,
46 45 4342 BytesIch denke, es kann ein bisschen mehr golfen werden.
Nimmt
n
von STDIN.Probieren Sie es hier online aus
quelle
APL 66
Erläuterung:
Probieren Sie es auf tryapl.org
Beachten Sie, dass im Online-Interpreter die ⍎-Funktion nicht funktioniert, sodass ich sie durch 2⊃⎕VFI ersetzen musste, was in diesem Fall dasselbe tut, die Zahl ausführt und mit einem String zurückgibt.
quelle
⊃,/
oder,/
kannst du auch eine∊
vorne verwenden.Perl 5, 53 Bytes
Online-Demo.
Verwendet die Perl 5.10+
say
-Funktion und muss daher mitperl -M5.010
(oderperl -E
) ausgeführt werden, um sie zu aktivieren. (Siehe diesen Meta-Thread. ) Liest die Eingabe von stdin und druckt nach stdout.quelle
Python 2,
130116113 BytesDefiniert eine Funktion,
f
die die Zahlen in aufsteigender Reihenfolge an STDOUT ausgibt.Diesmal dachte ich, ich würde mit
.translate
:) ein Blatt aus @ feersums Buch ziehenErweitert:
Vorherige Lösung:
Vielen Dank an @xnor, dass er mir den
.replace
Trick vor einiger Zeit gezeigt hat.quelle
(u''+S[::-1])
anstelle von verwendenunicode(S[::-1])
. Wenn Sie denprint
und den rekursiven Anruf vertauschen , werden die Nummern in aufsteigender Reihenfolge ausgegeben.u""+
dass es tatsächlich funktionieren würdeC #,
343309 ZeichenViel zu lang, aber trotzdem:
Wie funktioniert es? Um der Zahl einen Punkt hinzuzufügen, müssen die folgenden Anforderungen erfüllt sein:
0
,8
,6
und9
.6
s und9
s hat, undc
= die Zahl mit allen6
s ersetzt mit9
s,c
==c
,Die Zahlen sind durch ein Leerzeichen getrennt.
Code mit Einzug:
quelle
M (MUMPS) -
7270Die meisten in M integrierten Befehle und Funktionen haben abgekürzte Versionen. Ich habe die vollständigen Namen unten verwendet.
READ n
- Lesen Sie eine Zeichenfolge von der Tastatur und speichern Sie sie inn
.FOR i=0:1:n
- Schleife von Null bisn
,i
jedes Mal um 1 inkrementierend . (Der Rest der Linie bildet den Körper der Schleife.)WRITE !,i
- Drucken Sie eine neue Zeile, gefolgt vom Wert voni
.SET r=$TRANSLATE($REVERSE(i),69,96))
- Kehren Sie umi
, ersetzen Sie Neunen durch Sechser und Sechser durch Neunen und speichern Sie diese inr
.WRITE:r=+r*r'=i*'$TRANSLATE(i,0689) "."
:
- Bezeichnet einen nachbedingten Ausdruck, sodass derWRITE
Befehl nur ausgeführt wird, wennr=+r*r'=i*'$TRANSLATE(i,0689)
er einen Wahrheitswert ergibt.r=+r
- Stellen Sie sicher, dassr
keine führende Null vorhanden ist. Der unäre+
Operator konvertiert eine Zeichenfolge in eine Zahl, die führende Nullen entfernt, falls vorhanden.*
- Multiplikationsoperator. M hat keine Operationsreihenfolge; Alle binären Operatoren werden in der Reihenfolge ausgewertet, in der sie von links nach rechts erscheinen.r'=i
- Überprüfen Sie, ob diesi
nicht mit der gespiegelten Version übereinstimmtr
.'$TRANSLATE(i,0689)
- Entfernen Sie alle Nullen, Sechser, Achter und Neuner voni
und prüfen Sie, ob nichts mehr übrig ist. ('
Ist der logische Negationsoperator.)"."
- Schließlich das Argument zumWRITE
Befehl (eine Literalzeichenfolge).Bearbeiten: Durch Missbrauch des Multiplikationsoperators etwas kürzer. Vorherige Version:
quelle
APL, 53 Zeichen
∊{⍵,'. '↓⍨∨/(3≡⊃i)(5∊i),⍵≡'9608x'[i←⌽'6908'⍳⍵]}∘⍕¨0,⍳
quelle
C # 205
209C # muss nicht so lang sein ...
mehr oder weniger ein Port meiner JavaScript-Antwort
Ungolfed
quelle
Ruby, 81
Die Eingabe erfolgt über die Befehlszeile.
Erzeugt eine Liste von
String
s von0
bisn
. Es durchläuft sie und druckt sie. Es wird ein Punkt angehängt, wenn alle Bedingungen erfüllt sind:6
s durch9
s ergibt nicht das Original0
,6
,8
und9
0
quelle
JavaScript (ES6) 101
104 106 109Eine Funktion mit n als Argument, die über console.log ausgegeben wird.
Bearbeiten mit% 10, um auf führende 0 zu testen.
Bearbeiten 2-
for
Reorganisation. Ich benötige kein Array-Verständnis.Bearbeiten 3 hat (erneut) die Prüfung auf führende 0 geändert
Ungolfed und einfacher zu testen
Ausgabe
quelle
[]
? Ich suche eine Dokumentation, da ich diese bisher nur aus Python kannte.Bash + Coreutils, 105
Prüfung:
quelle
sed, 467
Länger als C # ...
Ich habe dies so ziemlich abgeschlossen, als @ edc65 darauf hinwies, dass Antworten die Zahlen 0-n und nicht nur n verarbeiten müssen. Das Hinzufügen des sed-Codes zum Inkrementieren von 0-n fügt VIEL mehr Code hinzu, da diese Aufgabe für arithmetiklose sed ungeeignet ist.
Entsprechend dem OP spielt die Bestellung keine Rolle, daher arbeiten wir von n nach 0 abwärts.
Ausgabe:
quelle
AWK: 120
Lesen Sie den n-Wert von stdin.
Prüfung:
quelle
Rebol - 195
Ungolfed + einige Anmerkungen:
quelle
bc, 158
Nachdem ich dies rein in sed mit allen String- und Regex-Operationen ohne native Arithmetik getan hatte , war ich gespannt, wie dies andersherum aussehen würde, dh mit allen arithmetischen und logischen Operationen und ohne String / Regex:
Die Ausgabe wird in absteigender Reihenfolge sortiert.
Ausgabe:
quelle
Python - 152
quelle
"."if a[i]else"" -> "."*a[i]
,int(raw_input()) -> input()
(was eigentlich nur isteval(raw_input())
)str(i)
mit`i`
. (2) Sie verwenden esa
nur einmal. Warum sollten Sie es einer Variablen zuweisen ?str(i)
mehrere Male. Welches kann ich ersetzeni
?i
, aberi
mit Backticks, das geht auchrepr(i)
. Sie können es anstelle vonstr(i)
überall verwenden. Wenn Sie es jedoch sostr(i)
oft haben, kann es kürzer sein, es einer Variablen zuzuweisen und diese zusätzlich zur Verwendung von Backticks zu verwenden. (iex=`i`; (do stuff with x)
)JavaScript -
168 129 119 113 111108Oder lesbare Version:
Ich bin nicht sehr glücklich mit dem Regex, irgendwelche Ideen?
Edit : Gelernt ordentlicher Trick mit
~
undfor (... of ...)
von @ edc65Edit2 : Reorganisierte Bedingungen
Edit3 : Angewandte Vorschläge von @ edc65
quelle
i=n+"";for(c of i)
=>for(c of i=n+"")
2 Bytes speichernc==6?A:B
=>c!=6=>B:A
=>c-6?B:A
for(c of i=n+"")
ist ziemlich logisch, wenn ich es sehe, aber ich würde nicht daran denken.c-6?B:A
Gott bewahre, dass ich das jemals in den Produktionscode geschrieben habe05AB1E ,
38373029 BytesProbieren Sie es online aus.
Erläuterung:
Zusätzliche Erklärung für einige Teile:
quelle
Perl - 84
quelle
Powershell,
111102 BytesErklärtes Testskript:
Ausgabe:
quelle
Stax , 27 Bytes
Führen Sie es aus und debuggen Sie es
Ausgepackt, ungolfed und kommentiert sieht es so aus.
Führen Sie dieses aus
quelle