Aşağı Sayı Yarışı


10

Göreviniz, nihai sayı yarış gösterisinde önceki toplamlara rastgele sayılar ekleyen bir program oluşturmaktır.

Her yarışçı (sütun) 0'dan başlar ve tüm yarışçılar kazanmak için gereken puana ulaşıncaya kadar yarışın her adımında önceki toplama 1 veya 0 ekler. 1 veya 0 rastgele seçilmelidir (rastgele standart tanımı burada bulunabilir ). Çıktı, yarışın sonucunu gösterecek ve her sütun bir yarışmacıyı temsil edecek şekilde şu biçimde:

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

Not: çıktıya yalnızca +, ve = sayılarının dahil edilmesi gerekir.

Giriş

Programınız girdi olarak aşağıdaki iki parametreyi kabul edecektir:

  1. ikiden fazla olması gereken yarışçı (sütun) sayısı
  2. kazanmak için gereken puan, ki bu birden fazla olmalıdır

Bu kod golf - en az bayt olan program kazanır.

Düzenleme: Uygulanamayan maksimum 9 puan var - bu, sütunun bütünlüğünü korumak içindir. Ayrıca, çıktıdaki sütunlar arasındaki boşluklar atlanabilir.


Desteklenmesi gereken maksimum sütun sayısı ve maksimum puan nedir?
nanofarad

Tanımlanmış bir maksimum yoktur, bu nedenle minimumla aynı olur: en az üç sütun ve iki puan.
atlasolog

3
Gereken skorun iki basamağı olacak mı?
Leaky Nun

4
"çıktıya yalnızca +, ve = sayılarının dahil edilmesi gerekir." boşluklar ne olacak?
Leaky Nun

Alanların korunmasına gerek yoktur, netlik için örnektir. İki basamak hakkında güzel bir soru - Sanırım dokuz olan bir maksimum puan var. Soruyu düzenleyeceğim.
atlasolog

Yanıtlar:


5

Jöle, 37 36 33 bayt

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

Dennis sayesinde 3 bayt.

Çevrimiçi deneyin

açıklama

,‘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.

İlk yardımcı bağlantıyı ,‘X(artan n ile eşleştir , rastgele seçim) ile değiştirebilirsiniz. Ana linkte ṫ2ile değiştirilebilir (Dequeue) ve değişken ile .
Dennis


2

TSQL, 367 345 341 bayt

golfed

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

Çevrimiçi deneyin

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

Test alanındaki rastgele tohumun her zaman aynı olacağını ve her seferinde aynı sonucu verdiğini unutmayın, stüdyo yönetiminde farklı sonuçlar verecektir. Yarışçılar için farklı değerler kullanabilir ve farklı bir resim elde etme hedefi


1

Python 3, 237 bayt

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

Bağımsız değişken üzerinden girdi alan ve STDOUT'a yazdırılan bir işlev. Bu yaklaşım, çıktının tüm yarışçılar için '+ değer = değer' biçimindeki dördüncü periyodu izlediği gerçeğinden faydalanmaktadır. Bir karşı modülo dört kullanılarak, dize olarak her adım için istenen değeri içeren bir liste indekslenebilir ve sonuç Python'un eval işlevi kullanılarak değerlendirilebilir.

Nasıl çalışır

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.

Ideone üzerinde deneyin


1

Python 2 , 191 bayt

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

Çevrimiçi deneyin!


Python 3 , 200 bayt

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)

Çevrimiçi deneyin!


0

Python 2, 278 bayt

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

burada r hayır. ve w kazanır.

Burada deneyin!


2
Programınızı test ettim, sonucu soruda açıklandığı gibi göstermiyor, her şey sola taşındı.
t-clausen.dk

0

Perl 5 , 150 bayt

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

Çevrimiçi deneyin!

İlk girdi yarışçı sayısı, ikincisi skor gereklidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.