Fizz Buzz cho Rùa


35

Mô tả vấn đề

Hãy tưởng tượng bạn là một con rùa trên lưới. Bạn được cho hai số fb , và bạn đang quay mặt về hướng đông. Bạn thực hiện một cuộc diễu hành trên lưới, đếm từng ô bạn gặp phải, theo các quy tắc sau:

  • Theo mặc định, bạn viết số đếm vào ô bạn đang ở, sau đó đi về phía trước.
  • Nếu số đếm chia hết cho f , bạn ghi Fvào ô bạn đang ở, sau đó rẽ phải, sau đó đi về phía trước.
  • Nếu số đếm chia hết cho b , bạn ghi Bvào ô bạn đang ở, sau đó rẽ trái, sau đó đi về phía trước.
  • Nếu số đếm chia hết cho cả fb , bạn viết FBvào ô bạn đang ở, sau đó đi về phía trước.
  • Nếu bạn đến một quảng trường bạn đã từng đến, bạn dừng lại.

Ví dụ: làm theo các quy tắc này bằng cách sử dụng f = 3 và b = 5 sẽ tạo ra một mẫu như thế này:

    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

Các thách thức

Viết chương trình hoặc hàm chấp nhận hai số làm đầu vào, tương ứng với fb và tạo ra mẫu đầu ra cho các số này được đưa ra bởi các quy tắc ở trên.

Yêu cầu định dạng:

  • Mỗi ô rộng hai ký tự
  • Nội dung ô được căn phải trong hai ký tự này
  • Các ô trên cùng một hàng được phân cách bằng khoảng trắng
  • Cột đầu tiên của các ô phải chứa một ô không trống
  • Tất cả các hàng phải chứa các ô không trống
  • Không cần phải lưu trữ khoảng trắng, nhưng được phép
  • Tuy nhiên, tổng chiều rộng của mỗi hàng không được vượt quá 3 lần số cột không trống

Mã của bạn phải làm việc cho các trường hợp thử nghiệm được cung cấp.

Sơ hở tiêu chuẩn là không được phép.

Đây là mã golf; câu trả lời ngắn nhất trong byte thắng.

Các trường hợp thử nghiệm

(f = 3, b = 5 trường hợp được lặp lại ở đây như một sự thuận tiện lịch sự).

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
Chúng tôi có đảm bảo rằng đầu vào sẽ luôn dẫn đến va chạm trước khi chúng tôi đến 100 không?
Martin Ender

Vâng. Nói chung, miễn là mã của bạn hoạt động cho các trường hợp thử nghiệm được cung cấp, bạn nên sử dụng.
H Walters

1
Có một nơi cụ thể mà bạn (con rùa) bắt đầu không?
Kritixi Lithos

@KritixiLithos Số Trái / trên / phải / dưới cùng của lưới được xác định bằng cách rùa di chuyển, phụ thuộc vào f và b.
H Walters

Có phải f và b luôn là số nguyên?
corvus_192

Câu trả lời:


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

Ít chơi gôn

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

Kiểm tra

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 byte

Lấy đầu vào là hai số, cách nhau bằng dấu phẩy. Ví dụ. 4,5hoặc là(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))

Phiên bản hoạt động nếu đường dẫn dài hơn 99, 384 343 330 byte

Hiển thị 2 chữ số có nghĩa.

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

Ví dụ:

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) (phiên bản cắt ngắn)

                                              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                                             

@ Chỉnh sửa: Cảm ơn Jonathan Allan, Copper và shooqie đã tiết kiệm cho tôi một loạt byte.


Heh, những mẫu N, 4N này khá tuyệt.
steenbergh

Làm tốt lắm. Bạn có thể thay đổi while((x,y)not in p.keys()):để while(x,y)not in p:for x,y in p.keys():để for x,y in p. Bạn có thể thay đổi l,r=i%b==0,i%f==0để l,r=i%b<1,i%f<1d=(d+[0,1][r]-[0,1][l])%4để d=(d+r-l)%4. Bạn có thể thay đổi s=[[`i`,'F'][r],' F'[r]+'B'][l].rjust(2);p[(x,y)]=sthành p[(x,y)]=[[`i`,'F'][r],' F'[r]+'B'][l].rjust(2). Có thể có nhiều hơn
Jonathan Allan

Bạn có thể lưu một byte với h*[' ']for x in rangethay vì [' ']*h for x in range. Ngoài ra, x+=[-1,1][d==1]có thể được thay thế bằng x+=(d==1)*2-1, và y+=[1,-1][d==2]có thể được thay thế bằng y+=(d!=2)*2-1. Ngoài ra, là f,b=inputttmột lỗi đánh máy?
Đồng

p[(x,y)]=> p[x,y](không chắc là nó có hoạt động trong Python 2 hay không)
shooqie

4

VBA Excel, 347 421 byte

Phiên bản mới, để giải quyết các yêu cầu về khoảng trắng. Không có điều này trong phiên bản đầu tiên của tôi là một phần giám sát của tôi, nhưng điều này sẽ gây thiệt hại cho người phụ nữ ... Bây giờ nó cắt và dán phạm vi sử dụng vào tế bào 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

Đây là phiên bản cũ không chuyển kết quả cuối cùng sang 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

Bắt đầu ở 70, 70 (hoặc BR70 trong Excel) và đi bộ xung quanh nó. Hàm được gọi với fbnhư là tham số:Call t(4, 16)

@Neil vừa tiết kiệm cho tôi một loạt byte, cảm ơn!


1
Nếu bạn thay thế q=q-1với q=q+3Select Case qvới Select Case q Mod 4sau đó bạn có thể thoát khỏi trước đó hai câu lệnh.
Neil

However, the total width of each row must not exceed 3 times the number of non-empty columnsTôi đoán điều này đã được thêm vào để tránh chỉ cần thiết lập một lưới điện lớn và bắt đầu cách xa biên giới
Karl Napf 7/11/2016

1
@KarlNapf Đã sửa.
steenbergh

3

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

Subthói quen mà có đầu vào như giá trị, F, Bvà đầu ra cho các tế bào trên Sheets(1)Object (được giới hạn trong Sheets(1)đối tượng để tiết kiệm 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

Sử dụng:

Call G(3, 4)

2

C, 349 byte

Biên dịch với gcc (có nhiều cảnh báo)

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

Một phiên bản thụt lề hơn một chút:

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

Đây là phiên bản 364 byte xử lý các số lớn hơn 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);}

1

Perl, 275 byte

Sự thụt lề được cung cấp để dễ đọc và không phải là một phần của mã.

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

Giải trình:

Mã này hoạt động bằng cách theo dõi hàm băm của tất cả các vị trí mà rùa đã ở và giá trị thích hợp được lưu trữ trong đó %m. Ví dụ: trong 3 5, $m{0,2}chứa 2$m{1,-3}= 26. Nó tiếp tục theo cách này cho đến khi nó đạt đến một nơi đã được xác định. Ngoài ra, nó theo dõi các ranh giới hiện tại của con đường rùa, sử dụng $a,$b,$c,$dtối đa và tối thiểu.

Khi đến một nơi mà nó đã đến, nó sẽ in đường dẫn bằng cách sử dụng các ranh giới, mọi thứ được đệm bằng khoảng trắng.

Không có giới hạn về kích thước của đường dẫn, cũng như kích thước của các con số.


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

Hãy thử trực tuyến!

Ấn định là cho rõ ràng, không được tính.

Theo nhiều thuật toán tương tự như câu trả lời Perl. Theo dõi nơi rùa đã ở trong một mảng 2D, $atheo dõi nơi rùa đang đối mặt và $u, $d, $l, $rtheo dõi các ranh giới để in. str_padcho phép chúng tôi đảm bảo rằng mỗi mục chính xác rộng 3 khoảng trống cho định dạng in.

Vì một số lý do tôi không thể hiểu được, PHP không ngại tôi không khởi tạo một nửa biến thành 0, nhưng sẽ tăng định dạng nếu tôi không khởi tạo người khác, mặc dù nó thường xử lý các biến chưa được khởi tạo là 0 khi chúng là đầu tiên đã sử dụng. Do đó $x=$y=$u=$l=0bit.


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

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.