Generiere Wahrscheinlichkeiten um einen Nummernblock

12

Angespornt durch diese Frage heute möchte ich interessante Möglichkeiten sehen, wie verschiedene Programmiersprachen einen Nummernblock in Wahrscheinlichkeiten verwandeln können. In kachelbasierten Spielen können Sie in der Regel mit einem Nummernblock in eine beliebige Richtung navigieren, je nachdem, wo sich Ihr Charakter gerade befindet. Wenn eine KI für diese Spiele Math.random() * 8nicht ausreicht, musste ich ein wenig kreativ werden, damit die Bewegung etwas natürlich aussieht und sich anfühlt.

Ein Nummernblock ist wie folgt definiert:

7 | 8 | 9
- - - - -
4 | x | 6
- - - - -
1 | 2 | 3

Bitte beachten Sie, dass 5 eine ungültige Zahl ist, da Sie nicht auf sich selbst übergehen können.

In allen Beispielen werden diese Wahrscheinlichkeiten verwendet: [50, 40, 30, 20, 10]

Wenn ich Wahrscheinlichkeiten generieren wollte 8, würde das so aussehen:

40 | 50 | 40 
-- | -- | --
30 | xx | 30
-- | -- | --
20 | 10 | 20

Die Ausgabe wäre [20, 10, 20, 30, 30, 40, 50, 40](mit 5 weggelassen) oder [20, 10, 20, 30, null, 30, 40, 50, 40](mit 5 vorhanden)

Wenn ich sie generieren wollte 1, würde das so aussehen:

30 | 20 | 10
-- | -- | --
40 | xx | 20
-- | -- | --
50 | 40 | 30

Die Ausgabe wäre [50, 40, 30, 40, 20, 30, 20, 10](mit 5 weggelassen) oder [50, 40, 30, 40, null, 20, 30, 20, 10](mit 5 vorhanden)

Sie können ein vollständiges Programm schreiben, das die Eingabe auf jede übliche Weise (Befehlszeile, stdin) übernimmt und die Ausgabe ausgibt, oder Sie können eine Funktion mit einem Zahlenargument schreiben, das die Ausgabe ausgibt oder zurückgibt. Ihr Programm oder Ihre Funktion sollte eine Zahl akzeptieren - die Position, um die herum generiert werden soll. Sie sollten diese Wahrscheinlichkeiten verwenden: [50, 40, 30, 20, 10](Sie müssen nicht fest codiert sein).

Kürzester Code in Bytes gewinnt. Standardlücken sind nicht zulässig. Antworten, die im verlinkten Thread gepostet wurden, sind nicht zulässig. Nachgestellte oder führende Leerzeichen sind zulässig. Sie können die Position 4je nach Wunsch als abwesend oder leer behandeln . Ich bin nicht zu wählerisch im Ausgabeformat - drucken Sie es als durch Kommas getrennte Zeichenfolgen oder als Array aus.

(Dies ist meine erste Frage, schont mich!)

Seiyria
quelle

Antworten:

5

CJam, 27 Bytes

12369874s_$\_r#m<f{#4-z)0S}

Probieren Sie es online im CJam-Interpreter aus .

Idee

Wenn wir die Ziffern um 5 im Gegenuhrzeigersinn durchgehen , erhalten wir die Zeichenkette 12369874oder eine ihrer Rotationen (abhängig vom Startpunkt).

Nach dem Drehen dieser Zeichenfolge, sodass sich die eingegebene Ziffer n ganz links befindet, haben die Ziffern in der gedrehten Zeichenfolge die folgenden Wahrscheinlichkeiten:

50 40 30 20 10 20 30 40

Betrachten wir die Indizes dieser Ziffern, die sind

 0  1  2  3  4  5  6  7

subtrahieren Sie 4 von jedem, um zu ergeben

-4 -3 -2 -1  0  1  2  3

und nehmen Sie absolute Werte zu bekommen

 4  3  2  1  0  1  2  3

wir müssen nur 1 addieren und eine 0 anhängen , um die gewünschten Wahrscheinlichkeiten zu erhalten.

Code

12369874s                   e# Push "12369874".
         _$                 e# Push a sorted copy, i.e., "12346789".
           \                e# Swap it with the unsorted original.
            _r#             e# Find the index of the input in an unsorted copy.
               m<           e# Rotate the unsorted original that many units left.
                 f{       } e# For each character C in "12346789":
                            e#   Push the rotated string.
                   #        e#   Find the index of C.
                    4-      e#   Subtract 4.
                      z     e#   Compute the absolute value.
                       )    e#   Add 1.
                        0S  e#   Push a 0 and a space.
Dennis
quelle
2

Prolog, 166 Bytes

a(A,R):-I:J:K:L:M=50:40:30:20:10,B is abs(5-A),member(B:S,[4:[I,J,K,J,L,K,L,M],3:[J,I,J,K,K,L,M,L],2:[K,J,I,L,J,M,L,K],1:[J,K,L,I,M,J,K,L]]),(A/5>1,reverse(S,R);S=R).

Dies nutzt die Tatsache, dass das Ergebnis für 9 das Gegenteil des Ergebnisses für 1 ist, dasselbe für 2 und 8, 3 und 7 und 4 und 6. Es gibt erkennbare Muster, die vom Ergebnis für 1 zum Ergebnis für 2,3 übergehen und 4, aber ich bin mir ziemlich sicher, dass es länger dauern würde, dies zu codieren, als die Sequenzen für 1 bis 4 fest zu codieren, was ich auch getan habe.

Beispiel: a(7,R).Ausgänge R = [30, 20, 10, 40, 20, 50, 40, 30].

Tödlich
quelle
Eine gültige Strategie, obwohl ich hoffe, dass einige Sprachen es einfacher machen, algorithmisch zu arbeiten, als es wäre, sie fest zu codieren. Ich nehme an, wir werden sehen.
Seiyria
@Seiyria Ich gehe davon aus, dass Array-orientierte Sprachen genau das tun werden. In der Regel können Sie in Prolog leider keine Listenelemente mit einer geringen Anzahl von Bytes permutieren.
Fatalize
0

Python - 115

a=[50,40,30,20,10,20,30,40]
b=[0,1,2,7,8,3,6,5,4]
def v(n):
 c=8-b[n-1]
 return[(a[c:]+a[:c])[e]for e in b if e-8]

aist ein Array mit den Werten in der Reihenfolge um den Nummernblock (gegen den Uhrzeigersinn von 1) und bordnet die Zahlen auf dem Nummernblock den Positionen um ihn herum zu. Basierend auf der Anzahl der Leerzeichen um das Nummernfeld für die eingegebene Nummer (bestimmt mit b) erstellt es ein Array mit so vielen Elementen, die von der Vorderseite abis zum Ende verschoben wurden , und bordnet die Elemente dann erneut so an, dass sie den Nummernfeldnummern entsprechen.

faubi
quelle
Sie können viel sparen, indem Sie eine erstellen /10und dann eine *10in Ihre Schleife einfügen.
Maltysen
Ist das nicht (a[c:]+a[:c])[e]gleich a[(c+e)%8]oder a[c+e-8]? Und dann cvereinfacht das Einstecken den Ausdruck.
Xnor
0

Pyth - 38 Bytes

Verwendet die gleiche Technik wie die Python-Antwort, mit Ausnahme der Basiskomprimierung für die beiden Arrays.

J_jC"3ê"T*RTm@.<jC"<àR"[email protected]

Probieren Sie es hier online .

Maltysen
quelle
Was machen die ê und à?
Phase
@ Phase der oben genannten Basiskomprimierung: codegolf.stackexchange.com/questions/40039/…
Maltysen
Diese kurzen Antworten werden mich immer wieder in Erstaunen versetzen.
Seiyria,
@Seiyria Ich kann wirklich empfehlen, Pyth zu lernen - diese Programme sehen viel komplizierter aus als sie sind :)
Orlp
0

Java, 190

void g(int n){int i[]={8,0,1,2,7,8,3,6,5,4};String v="54321234",s="";n=i[n];if(n>0)v=v.substring(8-n)+v.substring(0,8-n);for(n=0;n++<9;s=", ")if(n!=5)System.out.print(s+v.charAt(i[n])+"0");}

String v hält die Wahrscheinlichkeiten (geteilt durch 10) im Uhrzeigersinn, wobei input = 1 der Standardwert 50 ist.

int[]iÜbersetzt die Eingabe in einen Index in v. Zum Beispiel v.charAt(i[1])ist 5. Die Eingaben 0 und 5 sind ungültig, sodass sowohl i [0] als auch i [5] einen Platzhalterwert von 8 haben, der der Index für '\ 0' am Ende von v ist.

Ich drehe die Zahlen in v um den Wert i [n] nach rechts und drucke dann die Wahrscheinlichkeiten als durch Kommas getrennte Zeichenfolgen.

Jack Ammo
quelle