Fizz Buzz for Turtles
Python 2, 379 338 326 bytes
Takes input as two numbers, separated by a comma. Eg. 4,5
or (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))
Version that works if path is longer than 99, 384 343 330 bytes
Shows 2 significant digits.
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))
Examples:
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)
(truncating version)
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: Thanks to Jonathan Allan, Copper, and shooqie for savings me a bunch of bytes.
Excel VBA, 347 421 bytes
New version, to deal with the whitespace-requirements. Not having this in my first version was an oversight n my part, but this takes its toll in the bytecount... It now cuts and pastes the used range to cell 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
Here's the old version that did not move the end result to 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
Starts at 70, 70 (or BR70 in Excel) and walks around it. Function is called with the f
and b
as parameters: Call t(4, 16)
@Neil just saved me a bunch of bytes, thanks!
Excel VBA, 284 278 277 261 259 255 254 253 251 Bytes
Sub
routine that takes input as values, F
, B
and outputs to cells on the Sheets(1)
Object (which is restricted to the Sheets(1)
object to save 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
Usage:
Call G(3, 4)