Qualquer número inteiro positivo pode ser obtido começando com 1 e aplicando uma sequência de operações, cada uma das quais é "multiplicada por 3" ou "dividida por 2, descartando qualquer restante" .
Exemplos (escrevendo f para * 3 eg para / 2):
4 = 1 *3 *3 /2 = 1 ffg
6 = 1 ffggf = 1 fffgg
21 = 1 fffgfgfgggf
Escreva um programa com o seguinte comportamento:
Entrada : qualquer número inteiro positivo, via stdin ou codificado. (Se codificado, o número de entrada será excluído do comprimento do programa.)
Saída : uma sequência de f e g tais que <input> = 1 <string>
(como nos exemplos). Essa string na ordem inversa também é aceitável. NB: A saída contém apenas f e eg, ou está vazia.
O vencedor é a entrada com o menor número de bytes de programa com saída quando 41 é a entrada.
fonte
x mod 3
: sex=3y
construa y e apliquef
; sex=3y+1
construir2y+1
e aplicarf
entãog
; se,x=3y+2
então, fica complicado, mas essencialmente é recursivo.Respostas:
GolfScript, pontuação 64 (43-2 + 23)
(41 é codificado permanentemente, portanto, -2 caracteres para a pontuação). A saída é
que tem 23 caracteres (sem nova linha). Por construção, o código garante que sempre retorne (uma) as representações mais curtas.
fonte
"1 "
não deve ser incluído na saída.Estamos ficando sujos, amigos!
JAVA
210 207199 caracteressem golfe:
saída: dependendo da fé dos deuses antigos, o menor que eu tinha era 30. Observe que a saída deve ser lida da direita.
234
108
editar 45
pontos :
318199 + 30 = 229edit1 (2 * i + 1)% 3 == 0 -> (2 * i)% 3 == 1
Nota Bem, se você usa Java 6 e não Java 7 enquanto joga golfe, pode usar
Estrutura de 39 caracteres em vez de uma estrutura padrão com 53 caracteres.
fonte
(2*i+1)%3==0
é equivalente ai%3==1
if(X){A}else{if(Y){B}else{C}}
é maior queif(X){A}else if(Y){B}else{C}
. Além disso, você pode substituir suas==
condições por<
condições mais curtas .Python, pontuação 124 (90-2 + 36)
90 caracteres de código (novas linhas como 1 cada) - 2 para número de entrada codificado + 36 caracteres de saída
Resultado:
fonte
m=f=0
você pode fazer o loop externowhile(n!=x)*(m!=x)
e remover as quebras. Traz para 95 caracteres de código.n
por3**f
.print'f'*f+'g'*g
, o que daria uma pontuação de 90-2 + 36 = 124.Python, pontuação 121 (87-2 + 36)
fonte
l,n,f=len(t),1,0
, e removeu a'1',
partir da declaração de impressão, sua pontuação seria 87-2 + 36 = 121.1,
.l,n,f=len(t),1,0
dá o mesmo número de caracteres, certo? (Para cada variável, uma=
e uma nova linha é substituído com dois,
s.)Perl, pontuação 89 (63-2 + 28)
Conjetura: Se a abordagem ingênua descrita em minha solução original abaixo atingir um ciclo, esse ciclo será [21, 7, 15, 5, 10, 21, ...] . Como não há contra-exemplos para 1 ≤ n ≤ 10 6 , isso parece provável que seja verdade. Para provar isso, basta mostrar que esse é o único ciclo que pode existir, o que eu posso ou não fazer em um momento posterior.
A solução acima evita o ciclo imediatamente, em vez de adivinhar (erradamente) e evita-o na segunda vez.
Saída (28 bytes):
Perl, marca 100 (69-2 + 33)
Usando uma abordagem de adivinhação e verificação. A cadeia é construída usando operações inversas (convertendo o valor para 1 , e não o contrário), e a cadeia é espelhada de acordo, o que é permitido pela especificação do problema.
Sempre que um não múltiplo de três for encontrado, ele será multiplicado por dois, adicionando um se o resultado for um múltiplo de três. Quando um múltiplo de três for encontrado, ele será dividido por três ... a menos que esse valor tenha sido encontrado anteriormente, indicando um ciclo, portanto, adivinhe e verifique.
Saída (33 bytes):
fonte
J, escore 103 (82-2 + 23)
* Nota: Eu nomeei meus verbos
f
eg
, para não ser confundido com as strings de saídaf
eg
.Codificado:
Funções gerais:
Acabou com a operação em blocos de números binários, que foi a mudança mais importante na compactação
g
. Renomeiei as variáveis e removi alguns espaços em branco, mas tudo continua funcional do mesmo jeito. (Uso:g 41
)J, pontuação 197 (174 + 23)
Resultado:
ffffffffggggggggfgffggg
f
converte uma lista de booleanos em número, usando 0s como*3
e 1s como/2
(efloor
).#:i.2^i
cria uma matriz de classificação 2 contendo todas as matrizes booleanas de classificação 1i
.fonte