(Nota: Este é um desdobramento do meu desafio anterior Encontre as palavras em redemoinho! )
Definição de Infinito Palavra :
- Se você conectar com curvas todos os caracteres de uma Palavra Infinita no alfabeto (AZ), obterá o símbolo do infinito ∞ como nos diagramas abaixo.
- Todas as conexões pares devem estar inoperantes , todas as conexões ímpares devem estar ativadas .
- Você pode ignorar maiúsculas / minúsculas ou considerar / converter tudo em maiúsculas ou tudo em minúsculas.
- As palavras de entrada são apenas caracteres no intervalo alfabético de AZ, sem espaços, sem pontuação ou símbolos.
- Cada palavra deve ter exatamente 5 caracteres. Palavras> 5 ou <5 não são válidas.
- Se uma palavra tem caracteres consecutivos duplos, a palavra não é válida, como "FLOOD" ou "QUEEN".
- Todas as Palavras Infinitas começam e terminam com o mesmo caractere.
Aqui estão alguns exemplos:
Tarefa:
Escreva um programa ou função completa que retire uma palavra da entrada padrão e faça a saída se for uma Infinity Word ou não. A saída pode ser verdadeira / falsa, 1/0, 1 / Nula, etc.
Casos de teste:
Infinity Words:
ALPHA, EAGLE, HARSH, NINON, PINUP, RULER, THEFT, WIDOW
NOT Infinity Words:
CUBIC, ERASE, FLUFF, LABEL, MODEM, RADAR, RIVER, SWISS, TRUST,
KNEES, QUEEN, GROOVE, ONLY, CHARACTER, OFF, IT, ORTHO
Regras:
- O menor código vence.
Tarefa opcional:
Encontre, como uma lista, quantas palavras infinitas puder em um dicionário de inglês. Você pode tomar, por exemplo, como referência a lista completa de palavras em inglês aqui .
Respostas:
Gelatina ,
43 41 40 25 24 23 22 21 1413 bytes-7 bytes graças ao fireflame241 (
0ị=1ị$
->=ṚḢ
e uso deIIA⁼2,2
para testar as 4 rotações)-1 Agradecimentos a Kevin Cruijssen (uso de nilad anteriormente indisponível
Ø2
que produz[2,2]
)TryItOnline
Ou todos os casos de teste (mais "REGRAS")
Quão?
Uma palavra infinita possui:
Todos, exceto (1) e (equivalentemente) (4), podem ser resumidos a uma condição na qual os sinais delta do alfabeto são uma rotação de
[1,1,-1,-1]
(onde o sinal de0
é0
)fireflame241 observou que isso é equivalente aos deltas dos deltas do alfabeto, sendo
[[2,2],[2,-2],[-2,2],[-2,-2]]
que os sinais delta podem ser testados pelos valores absolutos iguais a[2,2]
!Quão?
fonte
II
para verificar a igualdade em uma rotação de 1,1, -1, -1.Java 8,
23119318512210378 bytesExperimente aqui.
-38 bytes graças a @ dpa97 por me lembrar de usar em
char[]
vez deString
.-63 bytes graças à fórmula derivada de @KarlNapf .
-25 bytes, convertendo-o do Java 7 para o Java 8 (e agora retornando um booleano em vez de inteiro).
Resposta de 193 bytes:
Explicação:
false
false
true
se estiver em conformidade com algum deles (efalse
caso contrário):1<2<3>4>5
(ou sejaALPHA
)1>2<3<4>5
(isto éEAGLE
,HARSH
,NINON
,PINUP
)1<2>3>4<5
(ou sejaRULER
)1>2>3<4<5
(por exemplo,THEFT
,WIDOW
)Essas quatro regras podem ser simplificadas
1*3<0 and 2*4<0
(graças à resposta em Python 2 do @KarlNapf ).fonte
char[]
como entrada em vez deString
. -38 bytes graças a você.z,x
ew,y
devem ter um sinal alternado, portanto basta verificarz*x<0
ew*y<0
JavaScript (ES6),
918987 bytesGuardado 2 bytes graças a Ismael Miguel
Como funciona
Construímos uma máscara de bits de 4 bits
k
representando as 4 transições entre os 5 caracteres da string:NaN
com que a palavra seja rejeitada (para obedecer à regra 6)As máscaras de
1
bits válidas são as que possuem exatamente duas transições consecutivas (o primeiro e o último bits também são considerados consecutivos ):Em outras palavras, estas são as combinações que são:
k?
: maior que 0!(k%3)
: congruente a 0 módulo 3As outras condições são:
!s[5]
: não há mais de 5 caracteress[0]==s[4]
: o primeiro e o quinto caracteres são idênticosNB : Não verificamos explicitamente
k != 15
porque qualquer palavra que segue esse padrão será rejeitada por esta última condição.Casos de teste
Mostrar snippet de código
Versão inicial
Para o registro, minha versão inicial era de 63 bytes. Ele está sendo aprovado em todos os casos de teste com êxito, mas falha em detectar caracteres idênticos consecutivos.
Abaixo está uma versão de 53 bytes sugerida por Neil nos comentários, que funciona (e falha) igualmente bem:
Editar: Veja a resposta de Neil para a versão fixa / completa do código acima.
fonte
0000
também é congruente com 0 módulo 3, mas, novamente, você não pode ter a primeira e a última letras iguais; portanto, como 15, não é necessário testá-lo explicitamente.!((a>b)-(b>c)+(c>d)-(d>e))
?p<c?0:NaN
pode ser escrito como0/(p<c)
, o que economiza 2 bytes.k?
teste por causa do possívelNaN
.) Com relação à sua versão alternativa: isso deve funcionar de fato.JavaScript (ES6), 78 bytes
Com base no código incorreto de @ Arnauld, mas foi corrigido e corrigido. Funciona verificando primeiro se o primeiro caractere é o mesmo que o quinto (garantindo assim 5 caracteres) e se o comprimento da string não é maior que 5. Após verificar se há caracteres duplicados consecutivos, resta verificar a ondulação da string, que deve ter um pico e um calha com duas letras de diferença.
Edit: Solução alternativa de 78 bytes com base na resposta de @ KarlNapf:
fonte
Código de saída Python 2, 56 bytes
Saídas via código de saída: Erro para False e execução bem-sucedida para True.
Pega a sequência
s
com caracteresabcde
, gira-a parabcdea
, faz uma comparação elementar dos caracteres correspondentes e os atribui a cinco variáveisv,w,x,y,z
. O comprimento errado dá um erro.Todas as palavras infinitas têm
que pode ser verificado em conjunto como
v*x+w*y|z == -2
. A comparação encadeadav*x+w*y|z>-2>_
curto-circuito, se esse for o caso, e continua avaliando-2>_
qual erro de nome ocorre .fonte
Python 2,
1108760 bytesEconomizando 1 byte graças a Neil
Requer entrada entre aspas, por exemplo
'KNEES'
True
se for uma palavra infinita,False
se não, e tiver um comprimento de 5 e imprimirá uma mensagem de erro se o comprimento estiver erradoInspirado pela resposta do xnor usando
map(cmp...
solução anterior:
Usando a lógica otimizada de Kevin Cruijssen
fonte
a*c+b*d+2==0==e
?a*c+b*d|e
é ainda mais curto.<-1
pode funcionar, já que ambos-2|1
e-2|-1
iguais-1
.PHP, 102 bytes
fonte
Python 2, 71 bytes
Pega a sequência
s
com caracteresabcde
, gira-a parabcdea
e faz uma comparação elementar dos caracteres correspondentes.O resultado é uma lista de
-1, 0, 1
. Em seguida, verifica se o resultado é uma das seqüências válidas de altos e baixos:conforme gerado a partir do modelo
[m,n,-m,-n,0]
comm,n=±1
. A última0
verifica se a primeira e a última letra foram iguais e o comprimento garante que a cadeia de entrada tenha comprimento 5.Uma alternativa 71. Verifica as condições nas comparações, garantindo o comprimento certo.
fonte
R, 144 bytes
A resposta é baseada na lógica de @ Jonathan Allan. Provavelmente poderia ser jogado golfe.
Casos de teste R-fiddle (exemplo vetorizado, mas a mesma lógica)
fonte
length(s)==5
, é possível substituirs[1]==tail(s,1)
pors[1]==s[5]
. Um método mais curto de um byte para verificar o comprimento éis.na(s[6])
. Juntas, essas duas mudanças retornamTRUE
nos
comprimento 5 exatamente e deFALSE
outra forma, comoTRUE&NA
sãoNA
masFALSE&NA
sãoFALSE
. Você também pode salvar alguns bytes substituindo!sum(sign(d))&any(rle(sign(d))$l>1)
por!sum(a<-sign(d))&any(rle(a)$l>1)
.GNU Prolog, 47 bytes
Define um predicado
i
que obtém êxito (infinitamente muitas vezes, na verdade) para uma palavra infinita, emitindo "yes" quando executado a partir do intérprete (como é habitual no Prolog); falha em uma palavra candidata cujas primeiras e últimas letras não coincidem ou não têm 5 letras, emitindo "não" quando executadas no intérprete; e trava com um estouro de pilha se for dada uma palavra candidata que não seja uma palavra infinita, mas que seja cinco letras com a primeira e a última duas correspondências. (Não sei por quetrava; a chamada recursiva deve ser tratada como uma chamada de cauda. Aparentemente, o otimizador do GNU Prolog não é muito bom.) Sucesso é o equivalente do Prolog à verdade e, na sua falta, o equivalente ao falsey; uma falha é definitivamente mais falsa do que verdade, e corrigi-la tornaria a solução substancialmente mais longa, então espero que isso conte como uma solução válida.O algoritmo é bastante simples (e, de fato, o programa é legível); verifique se as letras formam um dos quatro padrões que formam uma palavra infinita; se não, permitem cíclicamente e tente novamente. Não precisamos verificar explicitamente se há letras duplas, pois os operadores
<
e>
permitem verificar implicitamente que, ao mesmo tempo, verificamos se os deltas correspondem.fonte
Na verdade ,
3827 bytesEssa resposta foi amplamente inspirada na excelente resposta de Jonathan Allan à geléia . Provavelmente existem vários lugares onde isso pode ser jogado, então sugestões de golfe são bem-vindas! Experimente online!
Ungolfing
fonte
APL (Dyalog) ,
1615 bytesExperimente online!
fonte
TI-BASIC, 81 bytes
A string a ser transmitida para o programa está em Ans. Retorna (e é exibido implicitamente) 1 se a palavra inserida é uma palavra infinita e 0 (ou sai com uma mensagem de erro) se não for.
Erros em caracteres repetidos ou palavras que não sejam de 5 letras.
fonte
05AB1E , 16 bytes
Porto da resposta de @JonathanAllan Jelly .
Experimente online ou verifique todos os casos de teste .
Explicação:
fonte