Fizz Buzz untuk Turtles

35

Deskripsi Masalah

Bayangkan Anda seekor kura-kura di atas kisi-kisi. Anda diberi dua angka f dan b , dan Anda menghadap ke timur. Anda melakukan pawai melintasi kisi-kisi, menghitung setiap sel yang Anda temui, sesuai dengan aturan berikut:

  • Secara default, Anda menulis hitungan ke sel tempat Anda berada, lalu berjalan maju.
  • Jika hitung dapat dibagi oleh f , Anda menulisF ke sel tempat Anda berada, lalu belok kanan, lalu berjalan maju.
  • Jika hitungannya dapat dibagi dengan b , Anda menulisB ke sel tempat Anda berada, lalu belok kiri, lalu berjalan maju.
  • Jika hitung dapat dibagi oleh f dan b , Anda menulisFB ke sel tempat Anda berada, lalu berjalan maju.
  • Jika Anda mencapai kotak Anda sudah pernah ke, Anda berhenti.

Misalnya, mengikuti aturan ini menggunakan f = 3 dan b = 5 akan menghasilkan pola seperti ini:

    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

Tantangan

Tulis program atau fungsi yang menerima dua angka sebagai input, yang sesuai dengan f dan b , dan menghasilkan sebagai pola untuk angka-angka ini diberikan oleh aturan di atas.

Persyaratan pemformatan:

  • Setiap sel memiliki lebar dua karakter
  • Konten sel disejajarkan dengan benar dalam dua karakter ini
  • Sel di baris yang sama dibatasi oleh spasi
  • Kolom sel pertama harus berisi sel yang tidak kosong
  • Semua baris harus mengandung sel yang tidak kosong
  • Trailing whitespace tidak diperlukan, tetapi diizinkan
  • Namun, total lebar setiap baris tidak boleh melebihi 3 kali jumlah kolom yang tidak kosong

Kode Anda harus berfungsi untuk kasus uji yang disediakan.

Celah standar tidak diijinkan.

Ini adalah kode golf; jawaban terpendek dalam byte menang.

Uji kasus

(f = 3, b = 5 kasus diulang di sini sebagai kenyamanan sopan).

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
H Walters
sumber
1
Apakah kami dijamin bahwa input akan selalu mengarah ke tabrakan sebelum mencapai 100?
Martin Ender
Iya nih. Secara umum, selama kode Anda berfungsi untuk kasus uji yang disediakan, Anda dapat melanjutkan.
H Walters
1
Apakah ada tempat khusus Anda (kura-kura) mulai?
Kritixi Lithos
@KritixiLithos No. Kiri / atas / kanan / bawah dari grid ditentukan oleh bagaimana penyu melakukan perjalanan, yang bergantung pada f dan b.
H Walters
Apakah f dan b selalu bilangan bulat?
corvus_192

Jawaban:

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

Kurang golf

(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`
}

Uji

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>

edc65
sumber
5

Python 2, 379 338 326 byte

Mengambil input sebagai dua angka, dipisahkan oleh koma. Misalnya. 4,5atau(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))

Versi yang berfungsi jika jalur lebih panjang dari 99, 384 343 330 byte

Menunjukkan 2 digit signifikan.

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

Contoh:

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) (versi memotong)

                                              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: Terima kasih kepada Jonathan Allan, Copper, dan shooqie karena telah menyelamatkan saya banyak byte.

TFeld
sumber
Heh, pola N, 4N itu cukup keren.
steenbergh
Kerja bagus. Anda dapat mengubah while((x,y)not in p.keys()):ke while(x,y)not in p:dan for x,y in p.keys():ke for x,y in p. Anda dapat mengubah l,r=i%b==0,i%f==0ke l,r=i%b<1,i%f<1dan d=(d+[0,1][r]-[0,1][l])%4ke d=(d+r-l)%4. Anda bisa berubah s=[[`i`,'F'][r],' F'[r]+'B'][l].rjust(2);p[(x,y)]=smenjadi p[(x,y)]=[[`i`,'F'][r],' F'[r]+'B'][l].rjust(2). Mungkin ada lebih banyak
Jonathan Allan
Anda dapat menyimpan byte dengan h*[' ']for x in rangealih - alih [' ']*h for x in range. Juga, x+=[-1,1][d==1]bisa diganti dengan x+=(d==1)*2-1, dan y+=[1,-1][d==2]bisa diganti dengan y+=(d!=2)*2-1. Juga, apakah f,b=inputttsalah ketik?
Tembaga
p[(x,y)]=> p[x,y](tidak yakin apakah itu bekerja dengan Python 2)
shooqie
4

Excel VBA, 347 421 byte

Versi baru, untuk menangani persyaratan ruang putih. Tidak memiliki ini dalam versi pertama saya adalah pengawasan di pihak saya, tetapi ini mengambil korban dalam bytecount ... Sekarang memotong dan menempelkan rentang yang digunakan ke sel 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

Inilah versi lama yang tidak memindahkan hasil akhirnya 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

Mulai dari 70, 70 (atau BR70 di Excel) dan berjalan di sekitarnya. Fungsi dipanggil dengan fdan bsebagai parameter:Call t(4, 16)

@ Neil baru saja menyelamatkan saya banyak byte, terima kasih!

steenbergh
sumber
1
Jika Anda mengganti q=q-1dengan q=q+3dan Select Case qdengan Select Case q Mod 4maka Anda dapat menyingkirkan dua pernyataan sebelumnya.
Neil
However, the total width of each row must not exceed 3 times the number of non-empty columnsSaya kira ini ditambahkan untuk menghindari hanya memasang grid besar dan memulai agak jauh dari perbatasan
Karl Napf
1
@KarlNapf Diperbaiki.
steenbergh
3

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

Subrutin yang mengambil input sebagai nilai-nilai, F, Bdan output ke sel-sel pada Sheets(1)Object (yang terbatas pada Sheets(1)objek untuk menyimpan 2 Bytes)

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

Pemakaian:

Call G(3, 4)
Taylor Scott
sumber
2

C, 349 Bytes

Kompilasi dengan gcc (dengan banyak peringatan)

#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]);}

Versi yang sedikit lebih menjorok:

#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]);
}

Ini adalah versi 364 byte yang menangani angka lebih besar dari 100

#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);}
Jerry Jeremiah
sumber
1

Perl, 275 byte

Lekukan disediakan untuk keterbacaan dan bukan bagian dari kode.

($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
}

Penjelasan:

Kode ini bekerja dengan melacak hash dari semua tempat penyu telah, dan nilai yang sesuai, disimpan di %m. Misalnya: di 3 5, $m{0,2}berisi 2, dan $m{1,-3}= 26. Ini berlanjut dengan cara ini sampai mencapai tempat yang telah ditentukan. Selain itu, ia melacak batas arus jalur kura-kura, menggunakan $a,$b,$c,$dmaksimum dan minimum.

Setelah mencapai tempat yang sudah ada, itu mencetak jalan menggunakan batas, semuanya diisi dengan spasi.

Tidak ada batasan untuk ukuran jalan, atau ukuran angka.

Gabriel Benamy
sumber
1

PHP , 292 byte

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

Cobalah online!

Lekukan untuk kejelasan, tidak dihitung.

Mengikuti banyak algoritma yang sama dengan jawaban Perl. Lacak di mana kura-kura berada dalam larik 2D $a, $u, $d, $l, $rlacak tempat penyu menghadap, dan lacak batas untuk dicetak. str_padmemungkinkan kami untuk memastikan bahwa setiap entri tepat 3 ruang lebar untuk format cetak.

Untuk beberapa alasan saya tidak dapat mengerti, PHP tidak keberatan saya tidak menginisialisasi setengah variabel menjadi 0, tetapi mengacaukan pemformatan jika saya tidak menginisialisasi yang lain, meskipun biasanya memperlakukan variabel yang tidak diinisialisasi sebagai 0 ketika mereka pertama kali bekas. Karena itu $x=$y=$u=$l=0sedikit.

Xanderhall
sumber
0

Python 2 , 267 262 258 249 245 243 byte

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

Cobalah online!

Arfie
sumber