Balap Angka Turun

10

Tugas Anda adalah membuat program yang menambahkan angka acak ke jumlah sebelumnya dalam showdown balap nomor pamungkas.

Setiap pembalap (kolom) mulai dari 0 dan menambahkan 1 atau 0 ke jumlah sebelumnya pada setiap langkah perlombaan sampai semua pembalap mencapai skor yang diperlukan untuk menang. Angka 1 atau 0 harus dipilih secara acak (definisi standar acak dapat ditemukan di sini ). Output akan menampilkan hasil balapan, dengan masing-masing kolom mewakili satu pembalap, dalam format ini:

>> 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

Catatan: hanya angka, +, dan = yang perlu dimasukkan dalam output.

Memasukkan

Program Anda akan menerima dua parameter berikut sebagai input:

  1. jumlah pembalap (kolom), yang harus lebih besar dari dua
  2. skor yang dibutuhkan untuk menang, yang harus lebih besar dari satu

Ini adalah kode-golf - program dengan byte paling sedikit menang.

Sunting: ada skor maks 9 yang tidak dapat ditegakkan - ini untuk menjaga integritas kolom. Juga, spasi antar kolom dapat dihilangkan dalam output.

ahli atlasologi
sumber
Berapa jumlah maksimum kolom dan skor maksimum yang perlu didukung?
nanofarad
Tidak ada maks yang ditentukan, jadi itu akan sama dengan minimum: setidaknya tiga kolom dan skor dua.
atlasologist
3
Apakah skor yang dibutuhkan memiliki dua digit?
Leaky Nun
4
"hanya angka, +, dan = yang perlu dimasukkan dalam output." bagaimana dengan ruang?
Leaky Nun
Ruang tidak perlu dilestarikan, mereka ada dalam contoh untuk kejelasan. Pertanyaan bagus tentang dua digit - saya kira ada skor maksimal, yaitu sembilan. Saya akan mengedit pertanyaan.
atlasologist

Jawaban:

5

Jelly, 37 36 33 byte

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

3 byte berkat Dennis.

Cobalah online

Penjelasan

,‘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
sumber
Anda dapat mengganti tautan helper pertama dengan ,‘X(pasangan dengan n bertambah , pilihan acak). Di tautan utama ṫ2dapat diganti dengan (dequeue) dan dengan variabel .
Dennis
5

Pyth , 38 34 byte

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

Cobalah online!

Biarawati Bocor
sumber
2

TSQL, 367 345 341 byte

Golf

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

Cobalah online

Tidak Disatukan:

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

Perhatikan bahwa seed acak di lokasi pengujian akan selalu sama, memberikan hasil yang sama setiap kali, dalam manajemen studio akan memberikan hasil yang berbeda. Dapat menggunakan nilai yang berbeda untuk pembalap dan tujuan untuk mendapatkan gambar yang berbeda

t-clausen.dk
sumber
1

Python 3, 237 byte

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

Fungsi yang mengambil input melalui argumen dan mencetak ke STDOUT. Pendekatan ini memanfaatkan fakta bahwa output mengikuti siklus periode empat, dari bentuk '+ value = value', untuk semua pembalap. Dengan menggunakan modulo counter empat, daftar yang berisi nilai yang diinginkan untuk setiap langkah sebagai string dapat diindeks menjadi, dan hasilnya dievaluasi menggunakan fungsi eval Python.

Bagaimana itu bekerja

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.

Cobalah di Ideone

TheBikingViking
sumber
1

Python 2 , 191 byte

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

Cobalah online!


Python 3 , 200 byte

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)

Cobalah online!

Jitse
sumber
0

Python 2, 278 byte

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])

dimana r adalah no. pembalap dan w adalah skor untuk menang

Coba di sini!

Swadhikar C
sumber
2
Saya menguji program Anda, itu tidak menunjukkan hasil seperti yang dijelaskan dalam pertanyaan, semuanya telah dipindahkan ke kiri.
t-clausen.dk
0

Perl 5 , 150 byte

$,=$";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}}

Cobalah online!

Input pertama adalah jumlah pembalap, kedua adalah skor yang dibutuhkan.

Xcali
sumber