Wenn eine Folge von Ereignissen mit Wahrscheinlichkeiten zwischen 0,0 und 1,0 gegeben ist, generieren Sie die Wahrscheinlichkeit, dass jede Kombination auftritt, und leiten Sie sie ab. Sie können davon ausgehen, dass eine Folge von Zahlen in dem von Ihnen gewählten Konstrukt enthalten ist.
Hier ist ein Beispiel; Sie können davon ausgehen, dass die Länge der Sequenzkombinationen in den Speicher passt:
{ 0.55, 0.67, 0.13 }
Das Programm gibt jede Kombination und die zugehörige Wahrscheinlichkeit des Auftretens dieser Sequenz aus. Eine 1 gibt an, dass das Ereignis in diesem Index der Eingabesequenz aufgetreten ist, und eine 0 gibt an, dass dieses Ereignis nicht aufgetreten ist. Die gewünschte Ausgabe ist unten (es ist mir egal, ob ich die Arbeit drucke, das ist nur zu Informationszwecken des Algorithmus):
[0,0,0] = (1 - 0.55) * (1-0.67) * (1-0.13) = 0.129195
[0,0,1] = (1 - 0.55) * (1-0.67) * (0.13) = 0.019305
[0,1,0] = (1 - 0.55) * (0.67) * (1-0.13) = 0.262305
[0,1,1] = (1 - 0.55) * (0.67) * (0.13) = 0.039195
[1,0,0] = (0.55) * (1-0.67) * (1-0.13) = 0.157905
[1,0,1] = (0.55) * (1-0.67) * (0.13) = 0.023595
[1,1,0] = (0.55) * (0.67) * (1-0.13) = 0.320595
[1,1,1] = (0.55) * (0.67) * (0.13) = 0.047905
Dieses Problem hängt tangential mit der Berechnung eines "kartesischen Produkts" zusammen.
Denken Sie daran, das ist Code-Golf, also gewinnt der Code mit der geringsten Anzahl von Bytes.
quelle
[0.129195, 0.019305, 0.262305, ..., 0.047905]
als Ausgabe genug oder sind die[0,0,0], [0,0,1], ...
nötig?Antworten:
Haskell, 86 Bytes
Anwendungsbeispiel:
Die meisten Bytes werden für die Ausgabeformatierung ausgegeben. Wenn Sie sich nur für den Wahrscheinlichkeitsvektor interessieren, sind es nur 29 Bytes:
Wie es funktioniert:
quelle
Mathematica,
4645 BytesNimmt eine Liste. Funktioniert sogar für die leere Liste
{}
, für die die Ausgabe ist{1}
.Testfall:
Erläuterung
Wenn eine Liste von Wahrscheinlichkeiten
s
und eine Liste von Bitsb
mit der0
Bezeichnung "nicht aufgetreten" und1
"aufgetreten" gegeben ist, wird die Liste der zu multiplizierenden Wahrscheinlichkeiten mit gegebenbis zum unterschreiben. Wenn stattdessen
0
"ist aufgetreten" und1
"ist nicht aufgetreten" bedeutet, vereinfacht sich diesalso wir:
quelle
Perl,
4240 BytesBeinhaltet +1 für
-a
Gib Zahlen auf STDIN an:
Ausgänge
combi.pl
:quelle
MATL ,
1211 BytesDie Eingabe ist ein Spaltenvektor mit dem Format
[0.55; 0.67; 0.13]
Probieren Sie es online!
quelle
Perl, 116 Bytes
Lesbar:
Erstellt eine Liste aller möglichen Kombinationen von Nullen und Einsen der Länge, die der Anzahl der Eingabeparameter entsprechen (im obigen Beispiel hätte sie beispielsweise die Länge 3), und berechnet dann jede Wahrscheinlichkeit.
Vielen Dank an @Dada, der mir gezeigt hat, was die
glob
Funktion kann , auch wenn ich nicht zu 100% sicher bin, wie sie das macht.Beispielausgabe:
quelle
-a
statt(@a=split/ /,<>)
...R,
7269 BytesÜbernimmt die Eingabe von stdin und gibt einen R-Vektor der Wahrscheinlichkeiten zurück.
Bearbeiten: Eine unnötige Transponierung wurde entfernt. Die Permutationsmatrix ist jetzt die transponierte Version der folgenden und die Wahrscheinlichkeiten werden eher als spaltenweise als als zeilenweise berechnet. Beispielausgabe:
Beachten Sie, dass die Wahrscheinlichkeiten in einer anderen Reihenfolge liegen, da die von generierte Permutationsmatrix
expand.grid
Folgendes ergibt (die Generierung dieser Matrix kann wahrscheinlich mit externen Paketen durchgeführt werden):Die erste Wahrscheinlichkeit entspricht dem invertierten Ergebnis der ersten Zeile in der obigen Matrix und der zweiten der invertierten zweiten Zeile usw. Die Formatierung der Ausgabe, um dies noch deutlicher zu sehen, verlängert das Programm (164 Byte):
was stattdessen erzeugt:
quelle
expand.grid
! Ich denke, dasapply
kann sowohl auf Datenrahmen als auch auf Matrizen angewendet werden, daher sollte Ihr Code ohne das funktionierent(t(...))
, was Ihnen 6 Bytes erspart.t
es sich nicht um einen Datenrahmen handelt, sondern um die Subtraktion des Wahrscheinlichkeitsvektors von der Permutationsmatrix (mit unterschiedlichen Dimensionen). Mindestens eine davon wird aufgrund der Art und Weise benötigt, wie R diese vektorisierten Operationen verarbeitet, aber ich könnte wahrscheinlich die äußere Transponierung entfernen und das Produkt stattdessen über Spalten anwenden. Wird morgen aktualisiertGelee , 9 Bytes
Probieren Sie es online!
quelle
J, 14 Bytes
Verwendung
Erläuterung
quelle
|*//0.55 0.67 0.13-/0 1
einen Zug machen?Pyth, 10 Bytes
Probieren Sie es online aus: Demonstration
Erläuterung:
quelle
C 110 Bytes
Ungolfed:
Funktioniert mit bis zu 32 Elementen, + 5 + 1 Byte für 64 Elemente (deklarieren
long k;
und fügen Sie diesL
in der ersten Schleife hinzuk<1L<<N
).quelle
*1*<<n
oder ist das nur eine C ++ - Sache?05AB1E , 8 Bytes
Probieren Sie es online!
quelle
JavaScript (Firefox 30-57), 57 Byte
Gibt ein Array aller Wahrscheinlichkeiten zurück. Wenn Sie das Array von Ereignissen auch wollen, dann für 86 Bytes:
Wenn Sie die Ereignisse als Zeichenfolge zulassen, sind es nur 80 Byte:
Subtrahieren Sie
1/
für jede Lösung zwei Bytes, wenn die Wahrscheinlichkeit niemals Null sein wird.quelle
<script></script>
Block ausführen ? Ich habe Probleme damit, dass das erste "für" unerwartet ist?Perl 6,
2419 Bytes von Latin-1Älterer Code:
Dies ist eine Funktion. Benutze es so:
bekommen:
Erklärung des älteren Codes:
Der neuere Code ist im Grunde derselbe, nur mit terserer Syntax:
Die Karte generiert ein Array voller
any
Konstrukte, die sich zu größerenany
Konstrukten multiplizieren und das Problem auf übersichtliche Weise lösen, ohne dass eine Schleife erforderlich ist.Nicht die kürzeste Sprache für das Programm, aber es ist eine sehr direkte Übersetzung des Problems.
quelle
Dyalog APL , 10 Bytes
Neue Lösung
Indexursprung unabhängig. Anonyme Funktion. Nimmt die Wahrscheinlichkeitsliste als Argument.
∘.×/
Die kartesische Produktreduktion ist vorbei⊢
die Argumentwerte,¨
jeweils gepaart mit1-⊢
die Komplementargumentwerte (lit. eins minus die Argumentwerte)TryAPL online!
Alte Lösung
Benötigt,
⎕IO←0
was auf vielen Systemen Standard ist. Fordert zur Eingabe der Wahrscheinlichkeiten auf.Erläuterung
|
absoluter Wert von⎕
die Eingabe, ɑ = [ ɑ ₁ ɑ ₂ ɑ ₃]∘.×.-
modifizierten inneren tensor multipliziert ( ɑ ₁ - B ₁) ⊗ ( ɑ ₂ - B ₂) ⊗ ( ɑ ₃ - b ₃), mit⊂⍳2
die beiliegende Liste b = [[0 1]]Mathematische Definition
Als ɑ ₁ b eingeschlossen ist, ist es Skalar, und daher auf die Länge des erweiterten ɑ , nämlich 3, so dass der gesamte Ausdruck ist
A = │ ( ɑ ₁ - b ) ⊗ ( ɑ ₂ - b ) ⊗ ( ɑ ₃ - b ) │ =
│ ( ɑ ₁ - [0,1]) ⊗ ( ɑ ₂ - [0,1]) ⊗ ( ɑ ₃ - [0,1]) = │
│ [ ɑ ₁, ɑ ₁ - 1] ⊗ [ ɑ ₂ , ɑ ₂ - 1] ⊗ [ ɑ ₃, ɑ ₃ - 1] │ =
⎢ ⎡ ⎡ ɑ ₁ ɑ ₂ ɑ₃ ⎤ ⎡ ɑ ₂ ( ɑ ₃-1) ⎤ ⎤ ⎥
⎢ ⎢ ⎣ ɑ ₁ ( ɑ ₂-1) ɑ ₃ ⎦ ⎣ ɑ ₁ ( ɑ ₂-1) ( ɑ ₃-1) ⎦ ⎥ ⎥
⎢ ⎢ ⎡ ( ɑ ₁-1) ɑ ₂ ɑ ₃ ⎤ ⎡ ( ɑ ₁-1) ɑ ₂ ( ɑ ₃-1) ⎥ ⎥ ⎤
⎢ ⎣ ⎣ ( ɑ ₁-1) ( ɑ ₂-1) ɑ ₃⎦ ⎣ ( ɑ ₁- 1) ( ɑ ₂-1) ( ɑ ₃-1) ⎦ ⎦ ⎥
TryAPL online!
Hinweise (gilt sowohl für alte als auch für neue Lösung)
Das Programm und die Formel funktionieren für eine beliebige Anzahl ( n ) von Variablen und geben in jeder Dimension ein n- dimensionales Array der Länge 2 zurück. Bei drei Variablen ist die Wahrscheinlichkeit eines bestimmten Ergebnisses
P ( p , q , r ) = A p , q , r,
das bequem aus dem Array mit
(⊃A)[p;q;r]
extrahiert werden kannp q r⌷⊃A
ZB
1 1 0⌷⊃|0.55 0.67 0.13∘.×.-⊂⍳2
ergibt P (55%, 67%, 13%) = 1,9305%quelle
PHP,
1059794 9387 BytesLaufen Sie wie folgt:
Beachten Sie, dass die Ausgabe Little Endian ist:
Erläuterung
Optimierungen
$p
auf 1 mit der Berechnung von kombiniert wurde$c
$i
anstatt es zu erhöhen$c
anstelle von$$i
quelle
C ++ 17,
137131129 BytesSpeichern von 6 Bytes durch Festlegen
#define A auto
, dass ein so kurzes Makro zum ersten Mal etwas speichert. -2 Bytes für die Verwendung#import
und das Löschen des Speicherplatzes vor<
Erzeugt alle möglichen Kombinationen.
Ungolfed:
Verwendung:
quelle