Wie viele Würfel können Sie werfen, ohne die wahrscheinlichste Zahl zu würfeln?

26

Problem

Ausgehend von n=2Würfeln:

  • Wirf nWürfel, wobei jede Zahl 1 bis 6 auf jedem Würfel gleich wahrscheinlich ist.
  • Überprüfen Sie, ob ihre Summe der wahrscheinlichsten Summe für nWürfel entspricht 3.5*n.
    • Wenn sie gleich sind, kündigen Sie.
    • Andernfalls drucken nund von Anfang an mit n+2Würfeln wiederholen

Ihr Code muss diese Prozedur nicht genau ausführen, sollte aber eine zufällige Ausgabe liefern, die auf der Grundlage unserer Definition der Zufälligkeit wahrscheinlich äquivalent ist .

Ihr Programm sollte alle Zahlen in einer eigenen Zeile ausgeben. Wenn das Programm beispielsweise bis zu 8 Würfel hat und die wahrscheinlichste Zahl mit 8 Würfeln gewürfelt hat, wäre die Ausgabe:

2
4
6

Beispiellauf

Bei 2 Würfeln 7ist dies die wahrscheinlichste Summe. Nehmen wir an, die Zahlen waren 2und 3. Dann würden Sie drucken 2.

Bei 4 Würfeln 14ist dies die wahrscheinlichste Summe. Lassen Sie uns sagen , die Zahlen gerollt waren 3, 4, 2, und 5. Ist dann die Summe 14, so würde das Programm hier enden.

Die endgültige Ausgabe in diesem Fall ist "2".

Regeln

zoecarver
quelle
Diese Antwort ist in ihrer jetzigen Form sehr unklar. Gibt es eine Eingabe oder soll die Ausgabe aus keiner Eingabe als Schleife generiert werden? Gibt es Zufälligkeiten? Ich sehe keine Zufälligkeit.
HyperNeutrino
Übrigens, willkommen bei PPCG! :)
HyperNeutrino
Danke, Entschuldigung, das ist mir sehr neu. Was würde es klarer machen? Es gibt keine Eingabe, Sie sollten mit einem Würfel beginnen und sich so hoch wie möglich arbeiten.
Zoecarver
@pudility Wenn ich das richtig verstehe, soll ich 2, 4, 6, 8, ...jedes Mal so viele Würfel ausgeben , bis ich die wahrscheinlichste Zahl für diese Iteration erreicht habe?
HyperNeutrino
5
Vielen Dank, dass Sie sich die Zeit genommen haben, Ihre Herausforderung basierend auf unserem Feedback zu bearbeiten! Um es festzuhalten, wir haben einen Ort, an dem Sie Herausforderungen posten können, um einige Details vor dem Posten zu erarbeiten: die Sandbox .
FryAmTheEggman

Antworten:

17

Python 2 , 70 Bytes

from random import*
n=2
while eval("+randrange(6)-2.5"*n):print n;n+=2

Probieren Sie es online!

Der Trick besteht darin, die Summe zu berechnen, indem evaleine Zeichenfolge wie folgt erstellt wird

'+randrange(6)-2.5+randrange(6)-2.5'

mit nKopien des Ausdrucks verkettet. Der randrange(6)gibt eine Zufallszahl aus [0,1,2,3,4,5], die um den 2.5Durchschnitt von heruntergeschoben wird 0. Wenn die Summe if ist 0, whileschlägt die Bedingung fehl und die Schleife wird beendet.

Eine alternative Verwendung mapwar 4 Bytes länger:

from random import*
n=2
while sum(map(randrange,[6]*n))-2.5*n:print n;n+=2

Ich habe eine Reihe gleichlanger Ausdrücke für einen Würfel gefunden, die auf Null verschoben, aber nicht kürzer sind

randrange(6)-2.5
randint(0,5)-2.5
randrange(6)*2-5
uniform(-3,3)//1
xnor
quelle
11
Ich mag dieses! Hauptsächlich, weil es das einzige ist, das ich verstehe.
Zoecarver
7

MATL , 13 Bytes

`@E6y&Yrs@7*-

Probieren Sie es online!

Erläuterung

`       % Do...while top of the stack is truthy
  @E    %   Push 2*k, where k is the iteration index starting at 1
  6     %   Push 6
  y     %   Duplicate 2*k onto the top of the stack
  &Yr   %   Array of 2*k integers distributed uniformly in {1, 2, ..., 6}
  s     %   Sum
  @7*   %   Push 7*k
  -     %   Subtract
        % End (implicit). If the top of the stack is non-zero, the loop
        % proceeds with the next iteration. Else the loop is exited.
        % Display stack (implicit)
Luis Mendo
quelle
6

Jelly ,  19  14 Bytes

-5 Bytes mit Hilfe von Leaky Nun (Übergang von der Zählung zur Rekursion)

‘‘6ṗX_3.L⁶S?Ṅß

Ein vollständiges Programm druckt die Ergebnisse durch Zeilenumbrüche getrennt aus (ein zusätzliches Leerzeichen und eine neue Zeile werden ebenfalls gedruckt, und die Programmfehler am Ende).

Probieren Sie es online! - Jedes Mal, wenn 6 Würfel überschritten werden, tötet TIO dies aufgrund des Speicherverbrauchs, aber es funktioniert im Prinzip - es dauert auch ~ 40s, um dies zu tun.

Eine freundlichere 15-Byte-Version, die nicht so lange dauert oder so viel Speicher benötigt, ist hier verfügbar .

Wie?

Wirft rekursiv 2 weitere Würfel, bis die Summe der jeweils um 3,5 reduzierten Flächen Null ist. Dabei wird die Anzahl der Würfel gedruckt. Wenn die Null erreicht ist, wird versucht, ein Leerzeichen zu verwenden, das einen Tippfehler verursacht.

‘‘6ṗX_3.L⁶S?Ṅß - Main link: no arguments (implicit left=zero)
‘              - increment (initial zero or the previous result)
 ‘             - increment  (= # of dice to roll, n)
  6            - literal 6
   ṗ           - Cartesian power - all possible rolls of n 6-sided dice with faces 1-6
    X          - pick one of them
      3.       - literal 3.5
     _         - subtract 3.5 from each of the roll results
           ?   - if:
          S    -          sum the adjusted roll results (will be 0 for most common)
        L      - ...then: length (number of dice that were rolled)
         ⁶     - ...else: literal ' ' (causes error when incremented in next step)
            Ṅ  - print that plus a newline
             ß - call this link with the same arity (as a monad with the result)
Jonathan Allan
quelle
Wow, das sind sehr wenige Bytes. Gut gemacht! Ich zögere, es anzunehmen, bis noch ein paar Leute antworten.
Zoecarver
Ja, es ist normal, eine Weile zu warten, bevor man annimmt, selbst wenn man das jemals tut. Viele Leute geben es eine Woche oder zwei.
Jonathan Allan
Außerdem sollten Sie alle Iterationen ausgeben - nicht nur die letzte.
Zoecarver
Oh, ich habe auf eine alte Änderung geantwortet - das ändert alles, ich kann diese Methode nicht auf viele verschiedene Arten anwenden.
Jonathan Allan
Oh, warte nur n, OK, vielleicht ist es heilbar. Ich dachte, Sie meinten die Summen :)
Jonathan Allan
6

TI-BASIC, 28 Bytes

2→N
While mean(randInt(1,6,N)-3.5
Disp N
N+2→N
End

Erläuterung

  • randInt(1,6,N) generiert eine Liste von N Zufallszahlen von 1 bis 6
  • mean(randInt(1,6,N)-3.5 Ruft den Durchschnitt der Rollen um 3,5 nach unten verschoben
  • While setzt sich fort, bis der durchschnittliche Ausdruck gleich Null ist (die wahrscheinlichste Summe)
andrewarchi
quelle
5

R , 49 Bytes

n=2
while(sum(sample(6,n,T)-3.5)){print(n)
n=n+2}

sample(6,n,T)generiert n(Pseudo-) Zufallsstichproben aus dem Bereich 1:6mit Ersetzung. sumWenn Sie von jedem Element 3,5 subtrahieren, erhalten Sie ein Ergebnis, das genau dann 0 (falsch) ist, wenn es der häufigste Wert ist.

Probieren Sie es online!

Überspringt die ungeraden Würfelwürfe.

Giuseppe
quelle
Dies scheint jedes Mal 80 für mich auszugeben, möglicher Fehler?
Zoecarver
@pudility Sie können Leerzeichen am Ende hinzufügen, um es erneut zu versuchen. Jedes Mal werden die Eingaben / Code-Schnipsel zwischengespeichert
Giuseppe
3
@ Giuseppe Sie können den Cache in TIO unter Einstellungen deaktivieren.
13.
Nachdem ich den Cache wie @xnor deaktiviert hatte, funktionierte er sehr gut. Danke für die Antwort!
Zoecarver
@xnor wer wusste! Gut zu wissen in der Zukunft.
Giuseppe
4

Java 8, 123 149 113 108 Bytes

()->{for(int n=0,s=1,i;s!=n*7;){for(i=s=++n*2;i-->0;s+=Math.random()*6);if(s!=n*7)System.out.println(n*2);}}

Oder 107 Bytes, wenn wir stattdessen einen Object nullnicht verwendeten Parameter verwenden.

+26 Bytes für einen Bugfix, der von @Jules in den Kommentaren korrekt angegeben wurde.
-41 Bytes dank @ OliverGrégoires großartigem Denken!

Erläuterung:

Probieren Sie es hier aus.

()->{                           // Method without parameter nor return-type
  for(int n=0,                  //  Amount of dice
          s=1,                  //  Sum
          i;                    //  Index
      s!=n*7;){                 //  Loop (1) as long as the sum doesn't equal `n`*7,
                                //  because we roll the dice per two, and 3.5*2=7
    for(i=s=++n*2;              //   Reset both the index and sum to `n`*2,
                                //   so we can use random 0-5, instead of 1-6
                                //   and we won't have to use `+1` at `Math.random()*6`
        i-->0;                  //   Inner loop (2) over the amount of dice
        s+=Math.random()*6      //    And increase the sum with their random results
    );                          //   End of inner loop (2)
    if(s!=n*7)                  //   If the sum doesn't equal `n`*7
      System.out.println(n*2);  //    Print the amount of dice for this iteration 
  }                             //  End of loop (1)
}                               // End of method
Kevin Cruijssen
quelle
1
Ich denke es liegt ein Fehler in der Funktion vor. Wenn rgleich 3.5*n, sollte das Programm direkt beendet werden. Wenn ich die Funktion jedoch richtig verstehe, wird sie nvor dem Beenden ein letztes Mal gedruckt .
Raznagul
@raznagul Eigentlich wurde keine zusätzliche Zeit gedruckt. Es wurde jedoch abgehört. Was es vorher getan hat: zufällig 1-12 (Fehler 1: sollte 2-12 gewesen sein); Überprüfen Sie, ob dies gleich 7 ist: Wenn dies der Fall ist: Wir sind ohne Drucken fertig. Wenn nicht, wirf 2 Würfel erneut (Fehler 2 hätte 4 statt 2 Würfel sein müssen). dann drucken Sie 2 und erhöhen Sie num 2. Also enthielt es zwei Bugs (1-12 statt 2-12; und würfeln Sie wie 2 -> 2 -> 4 -> 6 -> ... anstelle von 2 -> 4 -> 6 -> ...). Es wurde jedoch korrekt gedruckt, da es nicht gegangen wäre, System.out.println(n),n+=2wenn res tatsächlich gleich wäre 3.5*n.
Kevin Cruijssen
2
"Wirf zwei Würfel auf einmal, indem du eine Zufallszahl von 2-12 auswählst" - dies ist wahrscheinlich nicht gleichbedeutend mit dem Würfeln von zwei Würfeln und dem Addieren der in der Frage geforderten Zahlen. Daher ist dies keine korrekte Lösung.
Jules
1
Kürzere von wenigen Bytes (113), aber wahrscheinlich noch golfable: ()->{for(int n=2,s=0,e=7,i;s!=e;n+=2,e+=7){for(i=n,s=n;i-->0;)s+=Math.random()*6;if(s!=e)System.out.println(n);}}. Auch in Bezug auf Jules 'Kommentar und meine Erklärung richtig. nist Würfel, sist Summe, ewird erwartet, iist Index. Schließlich beginnt die Summe damit n, a +1, nZeiten zu vermeiden , und s!=ewird wiederholt, weil ich nur nicht weiß, wie ich diesen Fall vermeiden soll.
Olivier Grégoire
1
Ich habe wieder ein bisschen Golf gespielt;)()->{for(int i=0,s=1,j;s!=i*7;){for(j=s=++i*2;j-->0;)s+=Math.random()*6;if(s!=i*7)System.out.println(i*2);}}
Olivier Grégoire
3

05AB1E , 22 20 Bytes

-2 Bytes dank Emigna

[YF6L.RO}7Y*;ïQ#Y=ÌV

Probieren Sie es online!

Erläuterung

[YF6L.RO}7Y*;ïQ#Y=ÌV
[                    # Infinite loop start
 YF     }            # Y times... (Y defaults to 2)
   6L.R               # Push a random number between 1 and 6 (why does this have to be so looooong ._.)
       O              # Sum
         7Y*;ï       # Push 3.5 * Y as an int
              Q      # Is it equal to 3.5 * Y?
               #     # If so: Quit
                Y    # Push Y
                 =   # Print without popping
                  ÌV # Set Y to Y + 2
Datboi
quelle
1
Wenn Sie sich bewegen, Onachdem .RSie )und entfernen können s.
Emigna
3

R, 48 44 42 Bytes

Eine 5-Byte-Verbesserung gegenüber Giuseppes Antwort .

while(sum(sample(6,F<-F+2,1)-3.5))print(F)

Dies (ab) verwendet die Tatsache, dass Fstandardmäßig eine Variable zugewiesen ist, FALSEdie erzwungen wird 0und dann inkrementiert werden kann, so dass wir keine Zählervariable initialisieren müssen.

rturnbull
quelle
1
natürlich können Sie zwei Bytes speichern durch den Aufruf sample(6)statt , sample(1:6)aber durchgestrichen 44 44 ist nach wie vor .... codegolf.stackexchange.com/a/82343/67312
Giuseppe
@ Giuseppe Natürlich, danke! Ich habe die Antwort jetzt bearbeitet.
Turnbull
2

PHP , 75 Bytes

for($d=2;(++$i*7/2-$r+=rand(1,6))||$i<$d;)$i%$d?:$d+=1+print"$d
".$r=$i="";

Probieren Sie es online!

Jörg Hülsermann
quelle
1
5^2/++$i*$d+=rand()%6ist eine etwas kürzere Bedingung für die Schleife. Ich denke auch, dass die aktuelle Schleife fälschlicherweise beendet wird, wenn der allererste gewürfelte "Würfel" eine "1" ist (es wird eine 0 für die Initiale generiert $d).
user59178
@ user59178 Schöne Idee, aber es könnte eine Division durch Null Fehler machen, also muss ich es modifizieren. Du hast Recht, meine Lösung hört in diesem Fall auf, was falsch ist.
Jörg Hülsermann
Ihre 45-Byte-Antwort ist ungültig, da die resultierende Verteilung nicht mit der in der Frage übereinstimmt (siehe hier) . Ich glaube, Ihre 42-Byte-Antwort verwendet auch die falsche Verteilung. es scheint zum Beispiel anzunehmen, dass es für zwei Würfel gleich wahrscheinlich ist, 2 und 7 als Summe zu haben.
@Pakk Ja, die 45-Byte-Antwort ist ungültig. Ich denke, Ihr Denken ist falsch, was bei der 42-Byte-Version passiert. Schauen Sie sich eine erweiterte Version an. Probieren Sie es online aus!
Jörg Hülsermann
@ JörgHülsermann Diese erweiterte Version bestätigt, was ich sage. In einer ordnungsgemäßen Implementierung sollte der Wert von $ r / $ i für größere Werte von $ i näher an 3,5 liegen, aber ich sehe das überhaupt nicht. Ich habe einen Durchschnitt von 1,16 für 9984 Würfel, das ist statistisch äußerst unwahrscheinlich.
1

Mathematica, 47 Bytes

For[n=1,Tr@RandomInteger[5,2n++]!=5n,Print[2n]]

-5 Bytes von LLlAMnYP

J42161217
quelle
1

05AB1E , 17 Bytes

[N·ÌD6Lã.R7;-O_#,

Probieren Sie es online!

Erläuterung

[                   # loop over N in 0...
 N·Ì                # push N*2+2
    D               # duplicate
     6L             # push range [1 ... 6]
       ã            # cartesian product (combinations of N*2+2 elements in range)
        .R          # pick one at random
          7;-       # subtract 3.5 from each dice roll
             O_#    # if sum == 0 exit loop
                ,   # otherwise print the copy of N*2+2
Emigna
quelle
1

Batch, 109 Bytes

@set/an=%1+2,s=n*5/2
@for /l %%i in (1,1,%n%)do @call set/as-=%%random%%%%%%6
@if %s% neq 0 echo %n%&%0 %n%

Ziemlich ärgerlich randomist, dass eine magische Umgebungsvariable nur während der Umgebungserweiterung durch einen zufälligen Wert ersetzt wird, was normalerweise vor dem Start der for-Schleife geschieht. callmacht es jedes Mal durch die Schleife geschehen, aber dann müssen Sie die %Zeichen verdoppeln , um zu verhindern, dass die Erweiterung vor der Schleife geschieht. Der Spaß beginnt, weil wir das Ergebnis mit 6 modulieren wollen, was ein echtes %Vorzeichen erfordert , das nun zweimal verdoppelt werden muss. Das Ergebnis sind sechs aufeinanderfolgende %s.

Neil
quelle
1

JavaScript (ES2015), 75 bis 78 Byte

f=(n=2)=>[...Array(n)].reduce(a=>a+Math.random()*6|0,n)==3.5*n?'':n+`
`+f(n+2)

Gibt eine durch Zeilenumbrüche getrennte Folge von Ergebnissen aus

Bearbeiten: Speichert ein Byte dank Shaggy, fügt 4 Bytes hinzu, um die Funktion bei 2 zu starten

Erläuterung

f=n=>
  [...Array(n)]                // Array of size n
    .reduce(                   // Combine each item
      a=>a+Math.random()*6|0,  // Add a random roll between 0 and 5 for each item
    n)                         // Start at n to correct rolls to between 1 and 6
    ==3.5*n                    // Compare total to most probable roll total
  ? ''                         // If true, end
  : n+'\n'+f(n+2)              // Otherwise, output n and continue

f=(n=2)=>[...Array(n)].reduce(a=>a+Math.random()*6|0,n)==3.5*n?'':n+`
`+f(n+2)

let roll = _ => document.getElementById('rolls').innerHTML = f();
document.getElementById('roll-button').onclick = roll;
roll();
<button id="roll-button">Roll</button>
<pre id="rolls"></pre>

andrewarchi
quelle
2
Speichern Sie ein Byte, indem Sie eine in Backticks eingeschlossene wörtliche Newline anstelle von verwenden '\n'.
Shaggy
Dies beginnt nicht mit n=2, sondern Sie müssen die Startanzahl der Würfel angeben, wenn die Funktion aufgerufen wird.
MT0
1

PHP - 89 Zeichen

$r=0;$n=2;while($r!=$n*3.5){$r=$i=0;while($i<$n){$r+=rand(1,6);$i++;}print $n."
";$n+=2;}
ein Slum
quelle
du brauchst nicht die erste $r=0;verwendung echoanstatt print $n."schreiben zu können als "$nund für schleifen anstatt während etwas in der after schleife zu machen oder vorher einige bytes zu speichern
Jörg Hülsermann
1

C (GCC) , 84 80 79 77 75 80 78 76 Byte

i;f(s,j){for(;s;s?printf("%d\n",i):0)for(j=i+=2,s=i*7/2;j--;)s-=1+rand()%6;}

Probieren Sie es online!

Cleblanc
quelle
1

Haskell 133 132 Bytes

import System.Random;import Control.Monad
s k=do n<-replicateM k$randomRIO(1,6);if sum n==7*div k 2 then pure()else do print k;s(k+2)

Dank an @Laikoni für die Vorschläge in den Kommentaren unten.

Davide Spataro
quelle
1.) Importe sollten in der Byteanzahl gezählt werden. 2.) return()kann gekürzt werden auf pure()und putStrLn$showkann gekürzt werden auf print.
Laikoni
Ich werde es sofort beheben. Vielen Dank
Davide Spataro
Einige weitere Kleinigkeiten: div k 2 thenkönnen div k 2thenund do print k;s(k+2)sind print k>>s(k+2).
Laikoni,
1

Oktave 55 Bytes

n=2;
while mean(randi(6,n,1))-3.5!=0
n
n=n+2;
end

Inspiriert von Andrewarchis Antwort. Wenn jemand irgendwelche Hinweise hat, um sie zu verkürzen, ist er willkommen.

Michthan
quelle
Wow, TI-BASIC und Octave haben überraschend ähnliche Syntaxen
andrewarchi
@andrewarchi Octave (die Online-Version verwende ich) ist nur die Grundlage für die Programmierung.
Michthan
1

Pyth , 20 Bytes

K2WnsmhO6K*K3.5K=+K2

Probieren Sie es online!

qwertz
quelle
Willkommen bei PPCG!
Martin Ender
Vielen Dank! Ich habe gerade das Pyth-Tutorial beendet und dachte, ich könnte es versuchen, obwohl dies wahrscheinlich immer noch verbesserungsfähig ist. Anregungen sind willkommen.
QWERTZ
0

QBIC , 40 Bytes

{[1,r|g=g+_r1,6|]~g=r*3.5|_X\g=0?r┘r=r+2

Das macht buchstäblich das, was die Herausforderung verlangt; scheint der kürzeste Weg zu sein, um die Verteilung richtig zu machen.

Erläuterung

{          DO infinitely
[1,r|      FOR a=1, a<=r (at start, r == 2), a++
g=g+       Add to g (0 at start)
  _r1,6|   a random number between 1 and 6 incl.
]          NEXT
~g=r*3.5   IF the result of all dice rolls equals the expected value
|_X        THEN quit
\g=0       ELSE, reset the dice total
?r┘        PRINT the number of dice used
r=r+2      and add 2 dice.
           END IF and LOOP are courtiously provided by QBIC at EOF.
steenbergh
quelle
0

JavaScript (ES6) - 69 Zeichen

r=n=>n?r(n-1)+(Math.random()*6|0)-2.5:0;f=(n=2)=>r(n)?n+`
`+f(n+2):""

console.log(f())

Erklärung :

r=n=>                                     # Roll n dice
     n?                                   # If there is a dice left to roll
       r(n-1)                             #   Roll n-1 dice
             +(Math.random()*6|0)         #   Add a random number from 0 .. 5
                                 -2.5     #   Subtract 2.5 so sum of average is 0
                                     :0   # Else total is 0

und:

f=(n=2)=>                                 # Start with n = 2
         r(n)                             # Roll n dice
             ?n+"\n"+f(n+2)               # If non-zero then concatenate n, newline and
                                          #    result for n+2 dice
                           :""            # If zero (average) terminate.
MT0
quelle
0

Calc2 0,7, 119 118 111 Bytes

using"runtime";for(n=2,d=0;d!=3.5*n;Console.WriteLine(n),n+=2)for(i=d=0;i++<n;)d+=Math.Int(Random().Next(1,7));

ungolfed:

using "runtime";
var d = 0;
var r = Random();
for(var n = 2; d != 3.5 * n; Console.WriteLine(n), n += 2)
{
    d = 0;
    for(var i = 0; i < n; i++)
        d += Math.Int(r.Next(1,7));
}

Ich könnte auf die Math.Int () verzichten, aber leider haben die Random (). Next () -Funktionen in 0.7 einen Fehler, bei dem alle statt ints double zurückgeben. Es wurde behoben, aber erst nachdem diese Frage gestellt wurde. Ich werde nichts gewinnen, aber hey, schöner Proof of Concept.

Bearbeiten:

  • unnötiger Platz zwischen using und "runtime" (-1 Byte) entfernt

Edit2:

  • entferne var r und erstelle ein neues Random wo es gebraucht wird (-4 byte)

  • i = 0, d = 0 in i = d = 0 (-2 Byte) geändert

  • inkrementiert i nach Prüfung (-1 Byte)

hstde
quelle
0

Ruby , 52 Bytes

s=x=2;(s=0;p x.times{s+=rand(6)-2.5};x+=2)while s!=0

Erläuterung

s=x=2;                                                # sum=2, x=2
      (                                  )while s!=0  # while sum != 0:
       s=0;                                           #  reset the sum
           p                                          #  print
             x.times{              };                 #  repeat x times:
                     s+=                              #   Add to sum:
                        rand(6)                       #    random int in 0..5
                               -2.5                   #    subtract average
                                                      #  (implicitly return x for printing)
                                     x+=2             #  Increment x by 2

Probieren Sie es online!

Wert Tinte
quelle
@Pakk beachten Sie die s=0am Anfang der Schleife und die Verwendung von x.times. Dies bedeutet, dass die Summe jedes Mal zurückgesetzt wird und dann xgewürfelt wird, was die richtige Verteilung sein sollte. Ich schreibe eine Erklärung meines Codes auf.
Wert Tinte
Sie haben Recht, ich war mit meinem Fazit zu schnell.
0

Javascript, 87 Zeichen

for(n=2;eval('+'.repeat(n).replace(/./g,x=>x+(Math.random()*6|0)))!=2.5*n;n+=2)alert(n)

Testen Sie mit console.loganstelle von alert:

for(n=2;eval('+'.repeat(n).replace(/./g,x=>x+(Math.random()*6|0)))!=2.5*n;n+=2)console.log(n)
console.log('Done')

Qwertiy
quelle
0

lua, 102 bytes

function r(n,t) for d=1,n do t=t+math.random(1,6)end return t==n*3.5 or print(n)or r(n+2,0)end r(2,0)

Oder die besser lesbare Version

function r(n,t) --recursive function does its magic, t is given to safe usage bytes(no local)
    for d=1,n do --roll n dice and count them up to the total (t)
         t =t+math.random(1,6)
    end 
    return t==n*3.5 or --check if t==n*3.5. If it is then it ends
           print(n) or --t != n*3.5 thus print n. print returns nil
           r(n+2,0) --both the check and the return value from print are false thus r gets executed.
end 
r(2,0) --start the process

Eine betrügerische Version für 96 Bytes

function r(n,t,m)t=t+m(1,6)+m(1,6)return t==n*3.5 or print(n)or r(n+2,t,m)end r(2,0,math.random)

Dies funktioniert so ziemlich genauso wie das erste, verwendet jedoch die Rollen früherer Aufrufe wieder. Aus diesem Grund kann ich die for-Schleife entfernen. Beide sind in lua 5.2 getestet

lenscas
quelle
0

Perl 6 , 48 Bytes

.say for 2,*+2...^{3.5*$_==sum (1..6).pick xx$_}
Sean
quelle
-1

PHP, 51 Bytes

$r=2;$n=2;while(rand(0,6)-2.5*$r){print $n;$n=$n+2;}
Shiva
quelle
Wenn Ihre Ausgabe immer 2 ist, dann ist dies keine gültige Antwort ...
Wenn wir $ n in der while-Schleife ausgeben, wird Folgendes ausgegeben: 2,4,6,8,10 .....
Shiva
2
Dennoch sehe ich nicht, wie dies den Anforderungen in der Frage entspricht. Sie verwenden zwei Variablen: "$ n" und "n". "n" ist undefiniert, wird also auf Null gesetzt. Sie drucken also effektiv eine gerade Zahl und haben eine Chance von 5/6, die nächste gerade Zahl zu drucken. Dies ist mathematisch nicht gleichbedeutend mit der Verteilung in der Frage.
Tippfehler, dass n immer 2 sein sollte, aktualisierten den Code.
Shiva
Immer noch nicht, was die Frage stellt ... Jetzt wirfst du einen Würfel, überprüfe, ob es fünf sind (= 2 * 2,5); Wenn der Würfel fünf ist, hören Sie auf, und wenn er nicht fünf ist, schreiben Sie die nächste gerade Zahl und fahren fort. Mathematisch effektiv dasselbe wie in der vorherigen Version des Codes.