Recentemente, postei uma pergunta sobre os jogos Diffy, que ficou sem resposta. Tudo bem, a pergunta é realmente difícil, mas eu gostaria de fazer uma pergunta mais fácil sobre os jogos do Diffy para que possamos fazer a bola rolar.
Como Diffy funciona
Copiado de Find Diffy Games
O jogo Diffy funciona da seguinte maneira: Você começa com uma lista de números inteiros não negativos; neste exemplo, usaremos
3 4 5 8
Então você toma a diferença absoluta entre números adjacentes
(8) 3 4 5 8
5 1 1 3
Então você repete. Você repete até perceber que inseriu um loop. E então geralmente o jogo começa do começo novamente.
3 4 5 8
5 1 1 3
2 4 0 2
0 2 4 2
2 2 2 2
0 0 0 0
0 0 0 0
A maioria dos jogos termina com uma série de zeros, o que é considerado um estado de perda, mas alguns jogos raros ficam presos em loops maiores.
Tarefa
Dado o estado inicial de um jogo Diffy, determine se o jogo atinge ou não um estado com todos os zeros. Você deve gerar um valor Truthy ou Falsy para cada um dos dois estados. Qual corresponde ao que não importa.
O objetivo é minimizar o número de bytes em sua fonte.
fonte
1 1 0
é periódico, assim42 42 41
como esse estado.n
for ímpar, o jogo não será zero, a menos que todos os números sejam iguais. Se o comprimento for uma potência de 2, sempre será zero.n
elementos e o máximo de etapasm
na maioria dasn * bit_length(m)
etapas. Então,n*m
também é um limite superior. Um limite superior mais forte ét(n) * bit_length(m)
, ondet(n)
está a maior potência de 2 que é um fator den
.Respostas:
Pitão, 6 bytes
Suíte de teste
Este programa é muito suave. 0 (falso) significa todos os zeros, qualquer outra coisa (verdade) significa nem todos os zeros.
Como funciona:
fonte
Mathematica, 52 bytes
Função pura tomando uma lista de números inteiros não negativos como entrada e retorno
True
ouFalse
.Abs[#-RotateLeft@#]&
é uma função que executa uma rodada do jogo diffy. (Tecnicamente deveria serRotateRight
, mas a resposta final não é afetada e, ei, byte livre.) Portanto,Nest[...,#,R]
executaR
rodadas do jogo diffy e, em seguida,1>Max@
detecta se o resultado é todos os zeros.Como sabemos quantas rodadas de jogo difícil
R
fazer? Sem
for o maior valor da entrada, observe que nunca produziremos um número inteiro maior quem
não importa quantas rodadas fizermos. O número total de listas de comprimentol
de números inteiros não negativos todos delimitados porm
é(m+1)^l
. Portanto, se realizarmos as(m+1)^l
rodadas do jogo diffy, é garantido que vimos alguma lista duas vezes até então, e assim estaremos na parte periódica do jogo. Em particular, o jogo termina em todos os zeros se e somente se o resultado das(m+1)^l
rodadas do jogo for a lista de todos os zeros. Essa expressão é o queMax[1+#]^Tr[1^#]
computa.fonte
Gelatina , 13 bytes
Saídas 0 (falsey) se todo o estado zero for alcançado, caso contrário, um valor verdadeiro (um número inteiro positivo) será retornado.
Experimente online!
Utiliza a observação feita por Greg Martin, segundo a qual os números dentro da matriz nunca podem deixar o domínio [0, m] onde m é o elemento máximo na entrada; portanto, executar (m + 1) l arredonda onde l é o comprimento da entrada. basta.
Quão?
fonte
PHP, 144 bytes
imprima 0 para todo zero e qualquer valor inteiro positivo para true
Versão Online
Expandido
fonte
array_push
? Mas por que ?$_GET
como entrada, você deve assumir que ele contém uma string.?0[0]=1&0[1]=1&0[2]=0
ou?0[]=1&0[]=1&0[]=0
é uma série de strings, mas isso não importa. Mas você está certo, eu poderia torná-lo mais curto com o?0=1&1=1&2=0
por que não àrray_push`. Tenho certeza de que você ou Titus encontram maneiras melhores de contornar isso.array_push($e,$e[$c=0]);
é simplesmente exatamente o mesmo$e[]=$e[$c=0];
e você ainda usa a sintaxe ($r[]=$n
). Você já usamax
agora, portanto também deve substituirend($r)
por,$n
porque$n
é sempre igual aend($r)
quando o eco é executado.R (3.3.1), 87 bytes
Retorna zero para um jogo que termina com todos os zeros e um número positivo caso contrário.
aproveita o mesmo fato de Greg Martin e usa o diff embutido para fazer a diferença
fonte
Röda , 80 bytes
Experimente online!
Ungolfed:
fonte
05AB1E , 13 bytes
Retorna 1 se terminar em zeros e 0 em caso contrário.
Experimente online!
Explicação
Usa o limite superior das rodadas:
max(input)*len(input)
explicado por xnor na seção de comentários.fonte
J, 22 bytes
Retorna
0
(que está efetivamentefalse
em J) para um jogo degenerado que termina em todos os zeros. Retorna1
(true
) se a enésima iteração contiver um número diferente de zero, em que n é igual ao maior número inteiro na sequência original multiplicado pelo comprimento da lista. Veja a resposta de Greg Martin, explicando por que isso é verdade.Tradução:
*
>./
^:( )
#
multiplicado pelo*
maior valor da lista>./
:|&
de(- )
e1&|.
Exemplos:
fonte
JavaScript (ES6),
95 9290 bytesExplicação
A função recursiva que se chama contanto que o contador (que começa no valor máximo da lista mais um na potência do comprimento da lista [
= (max + 1)**length
]) não seja zero. Em cada chamada, o contador é decrementado e, quando atinge zero, todos os elementos da lista são verificados em relação a zero. Se todos forem iguais a zero, o programa retornarátrue
e,false
caso contrário.fonte
PHP,
123115receber entrada via HTTP get, por exemplo,
?3&4&5&8
salva alguns bytes.Imprime 1 se atingir todos os zeros ou nada diferente.
pega a lista de argumentos via linha de comando. Eu tenho a sensação de que isso pode ser ainda mais jogado (olhando para @Titus).
fonte
Python 3.6, 101 bytes
Toma uma tupla de números e retorna False, se terminar em zeros, e True, se repetir.
fonte
JavaScript (ES6),
8483 bytesRetorna
true
para um jogo que termina com todos os zeros,false
caso contrário.Teste
Mostrar snippet de código
fonte