Herausforderung
In dieser Aufgabe haben Sie die Anzahl der Möglichkeiten berechnet, wie wir A-Kugeln in B-Zellen verteilen können, wobei jede Zelle mindestens eine Kugel hat.
Die Eingänge A und B sind in einer einzelnen Zeile angegeben, die durch ein Leerzeichen getrennt ist. Die Eingänge werden durch EOF abgeschlossen.
Vielleicht möchten Sie hier Ihre Lösungen überprüfen .
Eingang
0 0
1 0
12 4
6 3
18 17
20 19
15 13
18 9
20 20
17 14
9 2
14 13
18 11
Ausgabe
1
0
14676024
540
54420176498688000
23112569077678080000
28332944640000
38528927611574400
2432902008176640000
21785854970880000
510
566658892800
334942064711654400
Einschränkungen
- Jedes A und B kann unterschieden werden.
- 0 <= A, B <= 20
- Sie können jede Sprache Ihrer Wahl verwenden
- Kürzeste Lösung gewinnt!
code-golf
math
combinatorics
Quixotic
quelle
quelle
S(n,0)
ist1
wennn=0
und0
anders). Wenn Sie möchten, kann ich eine Referenz für die stärkere Aussage finden, dass Stirling2 in der assoziativen Untergruppe der exponentiellen Riordan-Gruppe ist.Antworten:
JavaScript (90
93)http://jsfiddle.net/RDGUn/2/
Offensichtlich wird mich jede mathematisch basierte Sprache wie APL wegen der Ausführlichkeit der Syntax und des Mangels an eingebauten mathematischen Konstrukten schlagen :)
Bearbeiten Außerdem habe ich keine eingabebezogenen Funktionen außer den an die Funktion übergebenen Parametern. Ich bin mir nicht sicher, wie ich die Standardeingabe mit JavaScript verwenden soll ...
Edit: Verschieben
i--
inm=m*
Ausdruck; einziehenn*=-1
infor
; Beginnen Sier=1
, Aufgaben zu kombinieren, und entfernen Sie überflüssige Aufgaben bei der Rückgabe. (außer 3 Zeichen)quelle
readline
undprint
. Ich weiß nicht, was andere hier benutzen.prompt
undalert
sind das "Standard" -Io von JavaScript, da es sich um die typischen blockierenden io-Aufrufe handelt, obwohl Sie das blockierende io normalerweise nie mit JavaScript verwenden würden.Golfscript -
56 50 49 48 41 40 3837 ZeichenHinweis: Dies verarbeitet mehrere Eingabezeilen, ist schnell (1/8 Sekunden für die Testfälle) und unterbricht keine legalen Eingaben.
(Die erste Version war auch mein erstes Golfscript-Programm; dank eBusiness für den Hinweis auf einige Tricks, die ich verpasst habe).
Um dies auch zu einem nützlichen Lehrbeitrag zu machen, finden Sie hier eine Erklärung, wie es funktioniert. Wir beginnen mit der Wiederholung
f(n, k) = k * (f(n-1, k) + f(n-1, k-1))
. Dies kann kombinatorisch so verstanden werden, dass man, umn
unterscheidbare Bälle ink
unterscheidbare Eimer zu legen, so dass jeder Eimer mindestens einen Ball enthält, einen derk
Eimer für den ersten Ball auswählt (k *
) und dann entweder mindestens einen weiteren Ball enthält (f(n-1, k)
) oder es wird nicht (f(n-1, k-1)
).Die daraus resultierenden Werte bilden ein Raster; Es wird
n
als Zeilenindex undk
als Spaltenindex verwendet und beide von 0 indiziertWenden wir uns also dem Programm zu.
teilt die Eingabe in Zeilen auf und wertet sie dann für jede Zeile aus, setzt
n
undk
auf den Stapel und ruft dann<<STUFF>>
Folgendes auf:Dies berechnet die ersten
k+1
Einträge dern+1
dritten Zeile dieses Gitters. Anfangs ist der Stapeln k
.),
gibt Stapel vonn [0 1 2 ... k]
{!}%
gibt Stapel von,n [1 0 0 ... 0]
wo esk
0s gibt.\{ <<MORE STUFF>> }*
bringt dasn
nach oben und macht es so oft, wie wir es ausführen<<MORE STUFF>>
.Unser Stack ist derzeit eine Zeile der Tabelle:
[f(i,0) f(i,1) ... f(i,k)]
0.@
Setzt ein paar Nullen vor dieses Array. Der erste wird seinj
und der zweite wird seinf(i,j-1)
.{ <<FINAL LOOP>> }/
Schleifen durch die Elemente des Arrays; für jeden legt es es auf den Stapel und führt dann den Schleifenkörper aus..@+2$*@)@
ist eine langweilige Stapelmanipulation, um Pops vom Rest zu nehmen... j f(i,j-1) f(i,j)
und zu erzielen... j*(f(i,j-1)+f(i,j)) j+1 f(i,j)
;;]
k+1 f(i,k)
und sammelt alles in einem Array, bereit für die nächste Runde.Wenn wir die
n
dritte Zeile der Tabelle generiert haben, nehmen wir)p;
das letzte Element, drucken es und verwerfen den Rest der Zeile.Für die Nachwelt drei 38-Zeichen-Lösungen nach diesem Prinzip:
n%{~),{!}%\{0.@{.@+@.@*\)@}/;;]}*)p;}/
n%{~),{!}%\{0:x\{x\:x+1$*\)}/;]}*)p;}/
n%{~),{!}%\{0.@{@1$+2$*\@)}/;;]}*)p;}/
quelle
[0]
->1,
, der Platz nach dem Reißverschluss kann einfach entfernt werden, und der andere Platz kann entfernt werden, wenn Sie nur in einem Operator anstelle von k speichern. Ich habe Ihren Code noch nicht durchgearbeitet, aber ich vermute, dass Sie möglicherweise nur einen Wert verwenden, ohne ihn an einigen Stellen in ein Array einzufügen.J, 40
Z.B
<1 Sek. Für alle Testfälle.
Bearbeitungen
-/
statt abwechseln(1 _1)*
(JBs Idee)1x+
quelle
1x+
, aber das kauft mir nur 1 Charakter zurück, während du 5 genommen hast!Common Lisp (83)
Es scheint, dass es einen kürzeren Weg geben sollte, um die Basisfälle zu testen, aber mir fällt nichts ohne weiteres ein.
quelle
J, 38 bis 42
Wählen Sie je nach Ihren strengen Präferenzen für interaktive Sprachen und Ausgabepräsentationen aus dem Spektrum der Lösungen aus:
4 :'|-/(!&y*^&x)i.1x+y'/&".;._2(1!:1)3
Starten Sie jconsole, geben Sie es ein und fügen Sie die Eingabe ein (Ende mit Cd). Sie werden feststellen, dass die Ausgabe durch Leerzeichen getrennt ist (J ist eine Vektorsprache, führt die Berechnung für die gesamte Eingabe als Ganzes durch und gibt sie als 1D-Vektor zurück, dessen Standarddarstellung in einer einzelnen Zeile steht). Ich halte das für ok, der Geist dieses Problems ist die Berechnung, nicht die Präsentation. Aber wenn Sie stattdessen auf Zeilenumbrüchen bestehen:
4 :'|-/(!&y*^&x)i.1x+y'/&.".;._2(1!:1)3
Wenn Sie Compose (
&
) durch Under (&.
) ersetzen, wird ein Vektor von Zeichenfolgen zurückgegeben, dessen Darstellung in separaten Zeilen endet.4 :'echo|-/(!&y*^&x)i.1x+y'/&".;._2(1!:1)3
Ausführen über die Befehlszeile als
$ jconsole balls.ijs < balls.in
Wenn Sie dafür gestimmt haben, möchten Sie vielleicht auch der Lösung von Eelvex etwas Anerkennung zollen .
quelle
&.
damit es im interaktiven Modus ordnungsgemäß funktioniert.4 :'|-/(!&y*^&x)i.1x+y'/&.".;._2(1!:1)3
. 39 Zeichen.GolfScript -
453836 ZeichenWiederholungsrelation für schmutzige Implementierungen mit mittlerer Stärke (
3836 Zeichen):Die Wiederholungsbeziehung, die ich aus der Lösung von Peter Taylors gestohlen habe, sieht folgendermaßen aus:
f(x, y) = y * ( f(x-1, y) + f(x-1, y-1) )
In Sonderfällen, wenn eine der Variablen 0 ist.
In meiner Implementierung werden frühere Ergebnisse nicht wiederverwendet, sodass jeder Funktionsaufruf zu zwei neuen Aufrufen verzweigt, es sei denn, einer der Nullfälle wurde erreicht. Dies führt zu einem Worst-Case von 2 ^ 21-1 Funktionsaufrufen, der auf meinem Computer 30 Sekunden dauert.
Light-Force-Serienlösung (45 Zeichen):
quelle
J, 55 Zeichen
wd
). Eingabe auf stdin, Ausgabe auf stdout.Bash-Testskript:
quelle
wd
?echo
, was definiert ist als0 0&$@(1!:2&2)
. Ich bin mir nicht sicher, was das bedeutet, aber es macht so etwas wie hübsch gedruckte Rang 1-Artikel mit einem Zeilenumbruch. (Ich merke gerade, dass 2 statt 4 verwendet wird ... Ich denke, dass es zumindest im Konsolenmodus immer noch zu Standard geht.)<< was unexpected at this time.
tut mir leid, ich bin neu in der J-Eingabe, ich habe sie immer im Konsolenmodus verwendet.Golfscript - 26 Zeichen
Warnung: Der Fall 12 4 benötigt viel Speicher (obwohl nicht so viel wie die Antwort unten) und dauert eine Weile, bis er ausgeführt wird
Natürlich hat diese Antwort einige Probleme, aber ich werde sie hier belassen, da sich die Kommentare darauf beziehen und die Antwort von mellamokb darauf basiert.
Golfscript - 24 Zeichen
Warnung: Der 12 4-Fall benötigt viel Speicher und benötigt eine Weile, um ausgeführt zu werden
quelle
0 0
sollte produzieren1
;0 k
für jeden anderenk
sollte produzieren0
;n 1
dennn > 0
sollte produzieren1
.Python 140 Zeichen
quelle
Gleichstrom, 100 Zeichen
Leider scheint DC nicht von Ideone unterstützt zu werden. Es gibt vielleicht noch ein oder zwei Charaktere, die man herausdrücken muss, aber es ist Schlafenszeit.
Hinweis: Dies unterstützt mehrere Eingabezeilen, hat eine ausreichende Genauigkeit, um auch für
20 19
(verfluche dich, Perl, für die Zeit, die ich mit dem Debuggen meiner Lösung verschwendet habe!) Die richtige Ausgabe zu liefern , und liefert die richtige Ausgabe für0 0
.Vorschläge von Nabb erlauben eine Verkürzung mindestens bis zu
auf Kosten des Zurücklassens von Junk in den Registerstapeln (und damit des Speichers, wenn wir Milliarden von Antworten berechnen).
quelle
l11
als analysiertl1 1
(Sie können sieK
als Token für einzelne Zeichen verwenden,0
wenn Sie die Genauigkeit ohnehin nicht ändern möchten). Sie können die Eingangsschleife auf ändern?[...?z1=4]
. Sie können das Makro im Register einbinden1
. Und Sie können wahrscheinlich im Allgemeinen viel mehr Zeichen speichern, aber ich werde warten, bis es kürzer ist, um es zu verstehen.Golfscript (28
3137)~):$\.($\?:@;?,{@+}%{$base$,\-[0]=},,
Änderung der
gnibbler
GolfScript-Lösung. Ich denke, dies ist eine funktionierende Lösung - getestet mit [3,2], [4,2], [6,3] und [9,2] mit korrekten Antworten. (Ich habe$
und@
für Variablen verwendet, um den Platz um dasbase
Schlüsselwort zu verringern ).Es gibt zwei Probleme mit
gnibbler
der aktuellen Lösung.Bearbeiten
~:@\?:$,{$+}%{@base(;@,\-,0=},,
Bessere Lösung noch! Sie müssen nicht inkrementieren, sondern alle Zahlen addieren, sodass sie mit [1] beginnen. Sobald Sie diese erste Ziffer dekoniert haben, fehlen keine Ziffern (einschließlich des linken Auffüllens von Nullen). Diese Lösung sollte funktionieren und wurde mit denselben Einträgen wie oben getestet. Es ist auch viel schneller, da wir nicht inkrementieren, bevor Exponent zum Generieren des Arrays verwendet wird (aber bei größeren Eingaben immer noch das gleiche Leistungs- / Speicherproblem auftritt).
Bearbeiten : Verwenden Sie
gnibbler
die Idee, das Hinzufügen des$
Inneren des Filters anstelle eines zusätzlichen Schritts zu verschieben. (3 Zeichen speichern).quelle
0 0
.n 1
für jedes n auf, bewirkt, dass es hängt. hmm ..05AB1E , 19 Bytes
HINWEIS: Es ist extrem langsam und läuft bereits ab
12 4
. Es funktioniert jedoch wie beabsichtigt.Mal sehen, ob ich eine alternative Methode finden kann, die in angemessener Zeit für alle Testfälle funktioniert.Im Folgenden finden Sie eine viel schnellere Version, mit der alle Testfälle in weniger als einer Sekunde ausgeführt werden.Probieren Sie es online aus oder überprüfen Sie einige weitere (der kleineren) Testfälle .
Erläuterung:
05AB1E , 29 Bytes
Hier eine viel schnellere Version, die für alle Testfälle in ca. 0,5 Sekunden auf TIO funktioniert:
Port of @mellamokbs JavaScript-Antwort , also stellen Sie sicher, dass Sie ihn positiv bewerten!
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
HINWEIS: Funktioniert
0 0
in diesem Fall fürL
Randfälle (im Gegensatz zu der JavaScript-Antwort, von der ich diese Methode portiert habe), da das integrierte Programm eine Liste erstellt[0,1]
.quelle