Desafio
Dado qualquer número inteiro positivo suportado pelo seu idioma:
- Pegue a entrada e divida-a em duas metades. Para todas as divisões deste programa, se a entrada for ímpar, arredonde uma metade para cima e outra para baixo (ex:,
7 -> 3,4
não7 -> 3.5,3.5
). - Divida qualquer número ao meio, pegue a maior dessas duas novas metades e adicione-a novamente ao número que não foi dividido. Ex:
3,4 -> (1,2),4 -> 1,6
ou3,4 -> 3,(2,2) -> 5,2
. - Repita a etapa 2 até chegar a um conjunto que você já viu antes. Ex:
5 -> 3,2 -> (1,2),2 -> 1,4 -> 1,(2,2) -> 3,2
. Como já vimos3,2
antes, podemos parar de repetir. Você pode esgotar completamente uma pilha no processo de fazer isso. Ex:5 -> 3,2 -> (1,2),2 -> 1,4 -> (0,1),4 -> 0,5
. - Saída de cada par no loop (ou seja, acima sem as etapas intermediárias, desde a primeira aparição de um par até o segundo, mas não incluindo o segundo). Ex:
3,2 -> 1,4
. Se a entrada estiver incluída, não a0
a -5 -> 3,2 -> 1,4
, não0,5 -> 3,2 -> 1,4
. - Repita as etapas 1 a 4 dividindo os pares de maneira diferente.
I / O
A entrada é um número inteiro positivo maior 1
e menor que o número máximo máximo suportado pelo seu idioma ou o número máximo máximo que não trava o computador, o que for menor.
Saída são os loops de cima em qualquer formato que você desejar (string, lista, array, etc.). Espaço em branco à direita é permitido.
Não produza o mesmo loop duas vezes, nem versões diferentes do mesmo loop. Ex: 2 -> 1,1
e 1,1 -> 2
são dois loops válidos, mas descrevem o mesmo loop, começando em diferentes pontos do loop. Da mesma forma, dois loops que são idênticos, mas vão na ordem inversa, não devem ser gerados. Ex: 3 -> 1,2 -> 2,1
e 3 -> 2,1 -> 1,2
são o mesmo loop, mas eles vão na direção oposta um do outro.
Você pode usar qualquer delimitador para diferenciar entre os pares, entre cada número nos pares e entre cada loop, desde que sejam três caracteres ou cadeias de caracteres distintas. Acima, dividi os números usando vírgulas, os pares usando ->
's e os loops usando instruções chatas. Nos meus exemplos abaixo, usarei parênteses em torno de cada par, vírgulas entre cada número dentro de um par e novas linhas entre cada loop.
Exemplos
Os créditos ao código do @ WheatWizard por corrigir minha lista de exemplos. Como eu disse em um rascunho anterior, eu tinha certeza de que estava faltando alguns desde que estava fazendo isso à mão, mas cara, eu estava sentindo falta de alguns.
Entrada: 2
Saída:(2)(1,1)
Entrada: 3
Saída:
(3)(1,2)
(1,2)(2,1)
(3)(1,2)(2,1)
Entrada: 4
Saída:
(4)(2,2)(1,3)
(1,3)(3,1)
(4)(2,2)(1,3)(3,1)
(4)(2,2)(3,1)(1,3)
(3,1)(1,3)
(4)(2,2)(3,1)
Entrada: 5
Resultado:
(5)(2,3)(1,4)
(1,4)(3,2)
(2,3)(1,4)(3,2)(4,1)
(5)(2,3)(1,4)(3,2)(4,1)
(2,3)(4,1)
(5)(2,3)(4,1)
Entrada: 6
Resultado:
(6)(3,3)(1,5)
(1,5)(4,2)(2,4)
(4,2)(2,4)
(1,5)(4,2)(5,1)(2,4)
(4,2)(5,1)(2,4)
(6)(3,3)(1,5)(4,2)(5,1)
(6)(3,3)(5,1)(2,4)(1,5)
(2,4)(1,5)(4,2)
(5,1)(2,4)(1,5)(4,2)
(2,4)(4,2)
(5,1)(2,4)(4,2)
(6)(3,3)(5,1)
Entrada: 7
Resultado:
(7)(3,4)(1,6)
(1,6)(4,3)(2,5)
(2,5)(5,2)
(3,4)(1,6)(4,3)(2,5)(5,2)(6,1)
(7)(3,4)(1,6)(4,3)(2,5)(5,2)(6,1)
(3,4)(1,6)(4,3)(6,1)
(7)(3,4)(1,6)(4,3)(6,1)
(7)(3,4)(5,2)(2,5)(1,6)
(2,5)(1,6)(4,3)
(3,4)(5,2)(2,5)(1,6)(4,3)(6,1)
(7)(3,4)(5,2)(2,5)(1,6)(4,3)(6,1)
(5,2)(2,5)
(3,4)(5,2)(6,1)
(7)(3,4)(5,2)(6,1)
Pontuação
Isso é código-golfe , então a menor contagem de bytes vence.
Este é o meu primeiro desafio aqui, portanto qualquer feedback seria muito apreciado. Link para sandbox aqui .
Curiosidade: um dia eu estava entediado e brincava com pequenos pedaços aleatórios de lápis dessa maneira e, por fim, percebi que eu poderia continuar com esses tipos de loops. Por alguma razão, minha primeira reação foi "ei, isso seria um grande desafio para o código de golfe".
(a,0)
no lugar de(a)
? Isso tende a fazer sentido em idiomas fortemente tipados.Respostas:
Limpo ,
267... 167 bytesExperimente online!
Ungolfed:
fonte
Haskell ,
227203 bytes17 bytes economizados graças ao Οurous
Experimente online!
fonte
show
?