Kaplumbağalar için Fizz Buzz


35

Sorun Açıklaması

Izgara üzerinde bir kaplumbağa olduğunu hayal et. Sen iki sayıyı verilen konum f ve b ve doğuya bakan ediyoruz. Aşağıdaki kurallara göre, karşılaştığınız hücrelerin her birini sayarak ızgara boyunca bir yürüyüş gerçekleştirirsiniz:

  • Varsayılan olarak, sayımı içinde bulunduğunuz hücreye yazıp ileriye doğru yürüyün.
  • Sayı f ile bölünebilirse , Fbulunduğunuz hücreye yazıp sağa dönün, sonra ileriye doğru yürüyün.
  • Sayı b ile bölünebilir ise , Bbulunduğunuz hücreye yazın, sonra sola dönün, sonra ileri yürüyün.
  • Sayımı ikisi tarafından bölünebilir ise f ve b , yazdığınız FBsonra ileriye yürümek, sen geldin hücreye.
  • Daha önce bulunduğunuz bir kareye ulaşırsanız, durursunuz.

Örneğin, f = 3 ve b = 5 kullanarak bu kurallara uymak, şunun gibi bir model üretecektir:

    F 28 29 FB  1  2  F
   26                 4
 F  B                 B  F
23                       7
22                       8
 F  B                 B  F
   19                11
    F 17 16 FB 14 13  F

Meydan okuma

İki sayıyı girdi olarak kabul eden, f ve b'ye karşılık gelen ve yukarıdaki kurallar tarafından verilen bu sayıların modelini çıktı olarak üreten bir program veya işlev yazın .

Biçimlendirme gereksinimleri:

  • Her hücre iki karakter genişliğindedir
  • Hücre içeriği bu iki karakter içinde sağa hizalanır
  • Aynı satırdaki hücreler bir boşlukla sınırlandırılır
  • İlk hücre sütunu boş olmayan bir hücre içermelidir
  • Tüm satırlar boş olmayan hücreler içermelidir
  • İzleyen beyaz boşluk gerekli değil, ancak izin veriliyor
  • Ancak, her satırın toplam genişliği boş olmayan sütun sayısının 3 katını geçmemelidir

Kodunuz, sağlanan test durumları için çalışmalıdır.

Standart boşluklara izin verilmez.

Bu kod golf; bayt cinsinden en kısa cevap kazanır.

Test durumları

(f = 3, b = 5 durum nezaket kolaylığı olarak burada tekrarlanmıştır).

f=3, b=5 ->
    F 28 29 FB  1  2  F
   26                 4
 F  B                 B  F
23                       7
22                       8
 F  B                 B  F
   19                11
    F 17 16 FB 14 13  F

f=4, b=10 ->
 F 25 26 27  F
23          29
22        1  2  3  F
21                 5
FB                 6
19                 7
18           B  9  F
17          11
 F 15 14 13  F

f=3, b=11 ->
 F 16 17  F
14       19
13     1  2  F
 F  B        4
   10        5
    F  8  7  F

f=5, b=9 ->
    F 41 42 43 44  1  2  3  4  F
   39                          6
   38                          7
   37                          8
 F  B                          B  F
34                               11
33                               12
32                               13
31                               14
 F 29 28  B              B 17 16  F
         26             19
          F 24 23 22 21  F

f=5, b=13 ->
    F 31 32 33 34  F
   29             36
   28        1  2  3  4  F
   27                    6
 F  B                    7
24                       8
23                       9
22              B 12 11  F
21             14
 F 19 18 17 16  F

1
Girdilerin 100'e çıkmadan önce daima bir çarpışmaya yol açacağının garantisi var mı?
Martin Ender

Evet. Daha genel olarak, kodunuz verilen test durumları için çalıştığı sürece, gitmeniz iyi olur.
H Walters

1
Sizin (kaplumbağanın) başladığı belli bir yer var mı?
Kritixi Lithos

@KritixiLithos No. Şebekenin sol / üst / sağ / alt kısmı, kaplumbağanın nasıl hareket ettiği ile tanımlanır, bu f ve b'ye bağlıdır.
H Walters

F ve b her zaman tam sayı mıdır?
corvus_192

Yanıtlar:


1

JavaScript (ES6), 230 240

(f,b)=>(d=>{for(g=[s=x=y=d];!(r=g[y]=g[y]||[])[x];d&1?d&2?y?--y:g=[,...g]:++y:d&2?x?--x:g=g.map(r=>[,...r]):++x)o=++s%f?'':(++d,'F'),s%b||(--d,o+='B'),r[x]=o||s})(0)||g.map(r=>[...r].map(c=>` ${c||' '}`.slice(-2)).join` `).join`
`

Daha az golf oynadı

(f,b)=>{
  for(g=[s=x=y=d=0]; !(r = g[y]= g[y]||[])[x]; )
  {
    o=++s%f?'':(++d,'F')
    s%b||(--d,o+='B')
    r[x]=o||s,
    d&1
      ? d&2 ? y ? --y : g=[,...g] : ++y
      : d&2 ? x ? --x : g=g.map(r=>[,...r]) : ++x
  }
  return g.map(r=>[...r].map(c=>` ${c||' '}`.slice(-2)).join` `)
          .join`\n`
}

Ölçek

F=
(f,b)=>(d=>{for(g=[s=x=y=d];!(r=g[y]=g[y]||[])[x];d&1?d&2?y?--y:g=[,...g]:++y:d&2?x?--x:g=g.map(r=>[,...r]):++x)o=++s%f?'':(++d,'F'),s%b||(--d,o+='B'),r[x]=o||s})(0)||g.map(r=>[...r].map(c=>` ${c||' '}`.slice(-2)).join` `).join`
`


function update()
{
  var i = I.value.match(/\d+/g)||[],f=+i[0],b=+i[1]
  O.textContent = (f>0 & b>0) ? F(f,b) : ''
}  

update()
<input id=I value="3 5" oninput="update()">
<pre id=O></pre>


5

Python 2, 379 338 326 bayt

Girdiyi virgülle ayırarak iki sayı olarak alır. Örneğin. 4,5veya(4,5)

d=x=y=i=q=Q=e=E=0
p={}
f,b=input()
while(x,y)not in p:
 i+=1;l,r=i%b<1,i%f<1;d=(d+r-l)%4;p[x,y]=[[`i`,'F'][r],' F'[r]+'B'][l].rjust(2);q=min(q,x);Q=max(Q,x);e=min(e,y);E=max(E,y)
 if d%2:x+=(d==1)*2-1
 else:y+=(d!=2)*2-1
h,w=E-e+1,Q-q+1
A=[h*['  ']for x in' '*w]
for x,y in p:A[x-q][y-e]=p[x,y]
print'\n'.join(map(' '.join,A))

Yol 99, 384 343 330 bayttan uzunsa çalışan sürüm

2 önemli basamak gösterir.

d=x=y=i=q=Q=e=E=0
p={}
f,b=input()
while(x,y)not in p:
 i+=1;l,r=i%b<1,i%f<1;d=(d+r-l)%4;p[x,y]=[[`i%100`,'F'][r],' F'[r]+'B'][l].rjust(2);q=min(q,x);Q=max(Q,x);e=min(e,y);E=max(E,y)
 if d%2:x+=(d==1)*2-1
 else:y+=(d!=2)*2-1
h,w=E-e+1,Q-q+1
A=[h*['  ']for x in' '*w]
for x,y in p:A[x-q][y-e]=p[x,y]
print'\n'.join(map(' '.join,A))

Örnekler:

input=(4,16)

 F 21 22 23  F
19          25
18          26
17          27
FB  1  2  3  F
15           5
14           6
13           7
 F 11 10  9  F

input=(6,7) (kısaltılmış versiyon)

                                              F 63 64 65 66 67 FB  1  2  3  4  5  F                                             
                               F 57 58 59 60  B                                   B  8  9 10 11  F                              
                              55                                                                13                              
                   F 51 52 53  B                                                                 B 15 16 17  F                  
                  49                                                                                        19                  
                  48                                                                                        20                  
          F 45 46  B                                                                                         B 22 23  F         
         43                                                                                                          25         
         42                                                                                                          26         
         41                                                                                                          27         
    F 39  B                                                                                                           B 29  F   
   37                                                                                                                      31   
   36                                                                                                                      32   
   35                                                                                                                      33   
   34                                                                                                                      34   
 F  B                                                                                                                       B  F
31                                                                                                                            37
30                                                                                                                            38
29                                                                                                                            39
28                                                                                                                            40
27                                                                                                                            41
FB                                                                                                                            FB
25                                                                                                                            43
24                                                                                                                            44
23                                                                                                                            45
22                                                                                                                            46
21                                                                                                                            47
 F  B                                                                                                                       B  F
   18                                                                                                                      50   
   17                                                                                                                      51   
   16                                                                                                                      52   
   15                                                                                                                      53   
    F 13  B                                                                                                           B 55  F   
         11                                                                                                          57         
         10                                                                                                          58         
         09                                                                                                          59         
          F 07 06  B                                                                                         B 62 61  F         
                  04                                                                                        64                  
                  03                                                                                        65                  
                   F 01 00 99  B                                                                 B 69 68 67  F                  
                              97                                                                71                              
                               F 95 94 93 92  B                                   B 76 75 74 73  F                              
                                              F 89 88 87 86 85 FB 83 82 81 80 79  F                                             

@Edit: Jonathan Allan, Copper ve shooqie sayesinde bana bir sürü bayt kazandırdı.


Heh, bu N, 4N kalıpları oldukça havalı.
steenbergh

Aferin. Değişebilirsin while((x,y)not in p.keys()):için while(x,y)not in p:ve for x,y in p.keys():için for x,y in p. Değişebilirsin l,r=i%b==0,i%f==0için l,r=i%b<1,i%f<1ve d=(d+[0,1][r]-[0,1][l])%4için d=(d+r-l)%4. Değişebilirsin s=[[`i`,'F'][r],' F'[r]+'B'][l].rjust(2);p[(x,y)]=siçin p[(x,y)]=[[`i`,'F'][r],' F'[r]+'B'][l].rjust(2). Daha fazlası olabilir
Jonathan Allan

Bunun h*[' ']for x in rangeyerine bir bayt kaydedebilirsiniz [' ']*h for x in range. Ayrıca, x+=[-1,1][d==1]ile değiştirilebilir x+=(d==1)*2-1ve y+=[1,-1][d==2]ile değiştirilebilir y+=(d!=2)*2-1. Ayrıca, f,b=inputttbir yazım hatası mı?
Bakır,

p[(x,y)]=> p[x,y](Python 2'de çalışıp çalışmadığından emin değilim)
shooqie 11

4

Excel VBA, 347 421 bayt

Yeni sürüm, boşluk gereksinimleri ile başa çıkmak için. Bunu ilk sürümümde bulundurmamak benim açımdan bir gözetim değildi, ancak bu, bayt sayısının karşılığını alıyor ... Şimdi kullanılan aralığı keserek hücreye yapıştırıyor A1.

Sub t(f, b)
x=70:y=70:Do:s=s+ 1
If Cells(y,x).Value<>"" Then
ActiveSheet.UsedRange.Select:Selection.Cut:Range("A1").Select:ActiveSheet.Paste:Exit Sub
End If
If s Mod f=0 Then Cells(y,x).Value="F":q=q+1
If s Mod b=0 Then Cells(y,x).Value=Cells(y,x).Value & "B":q=q+3
If Cells(y,x).Value="" Then Cells(y,x).Value=s
Select Case q Mod 4
Case 0:x=x+1
Case 1:y=y+1
Case 2:x=x-1
Case 3:y=y-1
End Select:Loop:End Sub

İşte son sonucu taşımayan eski sürüm A1

Sub t(f,b)
x=70:y=70:Do:s=s+1:if Cells(y,x).Value<>"" then exit sub
If s Mod f=0 Then
Cells(y,x).Value="F":q=q+1
End If
If s Mod b=0 Then
Cells(y,x).Value=Cells(y,x).Value & "B":q=q+3
End If
If Cells(y,x).Value="" Then Cells(y,x).Value=s
Select Case q mod 4
Case 0:x=x+1
Case 1:y=y+1
Case 2:x=x-1
Case 3:y=y-1
End Select:Loop:End Sub

70, 70 (veya Excel'de BR70) ile başlar ve çevresinde yürür. İşlev fve bparametreleri olarak çağrılır :Call t(4, 16)

@Neil bana bir sürü bayt kurtardı, teşekkürler!


1
Eğer değiştirirseniz q=q-1ile q=q+3ve Select Case qile Select Case q Mod 4o zaman önceki iki tabloların kurtulabilirsiniz.
Neil

However, the total width of each row must not exceed 3 times the number of non-empty columnsSanırım bu sadece büyük bir şebeke
kurmaktan

1
@KarlNapf Sabit.
steenbergh

3

Excel VBA, 284 278 277 261 259 255 254 253 251 Bayt

Subdeğerleri, girdi alır rutin F, Bilgili hücrelere ve çıkışları Sheets(1)nesnesi (sınırlı olan Sheets(1)nesne 2 bayt tasarrufu için)

Sub G(F,B)
Set A=Sheet1
R=99:C=R
Do
I=I+1
Y=Cells(R,C)
If Y<>""Then A.UsedRange.Cut:[A1].Select:A.Paste:End
If I Mod F=0Then Y="F":J=J+1
If I Mod B=0Then Y=Y+"B":J=J+3
Cells(R,C)=IIf(Y="",i,Y)
K=J Mod 4
If K Mod 2Then R=R-K+2 Else C=C+1-K
Loop
End Sub

Kullanımı:

Call G(3, 4)

2

C, 349 Bayt

Gcc ile derler (birçok uyarıyla birlikte)

#define z strcpy(G[x][y],
char G[99][99][3];d=3,x=49,y=49,i=1,q,s=99,t,u=99,v;F(f,b){for(;!*G[x][y];i++){q=(!(i%f))<<1|!(i%b);q==3&&z"FB");if(q==2)z"F"),d=(d+3)%4;if(q==1)z"B"),d=(d+1)%4;!q&&sprintf(G[x][y],"%d",i);if(d%2)x+=d-2;else y+=d-1;s=s>x?x:s;t=t<x?x:t;u=u>y?y:u;v=v<y?y:v;}for(y=u;y<=v;puts(""),y++)for(x=s;x<=t;x++)printf("%2s ",G[x][y]);}

Biraz daha girintili bir sürüm:

#define z strcpy(G[x][y],
char G[99][99][3];
d=3,x=49,y=49,i=1,q,s=99,t,u=99,v;

F(f,b)
{
    for(;!*G[x][y];i++)
    {
        q=(!(i%f))<<1|!(i%b);
        q==3&&z"FB");
        if(q==2)z"F"),d=(d+3)%4;
        if(q==1)z"B"),d=(d+1)%4;
        !q&&sprintf(G[x][y],"%d",i);
        if(d%2)x+=d-2;else y+=d-1;
        s=s>x?x:s;t=t<x?x:t;u=u>y?y:u;v=v<y?y:v;
    }
    for(y=u;y<=v;puts(""),y++)for(x=s;x<=t;x++)printf("%2s ",G[x][y]);
}

İşte 100'den büyük sayıları işleyen 364 baytlık bir sürüm.

#define g G[x][y]
#define z strcpy(g,
char G[99][99][9];d=3,x=49,y=49,i=1,q,s=99,t,u=99,v;F(f,b){for(;!*g;i++){q=(!(i%f))<<1|!(i%b);q==3&&z"FB");if(q==2)z" F"),d=(d+3)%4;if(q==1)z" B"),d=(d+1)%4;!q&&sprintf(G[x][y],"%2d",i);if(d%2)x+=d-2;else y+=d-1;s=s>x?x:s;t=t<x?x:t;u=u>y?y:u;v=v<y?y:v;}for(y=u;y<=v;puts(""),y++)for(x=s;x<=t;x++)printf("%2s ",g+strlen(g)-2);}

1

Perl, 275 bayt

Girinti okunabilirlik için sağlanmıştır ve kodun bir parçası değildir.

($f,$e)=@ARGV;
for($i=$x=1,$y=0;!$m{"$x,$y"};$i++){
    ($g,$m{"$x,$y"})=$i%$e&&$i%$f?($g,$i):$i%$f?($g+1,B):$i%$e?($g-1,F):($g,FB);
    ($g%=4)%2?($y+=$g-2):($x+=1-$g);
    ($a>$x?$a:$b<$x?$b:$x)=$x;
    ($c>$y?$c:$d<$y?$d:$y)=$y
}
for$k($c..$d){
    printf("%*s",1+length$i,$m{"$_,$k"})for$a..$b;
    say
}

Açıklama:

Kod, kaplumbağanın bulunduğu tüm yerlerin bir karmasını ve içinde depolanan uygun değeri izleyerek çalışır %m. Örneğin: in 3 5, $m{0,2}içerir 2ve $m{1,-3}= 26. Bu şekilde önceden tanımlanmış bir yere ulaşana kadar devam eder. Ek olarak, kaplumbağa yolunun mevcut sınırlarını $a,$b,$c,$dmaksimum ve minimum olarak kullanarak izler .

Halihazırda olduğu bir yere ulaştığında, sınırları kullanarak her şeyi boşluklarla doldurulmuş yolu yazdırır.

Yolun boyutunda ve sayıların boyutunda bir sınır yoktur.


1

PHP , 292 bayt

for($x=$y=$u=$l=0;!$q[$x][$y];$s="") {
    ++$i%$argv[1]?:$a-=1+$s="F";
    $i%$argv[2]?:$a+=1+$s.="B";
    $q[$x][$y]=$s?:$i;
    $z=[1,-2,-1,2][$a=($a+4)%4];
    $y+=$z%2;
    $x+=~-$z%2;
    $u>$y?$u=$y:$d>$y?:$d=$y;
    $l>$x?$l=$x:$r>$x?:$r=$x;
}
for(;$l++<=$r;print"\n")for($j=$u-1;$j++<=$d;)echo str_pad($q[$l-1][$j],3," ",0);

Çevrimiçi deneyin!

Girintiler netlik içindir, sayılmaz.

Perl cevabı ile aynı algoritmayı izler. Kaplumbağanın 2B dizide $aolduğu yeri, kaplumbağanın bulunduğu yeri ve $u, $d, $l, $ryazdırma için sınırları izleyin. str_padHer bir girişin baskı formatlama için tam 3 boşluk olduğundan emin olmamızı sağlar.

Bazı sebeplerden dolayı, PHP, değişkenlerin yarısını 0 olarak başlatmamı engellemiyor, ama başkaları başlatmazsam, genellikle ilk başlatılmadıklarında 0 olarak sıfırlanamayan değişkenleri ele almasına rağmen biçimlendirmeyi bozuyor Kullanılmış. Bu yüzden $x=$y=$u=$l=0bit.


0

Python 2 , 267 262 258 249 245 243 bayt

f,b=input()
X=x=Y=y=i=p=0
g={}
S=sorted
while(p in g)<1:i+=1;g[p]='F'[i%f:]+'B'[i%b:]or`i`;p+=1j**(i/f-i/b);X,_,x=S([X,x,int(p.real)]);Y,_,y=S([Y,y,int(p.imag)])
j=Y
while j<=y:print' '.join(g.get(i+j*1j,'').rjust(2)for i in range(X,x+1));j+=1

Çevrimiçi deneyin!

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.