Descrição do Problema
Imagine que você é uma tartaruga em uma grade. Você é dado dois números f e b , e você está voltada para o leste. Você realiza uma marcha pela grade, contando cada uma das células que encontrar, de acordo com as seguintes regras:
- Por padrão, você escreve a contagem na célula em que está e depois avança.
- Se a contagem é divisível por f , você escreve
F
na célula em que está, depois vira à direita e depois avança. - Se a contagem é divisível por b , você escreve
B
na célula em que está, depois vira à esquerda e depois avança. - Se a contagem é divisível por f e b , você escreve
FB
na célula em que está e depois avança. - Se você chegar a um quadrado em que já esteve, pare.
Por exemplo, seguir estas regras usando f = 3 eb = 5 gerará um padrão como este:
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
O desafio
Escrever um programa ou função que aceita dois números como entrada, correspondendo a f e b , e produz como saída o padrão para esses números indicados pelas regras acima.
Requisitos de formatação:
- Cada célula tem dois caracteres de largura
- O conteúdo da célula está alinhado à direita dentro desses dois caracteres
- As células na mesma linha são delimitadas por um espaço
- A primeira coluna de células deve conter uma célula não vazia
- Todas as linhas devem conter células não vazias
- O espaço em branco à direita não é necessário, mas é permitido
- No entanto, a largura total de cada linha não deve exceder 3 vezes o número de colunas não vazias
Seu código deve funcionar para os casos de teste fornecidos.
As brechas padrão não são permitidas.
Isso é código de golfe; a resposta mais curta em bytes vence.
Casos de teste
(f = 3, b = 5 caso repetido aqui como uma conveniência de cortesia).
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
Respostas:
JavaScript (ES6), 230
240Menos golfe
Teste
fonte
Python 2,
379338326 bytesRecebe a entrada como dois números, separados por vírgula. Por exemplo.
4,5
ou(4,5)
Versão que funciona se o caminho for maior que 99,
384343330 bytesMostra 2 dígitos significativos.
Exemplos:
input=(4,16)
input=(6,7)
(versão truncada)@ Edit: Obrigado a Jonathan Allan, Copper e shooqie por me poupar um monte de bytes.
fonte
while((x,y)not in p.keys()):
parawhile(x,y)not in p:
efor x,y in p.keys():
parafor x,y in p
. Você pode mudarl,r=i%b==0,i%f==0
paral,r=i%b<1,i%f<1
ed=(d+[0,1][r]-[0,1][l])%4
parad=(d+r-l)%4
. Você pode mudars=[[`i`,'F'][r],' F'[r]+'B'][l].rjust(2);p[(x,y)]=s
parap[(x,y)]=[[`i`,'F'][r],' F'[r]+'B'][l].rjust(2)
. Pode haver maish*[' ']for x in range
vez de[' ']*h for x in range
. Além disso,x+=[-1,1][d==1]
pode ser substituído porx+=(d==1)*2-1
ey+=[1,-1][d==2]
pode ser substituído pory+=(d!=2)*2-1
. Além disso, éf,b=inputtt
um erro de digitação?p[(x,y)]
=>p[x,y]
(Não tenho certeza se ele funciona em Python 2, embora)Excel VBA,
347421 bytesNova versão, para lidar com os requisitos de espaço em branco. Não ter isso na minha primeira versão foi um descuido da minha parte, mas isso tem seu preço no número de bytes ... Agora, ele corta e cola o intervalo usado na célula
A1
.Aqui está a versão antiga que não moveu o resultado final para
A1
Começa às 70, 70 (ou BR70 no Excel) e caminha ao redor. A função é chamada com os parâmetros
f
eb
como:Call t(4, 16)
@ Neil me salvou um monte de bytes, obrigado!
fonte
q=q-1
porq=q+3
eSelect Case q
comSelect Case q Mod 4
, poderá se livrar das duas instruções anteriores.However, the total width of each row must not exceed 3 times the number of non-empty columns
Eu acho que isso foi adicionado para evitar apenas configurar uma grande grade e começar um pouco a distância da fronteiraExcel VBA,
284278277261259255254253251 bytesSub
rotina que toma como entrada valores,F
,B
e as saídas de células noSheets(1)
objecto (que é restrito para oSheets(1)
objecto para salvar 2 bytes)Uso:
fonte
C, 349 bytes
Compila com o gcc (com muitos avisos)
Uma versão um pouco mais recuada:
Aqui está uma versão de 364 bytes que lida com números maiores que 100
fonte
Perl, 275 bytes
O recuo é fornecido para facilitar a leitura e não faz parte do código.
Explicação:
O código funciona controlando um hash de todos os lugares em que a tartaruga esteve e o valor apropriado armazenado
%m
. Por exemplo: in3 5
,$m{0,2}
contém2
e$m{1,-3}
=26
. Ele continua dessa maneira até chegar a um local que já foi definido. Além disso, ele mantém o controle das fronteiras atuais do caminho da tartaruga, usando$a,$b,$c,$d
como máximos e mínimos.Quando chega a um local em que já esteve, imprime o caminho usando os limites, tudo preenchido com espaços.
Não há limite para o tamanho do caminho, nem o tamanho dos números.
fonte
PHP , 292 bytes
Experimente online!
Recuos são para maior clareza, não são contados.
Segue o mesmo algoritmo da resposta Perl. Rastreie onde a tartaruga esteve em uma matriz 2D
$a
,$u, $d, $l, $r
rastreie onde a tartaruga está virada e rastreie os limites para impressão.str_pad
nos permite garantir que cada entrada tenha exatamente 3 espaços de largura para a formatação da impressão.Por alguma razão que eu não consigo entender, o PHP não se importa de eu não inicializar metade das variáveis para 0, mas estraga a formatação se eu não inicializar outras, mesmo que geralmente trate variáveis não inicializadas como 0 quando elas são as primeiras usava. Daí a parte
$x=$y=$u=$l=0
.fonte
Python 2 ,
267262258249245243 bytesExperimente online!
fonte