Schreiben Sie ein Programm, um eine aus 9 Ziffern bestehende Zahl zu finden, in der jede der Ziffern von 1 bis 9 nur einmal vorkommt. Diese Nummer muss auch diese Teilbarkeitsanforderungen erfüllen:
- Die Zahl sollte durch 9 teilbar sein.
- Wenn die am weitesten rechts stehende Ziffer entfernt wird, sollte die verbleibende Zahl durch 8 teilbar sein.
- Wenn die am weitesten rechts stehende Ziffer der neuen Nummer entfernt wird, sollte die verbleibende Nummer durch 7 teilbar sein.
- Und so weiter, bis es nur noch eine Ziffer gibt (die notwendigerweise durch 1 teilbar ist).
Kredit Dávid Németh
Antworten:
CJam - 26
Es ist zufällig, funktioniert aber ziemlich schnell mit dem Java-Interpreter . Mit dem Online-Dolmetscher kann es einige Minuten dauern .
Erläuterung:
1
Push 1 (wird später erklärt){…}g
ist eine Do-While-Schleife,;
die einen Wert aus dem Stapel entfernt (anfangs die 1, mit der wir begonnen haben).9,
Das Array [0 ... 8]:)
erhöht die Array-Elemente, was zu [1 ... 9]_
dupliziert das Array,mr
mischt das Arrays
in String-0@
Pushs 0 und bringt dann die andere Kopie des Arrays nach oben.{…}/
Für jede Schleife (über die Zahlen 1 ... 9) wird_
die aktuelle Nummer dupliziert (nennen wir es "k"). )3$
kopiert die numerische Zeichenfolge vom Stapel,<i
erhält die Teilzeichenfolge mit den ersten k Zeichen und konvertiert sie dann in ganzzahlige\%
Swaps mit der anderen Kopie von k. Anschließend erhält der Rest (% k)+
den Rest zum vorherigen Wert auf dem Stapel (anfänglich 0 von oben) )Zu diesem Zeitpunkt haben wir die numerische Zeichenfolge auf dem Stapel, gefolgt von einer 0, wenn die Zahl allen Anforderungen entspricht (dh alle verbleibenden waren 0), oder andernfalls einem Wert ungleich 0.
Die Oberseite des Stapels wird zur Do-While-Schleifenbedingung. Es wird geknallt und die Schleife wird fortgesetzt, wenn die Bedingung erfüllt ist.
Wenn wir die Lösung gefunden haben, ist die Bedingung 0 (falsch), die Schleife endet und der Rest des Stapels (die numerische Zeichenfolge) wird gedruckt.
Wenn dies nicht die Lösung ist, ist die Bedingung der Wert ungleich 0 (true) und die Schleife wird mit der Zeichenfolge auf dem Stapel fortgesetzt. Die Zeichenfolge wird zu Beginn der nächsten Iteration gelöscht (die Schleife erwartet also einen Wert auf dem Stapel, und das ist der Grund für die anfängliche 1).
Vielen Dank an Dennis, dass er den Code kürzer und komplizierter gemacht hat: p
quelle
0{;9,:)_mrsT@{_3$<i\%+}/}g
Javascript (E6) 105
125 134Rekursives Erstellen der Zahl, jeder Schritt prüft die Teilbarkeit.
Laufzeit nahe 0 Sek.
Diesmal keine E / A, da das OP nach einem Programm gefragt hat, um die Nummer zu finden, und die Nummer gefunden und automatisch an der Konsole protokolliert wird
Mehr Golf mit freundlicher Genehmigung von MT0
Golf gespielt
Hässlich
Bonus
Mit 3 kleinen Änderungen können Sie dieselbe Funktion verwenden, um längere Zahlen mit base> 10 zu finden. Zum Beispiel in base 14 ...
Ungolfed
quelle
(Q=(n,d,b)=>([(m=n+(s=[...b]).splice(i,1))%d||Q(m,d+1,s)for(i in b)],d>9&&(Q.z=n),Q.z))('',1,'123456789')
(Q=(n,d,b)=>Math.max(...[(m=n+(s=[...b]).splice(i,1))%d||Q(m,d+1,s)for(i in b)],n))('',1,'123456789')
Perl, 56
Verwendungszweck:
perl -E '...'
Ausgabe:
381654729
Dieses Programm ist sehr langsam . Wie in mehr als 3,5 Stunden.
Um mehr Spaß zu haben, habe ich beschlossen, einen extrem schnellen Algorithmus zu entwickeln:
Das Obige läuft in .00095 Sekunden und bestätigt, dass es nur eine Lösung für dieses Problem gibt.
quelle
Python3,
214,199,184,176,174,171,165,150146Ausgabe:
Dies ist mein erstes Golfskript. Hoffe du magst es :)
quelle
Pyth , 33 Zeichen
Fügen Sie zum Testen den obigen Code als Standardeingabe in den Link im Titel ein.
Nach dem Kompilieren in Python 3.4:
Erläuterung:
=Y]k
::Y=['']
FkY
: für k in F:~Y
: Zu Y hinzufügenf
: Filtern nach>ql{TlT
: Alle einzigartigen Elemente und%vTlT
: eval (Element)% len (Element) = 0m+k
`d
Auf der Liste von k + repr (d)r1T
: für d von 1 bis 9.)
: Ende für Schleifepk
: drucke kquelle
Ruby, 66
78ZeichenDie Laufzeit beträgt ~ 8 Sekunden (Ausgabe nach 3 s gedruckt).
Dies hört nicht auf, nachdem die erste Nummer gefunden wurde. Technisch gesehen werden alle Nummern gedruckt , die die Kriterien erfüllen. Da es jedoch nur eine solche Nummer gibt, macht dies keinen Unterschied.
Ruby 1,8, 63
Im Wesentlichen die gleiche Lösung wie oben. In Ruby 1.8 werden Arrays durch impliziten Aufruf in Strings konvertiert
Array#join
, sodass wir den Aufruf darin speichern können. Interessanterweise läuft der Code in Ruby 1.8 auch viel schneller als in 2.0 (4,5 Sekunden Gesamtlaufzeit, Ausgabe gedruckt nach 1,6 s).quelle
GolfScript (35 Zeichen)
Online-Demo
Dadurch werden Präfixe erstellt, die die Bedingung erfüllen.
quelle
Haskell
129121Hier ist mein amateurhafter Haskell-Versuch (Vorschläge / Verbesserungen wären sehr dankbar). Es ist möglicherweise nicht das kürzeste, wird jedoch nur ausgeführt
.1965 Sekunden nach Flonks Änderungen auf meinem System.quelle
<!-- language: lang-haskell -->
vor Ihrem Code zwei Zeilen hinzu, um die Syntax hervorzuheben!foldl1
in eine Funktion trennen , können Sie diese anstelle vonsum
oder verwendenany
.import Data.List;f=foldl1$(+).(*10);main=print$[f x|x<-permutations[1..9],f[mod(read.take y.show$f x)y|y<-[9,8..1]]<1]!!0
f
Funktion für dasmod
Prädikat, um das Schreiben von foldl1 zu vermeiden, obwohl die zusätzlichen Zyklen die Leistung erheblich beeinträchtigen.!!0
einen Anruf bei ersetzenf
, was funktioniert, da nur ein Element in der Liste enthalten ist. Die Liste[9,8..1]
kann auch durch ersetzt werdenx
, da die Reihenfolge keine Rolle spielt. Sprechen Sie über die Wiederverwendung von Code!Javascript 75 (Beenden)
Bruteforce-Lösung (super langsam)
Wenn Sie das Ergebnis in dieser Lebensdauer sehen möchten, aktualisieren Sie den Anfangswert auf etwa
a=c=38e7
Javascript 70 (nicht terminierend)
Und nur zum Spaß eine zufällige Bruteforce, die viel schneller läuft: (nur ES6)
quelle
Python,
142,139,125124Im Wesentlichen dasselbe wie die Lösung von @ Ventero, wenn ich seinen Code richtig verstanden habe, aber in Python. (Ein Großteil des Kredits geht an @ Greg Hewgill.)
quelle
r(9,1,-1)
mitr(9)
, wie die Reihenfolge der Iteration ist nicht wirklich wichtig.r(1,9)
weil%0
ein Fehler vorliegt.r(1, 9)
in Python verwenden.permutations("123456789")
und''.join(s[:i])
ist wahrscheinlich kürzer als das, was Sie haben (und dann können Sie beseitigenr=range
)Scala (128 Zeichen)
Mein Stich in diese ...
quelle
(2 to 8)
und entfernenforall
.Perl, 72
Verwendungszweck:
perl -M5.010 find-9-digits.pl
Ausgabe:
381654729
Dieses Programm ist langsam . Es kann länger als 10 Sekunden dauern, da die Ziffern "123456789" gemischt werden, aber das Mischen hat einen Fehler.
Ungolfed:
Ich habe den Code gespielt, der die Ziffern 1..9 mischt:
use List'Util shuffle;shuffle 1..9
(34 Zeichen)sort{(-1,1)[rand 2]}1..9
(24 Zeichen)sort{.5<=>rand}1..9
(19 Zeichen)sort(2-rand 4}1..9
(18 Zeichen)sort{4-rand 8}1..9
(18 Zeichen)Perl erwartet, dass der Sortierblock $ a und $ b auf konsistente Weise vergleicht. Meine Sortierblöcke sehen niemals $ a und $ b . Sie geben eine zufällige Reihenfolge zurück, sodass die Sortierung gemischt wird.
Wenn ich verwenden würde
sort{.5<=>rand}1..9
, würde mein Programm schneller laufen. Dieser vergleicht 0,5 mit einem zufälligen Float von 0,0 bis 1,0, ohne 1,0, für eine halbe Chance von $ a <$ b und eine fast halbe Chance von $ a> $ b . ( Achtung: Dies ist ein "Microsoft-Shuffle" , das kein faires Shuffle ist. Dies ist voreingenommen, da.5<=>rand
es keine konsistente Reihenfolge bietet.)Angenommen, ich spiele einen Charakter weg und benutze den viel schlechteren
sort(2-rand 4}1..9
. Perl erwartet, dass der Sortierblock eine Ganzzahl zurückgibt,2-rand 4
ist jedoch ein Float. Es ist ein zufälliger Float von -2,0 bis 2,0, ausgenommen -2,0. Perl schneidet diesen Float gegen Null ab, mit folgenden Ergebnissen:Wenn $ a == $ b , mischt Perl nicht gut. Mein Programm würde also mehr mischen, bis es genug mischt, wenn
2-rand 4
nicht zu oft 0 zurückgegeben wird. Mein Programm würde so langsam laufen, dass es länger als eine Minute dauern könnte.Ich benutze
sort{4-rand 8}1..9
, also gibt es nur eine 1/4 Chance, dass $ a == $ b , und mein Programm verwendet weniger Shuffles.quelle
CJam, 35 Bytes
Nach ungefähr 27 Minuten ergibt dies die folgende Ausgabe:
Wie es funktioniert
quelle
Python 2 (78)
Sie müssen keine Permutationen generieren. Probieren Sie einfach jede Zahl aus und prüfen Sie, ob die Ziffern plus 0 unterschiedlich sind. Das Laufen dauert eine Weile.
quelle
SWI-Prolog 84
Es ist ein bisschen betrügerisch, weil die Liste der Ziffern in der Abfrage angegeben werden muss:
Es ist jedoch das, was diesen Code interessant macht: Sie können das Problem für jede Liste von Ziffern lösen. Zum Beispiel:
quelle
Python 2 - 114
Nicht einmal die kürzeste Python-Lösung, aber ich teile sie trotzdem:
quelle
Bash + Coreutils, 159 Bytes
Das ist ziemlich lang, aber ich denke, der Algorithmus ist vielleicht einer der schnellsten, wenn man bedenkt, dass dies ein (normalerweise langsames) Shell-Skript ist, das in weniger als 0,1 Sekunden ausgeführt wird.
Der Algorithmus sieht ungefähr so aus:
grep
)$d
(die Ziffernnummer)bc
mit einem Ausdruck, der durch generiert wirdprintf
Beachten Sie, dass wir einige Abkürzungen verwenden, aber ich denke, diese sind mathematisch fundiert:
quelle
C ++, 187
Ich musste das nur in C ++ versuchen. Natürlich wird es nicht die kürzeste Lösung sein, aber hier ist es:
Gibt die Nummer zurück, anstatt sie zu drucken, um einige Zeichen zu speichern (verdammt einschließen). Unter POSIX-Systemen wird dies natürlich in ein vorzeichenloses 8-Bit konvertiert und ist daher nicht korrekt - aber das Programm berechnet eine korrekte Zahl.
Ungolfed (erfordert C ++ 11):
quelle
T-SQL 2005+ - 203
T-sql ist keine sehr wettbewerbsfähige Golfsprache ...
Muss in der Master-Datenbank ausgeführt werden. Sie können den ersten CTE durch diesen ersetzen, um ihn datenbankunabhängig zu machen. Dann werden jedoch einige weitere Zeichen verwendet (und 2008 erforderlich).
Lesbare Formation:
Grundsätzlich fügen wir der Rückseite der
r
Zahl, die wir noch nicht in der Zeichenfolge gesehen haben, weiterhin Ziffern hinzu und stellen sicher, dass die neue Zeichenfolge immer noch Modulo 0 des aktuellen Levels ist. Wir initialisieren R auf\
. Dies ist wirklich der einzige Trick in diesem Code. Welches ist eine verrückte Art, es immoney
Datentyp auf 0 zu setzen . Ich vermute, Sie können\
statt der Währung tippen .$
macht dasselbe in T-SQL,$l
würde aber versuchen, eine Pseudospalte zu interpretieren, die nicht existiert, und einen Fehler auslösen. Auf diese Weise vermeiden wir die Sorge um die Verwendungint
Dies würde normalerweise bei der 10. Verkettung zu einem Überlauf führen und uns zwingen, den Füllstand tatsächlich zu überprüfen. Bearbeiten: Unterhaltsame Tatsache T-sql verfügt auch 2014 nicht über eine integrierte Möglichkeit, eine Zeichenfolge in eine Wertetabelle umzuwandeln (z. B. keine geteilte Funktion). Daher können wir unsereA
Tabelle auch zweimal wiederverwenden , um die Zeichen in der zu wiederholen stringified R.T-SQL-Prioritätsregeln sind ärgerlich, daher müssen wir die numerische Verkettung (* 10 + n) anstelle der Zeichenfolgenverkettung verwenden.
quelle
with A as(select 1n union all select n+1 from A where n<9),
PHP, 89 Bytes
zufällige Version, 89 Bytes:
mischt eine Zeichenfolge mit den Ziffern und testet dann die Teilbarkeit in einer Schleife.
Laufen Sie mit
-nr
.Brute-Force-Schleife, 90 Byte, sehr langsam:
Schleifen von 100000001, testen die Teilbarkeit in der inneren Schleife und werden beendet, wenn eine Lösung gefunden wird.
rekursive Funktion, 94 Bytes, sehr schnell:
Hängt eine Ziffer an, die noch nicht in der Zahl enthalten ist. Wenn die Teilbarkeit nach Länge angegeben ist, rekursieren (oder drucken).
Dies nutzt aus, dass es nur eine Lösung gibt. ohne dass
print$e>8?$x:f($x,$e+1)
sein mussteprint$e>8?"$x\n":f($x,$e+1)
(+3 Bytes, drucken alle Lösungen) oder($e>8?die("$x"):f($x,$e+1))
(+4 Bytes Ausfahrt erste Lösung) bzw. die Lösungen würden ohne Trennzeichen gedruckt werden.Rufen Sie an mit
f();
- -
TiO
Die Brute-Force-Version hat aus offensichtlichen Gründen kein TiO, aber Sie können die anderen beiden ausprobieren .
Die Laufzeit des Funktionsaufrufs wird inline gemessen (irgendwo zwischen 2 und 4 Millisekunden);
Die Gesamtlaufzeit wird von der Website gemessen (normalerweise zwischen 50 und 500 ms).
quelle