Não me pergunte como ou por que, mas enquanto codificava em um projeto, notei que os caracteres de algumas palavras tinham um padrão específico referente ao alfabeto, liguei cada caractere das palavras com o lápis no alfabeto e obtive dois espirais, então notei que a primeira espiral era no sentido horário e a outra no sentido anti-horário, e outras características ... então eu as nomeei Swirling Words !
Uma palavra em redemoinho pode ser:
- no sentido horário ou anti-horário
- centrípeto ou centrífugo
Aqui estão alguns exemplos de Swirling Words :
Tarefa 1:
Escreva um programa ou função completa que retire uma palavra da entrada padrão e faça a saída se for uma palavra em redemoinho e suas características, em um formato legível, texto estendido, 3 caracteres, sinalizadores, etc.
Casos de teste e saídas de exemplo para palavras diferentes (mas você pode decidir como representar os resultados):
EARTH, GROUP > NO // NOT A SWIRLING WORD
OPERA, STAY, IRIS > SW,CF,CW // SWIRLING WORD, CENTRIFUGAL, CLOCKWISE
MINER, TAX, PLUG, META > SW,CF,CC // SWIRLING WORD, CENTRIFUGAL, COUNTERCLOCKWISE
AXIOM, AXIS, COOK > SW,CP,CW // SWIRLING WORD, CENTRIPETAL, CLOCKWISE
WATCH, YETI, PILL > SW,CP,CC // SWIRLING WORD, CENTRIPETAL, COUNTERCLOCKWISE
MORE EXAMPLES OF FALSE TEST CASES (NOT SWIRLING WORDS):
EARTH, GROUP, OUTPUT, WORD, CONNECTION, ODD, MOM, DAD,
CHARACTER, EXAMPLE, QUESTION, NEWSLETTER, OTHER
Regras:
- A conexão entre os dois primeiros caracteres deve estar ativa (como nos gráficos), toda a conexão uniforme deve estar desativada , 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 do alfabeto de AZ, sem espaços, sem pontuação, etc.
- Se uma palavra tiver caracteres duplos, como "GROOVE", você deverá recolher as dobras para um caractere: "GROOVE"> "GROVE".
- As palavras de entrada conterão pelo menos 3 caracteres distintos. Palavras como "MOM", "DAD", "LOL" não são válidas.
- É possível passar várias vezes no mesmo personagem, como "IRIS".
- O menor código vence.
Tarefa 2:
Para obter mais reputação, encontre as palavras Swirling mais longas e suas características que você pode encontrar no dicionário de inglês, seguindo as regras acima. Você pode tomar, por exemplo, como referência a lista completa das palavras em inglês aqui .
Feliz codificação!
Respostas:
MATL ,
333130 bytesA entrada está em letras maiúsculas (ou em letras minúsculas, mas não mista).
A saída é:
1
/-1
indica centrífugo / centrípeto.1
/ `-1 'indica no sentido horário / anti-horário.Experimente online! Ou verifique todos os casos de teste (código modificado para receber todas as entradas e produzir os dois números de saída na mesma linha)
Explicação
Vamos dar
'OPERAA'
um exemplo como exemplo.A primeira parte do código remove letras duplas:
Agora, verificamos se as distâncias entre as letras não são decrescentes (condição necessária para a palavra girar):
Em seguida, verificamos se as letras vão e voltam (essa é a outra condição para a palavra estar girando):
Por fim, verificamos se as duas condições se mantêm e, nesse caso, produzimos a saída:
fonte
Mathematica,
117111 bytesAgradecemos ao JHM por salvar 6 bytes e torná-lo sem distinção entre maiúsculas e minúsculas!
Função sem nome que pega uma string e retorna uma lista aninhada de booleanos no formulário
{{B1,B2},B3,B4}
. B4 registra se a palavra está girando (e, se não estiver, o restante da saída será lixo). Se a palavra estiver girando, B1 registra se a palavra é centrífuga, B2 registra se a palavra é centrípeta e B3 registra se a palavra é no sentido horário (True) ou no sentido anti-horário (False).Aqui está uma versão mais longa que o pós-processos (de primeira linha) A função acima (espaçados ao longo das linhas 2 a 5 de) para torná-lo idêntico ao OP:
NO
se a palavra não está rodando, e a escolha adequada de{SW,CF,CW}
,{SW,CF,CC}
,{SW,CP,CW}
ou{SW,CP,CC}
se a palavra está girando:A explicação é a mesma da resposta CJam de Martin Ender, com uma nota adicional: a lista de diferenças consecutivas deve alternar em sinal para que a palavra esteja girando, e isso pode ser detectado ao garantir que todos os produtos de pares de diferenças consecutivas sejam negativos (é isso que
Max[Most[d]Rest@d]<0
faz).Executando a função em todas as mais de 40.000 palavras do Mathematica
WordList[]
, encontramos as seguintes palavras de turbilhão de 8 letras, que são as mais longas de seus respectivos tipos de turbilhão:(Brownie aponta
positive
para não ter letras duplas e menos letras repetidas questowaway
.)Mas o campeão absoluto é a palavra centrípeta de 9 letras que gira no sentido anti-horário
vassalage
!fonte
LetterNumber
vez deToCharacterCode
e outros 3 bytes usando emMost[d]
vez deDrop[d,-1]
.Scala, 110 bytes
Retorna uma tupla
(a,b)
coma == 1
se s é centrípetoa == 0
se s é centrífugoa == -1
se s não está rodandoe
b == true
se s é no sentido horáriob == false
se s estiver no sentido anti-horárioExplicação:
fonte
Gelatina , 30 bytes
TryItOnline
Ou veja os casos de teste (com uma pequena alteração, pois o último
Ñ
apontaria para o novo link principal)(Minha falta de habilidade em encadeamento provavelmente está custando alguns bytes aqui)
Tudo em cima ou em baixo.
Retorna uma lista de sinalizadores [D, F, S]:
S: girando = 1 / não girando = 0
F: centrífugo = 1 (circular = 0) centrípeto = -1
D: no sentido horário = 1 / no sentido anti-horário = -1
- se S = 0 os outros sinalizadores ainda são avaliados, apesar de não conterem informações úteis.
Quão?
fonte
0
assim, ainda assim também funciona para eles!circular(0)
uma explicação interna, talvez seja hora de removê-la também.min([])=0
jelly.tryitonline.net/#code=W13huYI&input= - Observe que, como as palavras circulares agora nunca são contribuição esperada, não há problema em atendê-los.min([])==0
, mas achei que isso ainda é jogável.CJam , 39 bytes
Experimente online!
A entrada pode ser maiúscula ou minúscula, mas não mista.
O programa indica inadvertidamente palavras que não são necessariamente centrífugas ou centrípetas, mas que atendem aos requisitos de espiral. Eles são descritos como "circulares" no gráfico abaixo.
Para interpretar a saída, use este gráfico:
Explicação:
O programa realmente avalia se a sequência de diferenças diferentes de zero entre os caracteres inicia positiva ou negativa, se alterna no sinal, se as magnitudes começam a aumentar ou diminuir, e se continua a fazê-lo. Se as magnitudes não aumentarem ou diminuírem, o programa será interrompido operando em uma matriz vazia. As principais etapas são mostradas abaixo (este código também mostrará o progresso da pilha):
fonte
PHP, 322 bytes
para uma saída mais bonita
echo["n","+P","-P","+F","-F"][$s];
Versão expandida
Valor da tarefa 2 segundo sem regra de dobra curta
Visualize uma palavra
no snippet é o resultado do SVG que eu criei
fonte
'.(.8*$radius).'
em vez de'.($radius).'
e se você substituir($radius).' 0 0 0
com($radius).' 0 0 '.(($w[$i-1]<$w[$i]?1:0)^(($i-1)%2)).'
o programa não tem uma direção correçãoHaskell, 148 bytes
Experimente em Ideone.
A entrada deve estar em letras minúsculas ou todas em maiúsculas.
A saída é uma lista de cinco booleans:
[SW?, CF?, CP?, CW?, CC?]
.f "positive" -> [True,True,False,False,True]
Isso ficou mais do que o esperado, especialmente entregar o recolhimento de caracteres repetidos leva cerca de 40 bytes.
No começo eu comparados apenas os primeiros dois caracteres para produzir
CW
ouCC
antes de notar que os casos de teste comobba
oubbc
são válidos também e derrotar esta abordagem.fonte
Python, 152 bytes:
Uma função lambda anônima. Ligar como
print(<Function Name>('<String>'))
.Recebe a entrada como todas minúsculas ou maiúsculas, mas não com maiúsculas e minúsculas.
Gera uma matriz que não contém nada (
[]
) se a palavra não for swirly ou uma matriz no seguinte formato:True/False
paraCentrifugal/Centripetal
.True/False
paraClockwise/Counterclockwise
.Experimente Online! (Ideona)
fonte