Ein Follow-up zu dieser Herausforderung
Geben Sie bei einem Satz gemischter Würfel die Häufigkeitsverteilung aus, indem Sie alle Würfel würfeln und die gewürfelten Zahlen auf jedem Würfel summieren.
Betrachten Sie zum Beispiel 1d12 + 1d8
(Rollen von 1 12-seitigem Würfel und 1 8-seitigem Würfel). Die maximalen und minimalen Rollen sind 20
und 2
verbunden, die dem Walzen ähnlich ist 2d10
(2 10 seitige Würfel). Es 1d12 + 1d8
ergibt sich jedoch eine flachere Verteilung als 2d10
: [1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 7, 6, 5, 4, 3, 2, 1]
versus [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
.
Regeln
- Die Frequenzen müssen in aufsteigender Reihenfolge der Summe aufgeführt werden, der die Frequenz entspricht.
- Das Beschriften der Frequenzen mit den entsprechenden Summen ist zulässig, aber nicht erforderlich (da die Summen aus der erforderlichen Reihenfolge abgeleitet werden können).
- Sie müssen keine Eingaben verarbeiten, bei denen die Ausgabe den für Ihre Sprache darstellbaren Bereich von Ganzzahlen überschreitet.
- Führende oder nachfolgende Nullen sind nicht zulässig. Es sollten nur positive Frequenzen im Ausgang erscheinen.
- Sie können die Eingabe in jedem vernünftigen Format vornehmen (Liste der Würfel (
[6, 8, 8]
), Liste der Würfelpaare ([[1, 6], [2, 8]]
) usw.). - Die Frequenzen müssen so normiert werden, dass der GCD der Frequenzen 1 ist (zB
[1, 2, 3, 2, 1]
statt[2, 4, 6, 4, 2]
). - Alle Würfel haben mindestens ein Gesicht (also
d1
ist a das Minimum). - Das ist Code-Golf , also gewinnt der kürzeste Code (in Bytes). Standardlücken sind wie gewohnt verboten.
Testfälle
Diese Testfälle gegeben werden als input: output
, wobei die Eingabe als eine Liste von Paaren gegeben ist [a, b]
repräsentiere a
b
-seitige Würfel (so [3, 8]
bezeichnet 3d8
, und [[1, 12], [1, 8]]
bezieht sich auf 1d12 + 1d8
).
[[2, 10]]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
[[1, 1], [1, 9]]: [1, 1, 1, 1, 1, 1, 1, 1, 1]
[[1, 12], [1, 8]]: [1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 7, 6, 5, 4, 3, 2, 1]
[[2, 4], [3, 6]]: [1, 5, 15, 35, 68, 116, 177, 245, 311, 363, 392, 392, 363, 311, 245, 177, 116, 68, 35, 15, 5, 1]
[[1, 3], [2, 13]]: [1, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 37, 36, 33, 30, 27, 24, 21, 18, 15, 12, 9, 6, 3, 1]
[[1, 4], [2, 8], [2, 20]]: [1, 5, 15, 35, 69, 121, 195, 295, 423, 579, 761, 965, 1187, 1423, 1669, 1921, 2176, 2432, 2688, 2944, 3198, 3446, 3682, 3898, 4086, 4238, 4346, 4402, 4402, 4346, 4238, 4086, 3898, 3682, 3446, 3198, 2944, 2688, 2432, 2176, 1921, 1669, 1423, 1187, 965, 761, 579, 423, 295, 195, 121, 69, 35, 15, 5, 1]
[[1, 10], [1, 12], [1, 20], [1, 50]]: [1, 4, 10, 20, 35, 56, 84, 120, 165, 220, 285, 360, 444, 536, 635, 740, 850, 964, 1081, 1200, 1319, 1436, 1550, 1660, 1765, 1864, 1956, 2040, 2115, 2180, 2235, 2280, 2316, 2344, 2365, 2380, 2390, 2396, 2399, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2399, 2396, 2390, 2380, 2365, 2344, 2316, 2280, 2235, 2180, 2115, 2040, 1956, 1864, 1765, 1660, 1550, 1436, 1319, 1200, 1081, 964, 850, 740, 635, 536, 444, 360, 285, 220, 165, 120, 84, 56, 35, 20, 10, 4, 1]
Antworten:
Jelly ,
147 Bytes-3 Byte dank Mr. Xcoder (Verwendung eines impliziten Bereichs zur Vermeidung von Leading
R
; Ersetzen von Reduction durch das dyadische kartesische Produkt und Flatten durch dasp/F€
für diesen Zweck integrierte kartesische ProduktŒp
.)Ein monadischer Link, der eine Liste mit Würfelgesichtern erstellt und die normalisierte Verteilung der ansteigenden Beträge zurückgibt.
Probieren Sie es online!
Wie?
Durchläuft die Liste der Würfel "Größen" (implizit), macht sie zu ihrer Liste der Gesichter, erhält dann das kartesische Produkt dieser Listen (alle möglichen Würfe des Würfelsatzes), summiert diese Würfe und erhält die Gleichheitsgruppen Indizes (nach aufsteigendem Wert) und nimmt die Länge jeder Gruppe.
Hinweis: Es gibt immer nur eine Möglichkeit, das Minimum zu würfeln (indem bei jedem Würfel eine Eins gewürfelt wird), und wir zählen keine Würfe doppelt, sodass keine GCD-Normalisierung erforderlich ist.
quelle
÷g/$
obwohl brauchen (gibt es nicht immer nur einen Weg, um die min oder max zu bekommen?)ŒpS€µLƙ
MATL , 8 Bytes
Die Eingabe ist ein Array von (möglicherweise wiederholten) Chipgrößen.
Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
Erläuterung
quelle
Schale , 7 Bytes
Input ist eine Liste von Würfeln. Probieren Sie es online!
Erläuterung
quelle
Haskell , 54 Bytes
Probieren Sie es online!
Haskell , 63 Bytes
Probieren Sie es online!
Haskell , 68 Bytes
Probieren Sie es online!
quelle
Oktave ,
88 69 5856 BytesWie in der Haskell-Antwort erwähnt, wird dabei die Tatsache ausgenutzt, dass die Verteilung von z. B. einem 3-seitigen und einem 5-seitigen Würfel die diskrete Faltung der beiden Vektoren
[1,1,1]
und ist[1,1,1,1,1]
. Vielen Dank an @LuisMendo für -11 Bytes cleveres Golfen!Probieren Sie es online!
Diese Einreichung verwendet einen rekursiven Ansatz. Wenn Sie jedoch eine Schleife verwenden würden, wäre diese etwas länger:
quelle
Haskell ,
80 7864 BytesDiese Lösung entsprach fast der von @ Sherlock9 in der vorherigen Herausforderung mit dem vielleicht natürlicheren Ansatz. @xnor hat eine noch kürzere Haskell-Lösung !
Erläuterung:
Probieren Sie es online!
Vorherige Lösung:
Hierbei wird die diskrete Faltungsfunktion von @AndersKaseorg verwendet. Die Beobachtung hier ist, dass die Verteilung von zB einem 3-seitigen und einem 5-seitigen Würfel die diskrete Faltung der beiden Vektoren
[1,1,1]
und ist[1,1,1,1,1]
.Probieren Sie es online!
quelle
Wolfram Language (Mathematica) , 26 Byte
Probieren Sie es online!
Eine Modifikation meiner Antwort auf die vorherige Herausforderung . Dies generiert einfach alle möglichen Ergebnisse, addiert sie und summiert die Ergebnisse.
Zum Spaß könnten wir es so schreiben
Tally@*Total@*Thread@*Tuples@*Range
, aber das ist länger.Wolfram Language (Mathematica) , 41 Bytes
Probieren Sie es online!
Dies ist der faltungsbasierte Ansatz (hier nehmen wir Faltungen über das Produkt der Erzeugungsfunktionen -
1+x+x^2+...+x^(N-1)
ist die Erzeugungsfunktion zum Rollen eines dN - und nehmen dann die Liste der Koeffizienten). Ich schließe es ein, weil die erste Lösung für große Eingaben nicht praktisch ist.quelle
Mathematica, 44 Bytes
Gibt die mit den entsprechenden Summen gekennzeichneten Frequenzen aus
Probieren Sie es online!
-5 Bytes von Martin Ender
Vielen Dank an Mischa Lawrow für die Mitteilung, dass "Labeled" gültig ist
quelle
Pyth , 12 Bytes
Probieren Sie es hier aus!
Wie?
quelle
Jelly , 14 Bytes
Probieren Sie es online!
Die Eingabe ist eine Liste von Werkzeugwerten. Ich könnte Golf spielen, indem ich mir
ĠL€
die andere Gelee-Antwort stehle , aber dann könnte ich auch Golf spielen und am Ende das Gleiche tun, also lasse ich es einfach so, wie es istquelle
Python 2 ,
120119 BytesProbieren Sie es online!
Danke für Mego / Jonathon Allan für 1 Byte.
quelle
05AB1E , 11 Bytes
Probieren Sie es online!
Wie es funktioniert
Dank Emigna 1 Byte gespart !
quelle
O
anstelle von tun€˜
R , 51 Bytes
Probieren Sie es online!
Nimmt eine Liste von Würfeln und gibt einen benannten Vektor von Frequenzen zurück; Die Namen (Werte der Würfelsummen) sind über den Frequenzen aufgedruckt.
R , 59 Bytes
Probieren Sie es online!
Ein
Reduce
Ansatz anstelle des oben beschriebenen iterativen.R , 62 Bytes
Probieren Sie es online!
Ein Faltungsansatz. Es werden einige Warnungen ausgegeben, dass nur das erste Element von
D
für den Ausdruck verwendet wird1:D
, die Ausgabe jedoch nicht beeinflusst wird. Wenn wir nicht denRe
gesamten Teil der Lösung übernehmen müssten, wären es 58 Bytes.quelle
APL (Dyalog Classic) ,
1210 Bytes-2 danke an @ Adám
Probieren Sie es online!
Die Eingabe
⎕
ist eine Liste von N Würfeln⍳⍵
ist ein N-dimensionales Array verschachtelter Vektoren - alle möglichen Würfelwürfe+/↑,
flacht die Arrays ab und summiert die Würfe⊢∘≢⌸
zählt, wie viele von jeder einzelnen Summe in der Reihenfolge ihres ersten Auftretens aufgelistet sind, was glücklicherweise mit ihrer aufsteigenden Reihenfolge übereinstimmtquelle
⊢∘≢⌸+/↑,⍳⎕
Ruby , 72 Bytes
Probieren Sie es online!
Nimmt eine Liste von Würfeln als Eingabe. Zweifellos kann man Golf spielen, aber nicht schlecht.
quelle
Pari / GP , 37 Bytes
Probieren Sie es online!
quelle
Sauber ,
15414213610710085 + 13 = 98 BytesInput ist eine Liste von Würfeln.
Die Antwort ist in Form eines Lambda.
+13 Bytes von
import StdEnv
, wodurch das dafür benötigte Modul importiert wird.Probieren Sie es online!
quelle
JavaScript (ES6), 83 Byte
Nimmt die Eingabe jedes Würfels als separaten Parameter.
quelle
JavaScript (ES6),
7674 ByteNimmt die Eingabe als eine Liste von Würfeln.
Testfälle
Das Verarbeiten der letzten beiden Testfälle würde das Aktivieren der TCO oder das Erhöhen der Standard-Stack-Größenbeschränkung der JS-Engine erfordern.
Code-Snippet anzeigen
Formatiert und kommentiert
NB: Dies ist eine kommentierte Version meiner ursprünglichen Einreichung, die redu () verwendet hat. Es ist 2 Bytes länger, aber leichter zu lesen.
quelle
Clojure, 96 Bytes
Der erste Eingang ist eine Liste mit der Anzahl der Würfel und der zweite Eingang ist eine Liste mit der Anzahl der Seiten jedes Würfels.
quelle
Perl 5 , 94 Bytes
Probieren Sie es online!
Das Eingabeformat ist eine Liste von Würfeln, die durch Zeilenumbrüche getrennt sind. Somit würde 1d10 + 2d8 wie folgt eingegeben:
quelle
SageMath, 46 Bytes
Probieren Sie es online aus
Dies ist eine Anpassung meiner Lösung an die andere Herausforderung . Es nimmt beliebig viele Würfel als Parameter auf (zB
f(4,4,6,6,6)
für2d4+3d6
) und gibt eine Liste zurück.Python 2 + NumPy , 62 Bytes
Probieren Sie es online!
Nach wie vor habe ich diese Lösung der obigen beigefügt, da sie im Wesentlichen gleichwertig ist. Beachten Sie, dass diese Funktion ein NumPy-Array und keine Python-Liste zurückgibt, sodass die Ausgabe bei Ihnen etwas anders aussieht
print
es .numpy.ones(x)
ist der "richtige" Weg, ein Array für die Verwendung mit NumPy zu erstellen, und daher könnte es anstelle von verwendet werden[x*[1]]
, aber es ist leider viel länger.quelle