Downward Number Race

10

Ihre Aufgabe ist es, ein Programm zu erstellen, das Zufallszahlen zu früheren Summen im ultimativen Showdown für Zahlenrennen hinzufügt.

Jeder Rennfahrer (Spalte) startet bei 0 und addiert bei jedem Schritt des Rennens entweder 1 oder 0 zur vorherigen Summe, bis alle Rennfahrer die zum Gewinnen erforderliche Punktzahl erreicht haben. Die 1 oder 0 sollte zufällig ausgewählt werden (die Standarddefinition für zufällig finden Sie hier ). Die Ausgabe zeigt das Ergebnis des Rennens, wobei jede Spalte einen Rennfahrer in diesem Format darstellt:

>> racers:5,score needed:2

0 0 0 0 0 # all racers start at 0
+ + + + + # add
1 0 0 0 1 # random 1 or 0
= = = = = # equals
1 0 0 0 1 # sum
+ + + + +
0 0 0 0 1
= = = = =
1 0 0 0 2 # winner!
+ + + +  
1 1 1 1  
= = = =  
2 1 1 1  
  + + +  
  1 1 1  
  = = =  
  2 2 2   # losers

Hinweis: Nur die Zahlen + und = müssen in der Ausgabe enthalten sein.

Eingang

Ihr Programm akzeptiert die folgenden zwei Parameter als Eingabe:

  1. die Anzahl der Rennfahrer (Spalten), die größer als zwei sein muss
  2. Die zum Gewinnen erforderliche Punktzahl muss größer als eins sein

Dies ist Code-Golf - das Programm mit den wenigsten Bytes gewinnt.

Bearbeiten: Es gibt eine nicht durchsetzbare maximale Punktzahl von 9 - dies dient dazu, die Integrität der Spalte zu erhalten. Außerdem können Leerzeichen zwischen Spalten in der Ausgabe weggelassen werden.

Atlasologe
quelle
Was ist die maximale Anzahl von Spalten und die maximale Punktzahl, die unterstützt werden müssten?
Nanofarad
Es gibt kein definiertes Maximum, daher entspricht es dem Minimum: mindestens drei Spalten und eine Punktzahl von zwei.
Atlasologe
3
Wird die erforderliche Punktzahl zweistellig sein?
Undichte Nonne
4
"Nur die Zahlen + und = müssen in die Ausgabe aufgenommen werden." was ist mit den Räumen?
Undichte Nonne
Die Räume müssen nicht erhalten bleiben, sie dienen der Übersichtlichkeit halber im Beispiel. Gute Frage zu den beiden Ziffern - ich nehme an, es gibt eine maximale Punktzahl von neun. Ich werde die Frage bearbeiten.
Atlasologe

Antworten:

5

Gelee, 37 36 33 Bytes

,‘X
0Ç<³$пµżIFµ“+=”ṁṖ⁸żF
ÇСḊz⁶G

3 Bytes dank Dennis.

Probieren Sie es online aus

Erläuterung

,‘X                    Helper link. Argument: n. Radomly return n or n+1.

 ‘                     Increment n
,                      Pair. Yield [n, n+1]
  X                    Return a random item from the pair.

0Ç<³$пµżIFµ“+=”ṁṖ⁸żF   Monadic link. Argument: s. Generate one racer.

0                       Start with value 0.
  <³$пµ                While value is less than s:
 Ç                        Use helper link to increment current value.
                        Collect intermediate results in a list.
         I              Compute consecutive differences.
        ż               Zip intermediate results with their next increment value 0 or 1.
          Fµ            Flatten. Let's call the current list A.
                        Odd items of A are racer state and even items are random 0 or 1.
            “+=”        Yield "+=".
                 Ṗ      Yield A without its last element.
                ṁ       Mold i.e Repeat the characters of the string until it contains length(A)-1 characters.
                  ⁸ż    Zipwith. Pair the elements of A with the correponding characters
                    F   Flatten.

ÇСṫ2z” G               Main link. Arguments: s (score needed), r (#racers)

ÇС                     Call the link above r times.
                        Generate a list of r racers.
   Ḋ                    Remove first element of the list (its a garbage s value)
    z⁶                  Transpose with space as fill value.
      G                 Grid. Format the result.
Essari
quelle
Sie können den ersten Hilfslink durch ersetzen ,‘X(Paar mit inkrementiertem n , zufällige Auswahl). Im Hauptlink ṫ2kann durch (Dequeue) und durch die Variable ersetzt werden .
Dennis
5

Pyth , 38 34 Bytes

j.tm + j \ = jL \ + C, .u + NYJ.WnsHQ + ZO2Y0J + \ = QE
j.tmj \ = jL \ +. T, .u + NYJ.WnsHQ + ZO2Y0JE

Probieren Sie es online aus!

Undichte Nonne
quelle
2

TSQL, 367 345 341 Bytes

Golf gespielt

DECLARE @r int=20, -- racers
        @g char=2  -- goal

DECLARE @ varchar(99)=REPLICATE('0',@r)a:PRINT @
DECLARE @A varchar(99)='',@s varchar(99)='',@i int=0WHILE @i<@r
SELECT
@i+=1,@A+=char(43-x*11),@s+=IIF(x=1,' ',LEFT(y,1)),@=RIGHT(@,@r-1)+IIF(x=1,' ',REPLACE(LEFT(@,1)+y,@g+1,' '))FROM(SELECT
IIF(LEFT(@,1)IN('',@g),1,0)x,ROUND(RAND(),0)y)z
PRINT @A+'
'+@s+'
'+REPLACE(@A,'+','=')IF @>''goto a

Probieren Sie es online aus

Ungolfed:

DECLARE @r int=10, -- racers
        @g char=2  -- goal

DECLARE @ varchar(99)=REPLICATE('0',@r)
a:
PRINT @
DECLARE @A varchar(99)='',@s varchar(99)='',@i int=0

WHILE @i<@r
  SELECT
    @i+=1,
    @A+=char(43-x*11),
    @s+=IIF(x=1,' ',LEFT(y,1)),
    @=RIGHT(@,@r-1)+IIF(x=1,' ',REPLACE(LEFT(@,1)+y,@g+1,' '))
  FROM(SELECT IIF(LEFT(@,1)IN('',@g),1,0)x,ROUND(RAND(),0)y)z

PRINT @A+'
'+@s+'
'+REPLACE(@A,'+','=')

IF @>''GOTO a

Beachten Sie, dass der zufällige Startwert auf der Teststelle immer derselbe ist und jedes Mal das gleiche Ergebnis liefert. In der Studiomanagement werden unterschiedliche Ergebnisse erzielt. Kann unterschiedliche Werte für Rennfahrer und Ziel verwenden, um ein anderes Bild zu erhalten

t-clausen.dk
quelle
1

Python 3, 237 Bytes

from random import*
def f(n,t):
 x='0'*n,;i=j=0;y=''
 while' '*n!=x[i]:
  if j==n:j=0;x+=y,;y='';print(x[i]);i+=1
  y+=' 'if x[i][j]in(' ',str(t))else eval(["'+'","str(randint(0,1))","'='","str(int(x[i-3][j])+int(x[i-1][j]))"][i%4]);j+=1

Eine Funktion, die Eingaben über Argumente entgegennimmt und in STDOUT druckt. Dieser Ansatz nutzt die Tatsache, dass die Ausgabe für alle Rennfahrer einem Zyklus der vierten Periode in der Form '+ Wert = Wert' folgt. Mit einem Zähler Modulo 4 kann eine Liste mit dem gewünschten Wert für jeden Schritt als Zeichenfolge indiziert und das Ergebnis mit der Bewertungsfunktion von Python ausgewertet werden.

Wie es funktioniert

from random import*                       Import Python's random module to access the
                                          randint function
def f(n,t):                               Function with input number of racers n and target
                                          number t
x='0'*n,;i=j=0;y=''                       Initialise return tuple storage x, state number
                                          i, racer number j and append string y for x
while' '*n!=x[i]:                         Loop through all j for some i. If the current
                                          state consists only of spaces, all racers have
                                          finished, so stop
y+=...eval([...][i%4])...                 Index into list, using i mod 4, to find the
                                          desired process for the cycle step, and append to
                                          y
(If first step of cycle)
...+...                                   Plus sign
(If second step of cycle)
...str(randint(0,1))...                   Random number from (0,1)
(If third step of cycle)
...=...                                   Equals sign
(If fourth step of cycle)
...str(int(x[i-3][j])+int(x[i-1][j]))...  Addition of random number to previous racer
                                          'score'
...' 'if x[i][j]in(' ',str(t))...         But append space if the racer has previously
                                          finished, or has reached the target
...j+=1                                   Increment j
if j==n:j=0;x+=y,;y='';print(x[i]);i+=1   If j=n, all j must have been looped through.
                                          Reset j, append new state y to x, reset y, print
                                          current state to STDOUT and increment i. When
                                          this first executes, x contains only the initial
                                          state, meaning that this is printed and the cycle
                                          starts with the second state.

Probieren Sie es auf Ideone

TheBikingViking
quelle
1

Python 2 , 191 Bytes

from random import*
def c(p,w,r=[],l=0):
 while p:
	p-=1;s='0'
	while`w`>s[-1]:s+="+%s="%randint(0,1);s+=`eval(s[-4:-1])`;l+=2
	r+=[s]
 for z in map("".join,zip(*(t+l*' 'for t in r))):print z

Probieren Sie es online aus!


Python 3 , 200 Bytes

from random import*
def c(p,w,r=[],l=0):
 while p:
  p-=1;s='0'
  while str(w)>s[-1]:s+="+%s"%randint(0,1);s+="=%s"%eval(s[-3:]);l+=2
  r+=[s]
 for z in map("".join,zip(*(t+l*' 'for t in r))):print(z)

Probieren Sie es online aus!

Jitse
quelle
0

Python 2, 278 Bytes

import random
r=5
w=2
s=(0,)*r
while s.count(w)<len(s):
    print ''.join(map(lambda a:str(a),s))+"\n"+'+'*len(s)
    s = tuple(map(lambda x: x<w and x+random.randrange(2) or x,s))
    print ''.join(map(lambda a:str(a), s))+"\n"+'='*len(s)
    s = tuple([x for x in s if x!= w])

wo r ist die Nr. von Rennfahrern und w ist die Punktzahl zu gewinnen

Probieren Sie es hier aus!

Swadhikar C.
quelle
2
Ich habe Ihr Programm getestet, es zeigt nicht das in der Frage beschriebene Ergebnis, alles wurde nach links verschoben.
t-clausen.dk
0

Perl 5 , 150 Bytes

$,=$";say@n=(0)x(@e=('=')x(@p=('+')x<>));$t=<>;while(grep$_<$t,@n){@r=map{$_+=($g=0|rand 2);$g}@n;for$l(p,r,e,n){say map{$n[$_]>$t?$":$$l[$_]}0..$#n}}

Probieren Sie es online aus!

Die erste Eingabe ist die Anzahl der Rennfahrer, die zweite die erforderliche Punktzahl.

Xcali
quelle