Esse desafio é essencialmente idêntico a este, com apenas uma diferença: agora é permitido embaralhar letras em qualquer lugar da string.
Cenário
John tem um número importante e não quer que outros o vejam.
Ele decidiu criptografar o número, usando as seguintes etapas:
Seu número é sempre uma sequência não decrescente (ie. "1123"
)
Ele converteu cada dígito em palavras em inglês. (ie. "123" -> "ONETWOTHREE"
)
E então, reorganize as letras aleatoriamente. (ie. "ONETWOTHREE" -> "EEWOOHRNTET"
)
John sentiu que seu número estava seguro ao fazê-lo. De fato, essa criptografia pode ser facilmente descriptografada :(
Tarefa
Dadas as seqüências criptografadas s, sua tarefa é descriptografá-la e retornar o número original.
Regras
- Este é o código golf, então a resposta mais curta em bytes vence
- Você pode assumir que a sequência de entrada é sempre válida
- A sequência de entrada contém apenas letras maiúsculas
- Os números originais são sempre organizados em ordem crescente
- Você pode retornar o número no formato string ou número inteiro
As letras serão embaralhadas apenas entre uma palavra, não entre toda a cadeia.As letras podem ser embaralhadas em qualquer lugar da string.- Os números serão apenas de 1 a 9, inclusive (
ONE
aNINE
)
Possível seqüência sem codificação
Aqui está uma lista das cadeias de caracteres logo após serem convertidas em cadeias de caracteres a partir dos números:
1 -> ONE
2 -> TWO
3 -> THREE
4 -> FOUR
5 -> FIVE
6 -> SIX
7 -> SEVEN
8 -> EIGHT
9 -> NINE
Exemplos
"NEO" -> 1
"NWEOOT" -> 12
"TOEERWNEHOT" -> 123
"IHNEVGENNEISTE" -> 789
"WEETVTRFSVUHNEEFRHIXEOINSNIEGTOONIEE" -> 123456789
"EWHEWROETOTTON" -> 1223
"ONEWESTV" -> 27
(obrigado, ETHproductions!)
fonte
"ONEWESTV" -> 27
(inclui um número que na verdade não aparecem)Respostas:
Python 2 , 123 bytes
Um programa completo, com entrada citada e impressão do número de João
Experimente online! ou veja uma suíte de testes
Quão?
Vamos trabalhar com o exemplo "NEONSEXTOWNII" (para renderizar 1269, e ser um pouco da Leisure Suite Larry - esque!)
Primeiro
c=map(input().count,"OWHUFXSGIQ")
recebe a entrada e conta o número de cada um delesOWHUFXSGIQ
- estas são as letras que aparecem em cada número em ordem crescente, com 2,4,6 e 8 tendo suas "próprias" letras (WUXG
), mais uma letra extra,Q
para acrescentar um zero até o final e uniformize o comprimento da lista resultante. Para o exemplo:As entradas de 1, 3, 5, 7 e 9 precisam ser ajustadas para corrigir a abundância das outras letras. Isso é realizado pelo próximo loop:
Observe que as entradas a serem ajustadas são alternativas (1,3,5,7,9,1,3,5, ...), portanto, podemos adicionar dois a uma variável de índice em cada etapa e módulo por 10 para permanecer em alcance se precisarmos percorrer mais de uma vez (o que fazemos). Para economizar alguns bytes, podemos incrementar em um e módulo em 5 e usar o dobro do índice.
Como os ajustes para 9 exigem o máximo de trabalho que começamos por lá - ele reside no índice 8 e, portanto, começamos em
i=4
. A string"71735539994"
então fornece os índices,,j
dos valores a serem removidos em cada estágio (onde garantimos que o nono índice conterá zero usando"Q"
ao criarc
);c[i*2]-=c[int(j)]
executa cada ajuste individual ei=-~i%5
passai
para o próximo índice (onde-~i
está-(-1-i)
oui+1
salvando parênteses(i+1)%5
) mantendoi*2
dentro dos limites dec
.Assim, primeiro subtraímos o número no índice
j=7
daquele no índicei*2=8
, subtraindo o número de "G" contado do número de "I" s, ajustando a contagem de "Nove" pelo número (correto) de "OITO" s ( que também tem um "eu"). Em seguida, passamos parai=0
(-~4%5 = (4+1)%5 = 0
), referenciando o índicei*2 = 0
que é "ONE" e subtraímos o valor encontrado no índice,j=1
a entrada contando "W" e, portanto, "TWO", ajustando a contagem de "O" para baixo. No final do loop, temos as contagens corrigidas:então tudo o que resta é imprimir o que
c
agora representa (1269
).i
agora está de volta0
, então o incrementamos no início do loop e o usamos como nosso dígito:Os back tiques
`i`
,, são atalhos do Python2 para osrepr(i)
quais obtém uma representação de string de um objeto (o caractere de dígito em questão como uma string) e multiplicar uma string por um número cria uma nova string com muitas repetições (aqui apenas mostramosn=0
o que`i`
dizemos"5"
to""
en=1
turning keep say"6"
as"6"
, mas também funciona para números inteiros positivos maiores,"3"*4
tornando - se,"3333"
por exemplo.)fonte
05AB1E , 31 bytes
Experimente online!
Explicação
Muito ineficiente para grandes entradas.
fonte
‘Z€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š‘# # push the list ['Z','ONE','TWO','THREE','FOUR','FIVE','SIX','SEVEN','EIGHT','NINE']
: você pode explicar um pouco, eu luto para entender como qualquer string pode ser gerada.‘
delimita uma sequência de caracteres separados por maiúsculas e minúsculas.Z
meiosZ
. Todos os outros pares de dois símbolos indicam uma palavra compactada do dicionário 05AB1E . Então, por exemplo,€µ
traduz comoONE
.2419
. Os símbolos de que precisamos são os símbolos que são seguidos por24
e19
nos documentos . No nosso caso, isso é24=Ÿ
e19=™
, então,HELLO
seria‘Ÿ™‘
Retina ,
11297 bytesExperimente online!
-12 bytes graças a @Neil
-3 bytes pelo uso de classes de caracteres L na transposição
Como funciona
Basicamente, isso se baseia no fato de que as letras são usadas apenas em determinados nomes de números. Por exemplo,
SIX
é o único nome que contém umX
. Isso fica mais complicado com o fato de algumas palavras se sobreporem às letras, como ambasFIVE
eSEVEN
usandoV
. Isso pode ser corrigido identificando-seFIVE
comF(.*)V
.fonte
GH
eNO
seria adjacente, exceto para qualquer anterior8
ou1
de uma substituição antes ...}`GH
8
funcionasse8
- isso}
faria com que os caracteres fossem classificados novamente, colocando assim qualquer restanteG
eH
juntos.NO -> 1
, o que era conveniente.Kotlin 1.1 ,
359352331327325 bytesSubmissão
Não funciona no TryItOnline porque o Kotlin 1.1 não é suportado
Teste
Lógica
Usei a folha acima para descobrir a maneira mais simples de resolver cada letra
Editar% s
fonte
var s=""
ereturn s
parar=""
ereturn r
reutilizando a entrada de cadeias, o que você não precisa mais nesse ponto? Eu nunca tinha programado em Kotlin antes, então pode ser que eu fale besteiras aqui. ; pfinal
por padrão. Hmm, outra coisa que você pode jogar golfe: coloquevar s=""
como a primeira coisa no método e substituaval f=r.split("").
porval f=r.split(s).
. Novamente, não faço ideia se funciona. Pena TIO não suporta v1.1 ainda, caso contrário eu iria tentar estas sugestões mim mesmo antes de eu fazer-me parecer estúpido ..Geléia , 37 bytes
Experimente online!
-1 graças a Jonathan Allan .
fonte
NINEFIVE
,THREEFIVE
). É um bug ou o código é apenas ineficiente?Œ!
significa "permutações")...“©ȯ¿w¶&ÇhṆỌƘ#Ȯʋ~¢CNẓ_»...
Java 8,
248234 bytesCódigo Explicação:
-14 Agradecimentos a Olivier Grégoire
fonte
Java 8,
346345344336327 bytesExperimente aqui.
Explicação geral:
Analisei as ocorrências de cada caractere no alfabeto:
G=8; U=4; W=2; X=6
.F=5; H=3
.V=7
(subtraindoF=5
).O=1; N=9
.N
há duas ocorrênciasNINE
, eu tive que fazer um adicional-1
para cada ocorrência deN
, então useiI=9
(subtraindo três correspondências anteriores em vez de duas).Código Explicação:
fonte
Perl 5 , 100 bytes
Código de 99 bytes + 1 byte para o
-n
switch.Experimente online!
fonte
Python 3 , 225 bytes
Experimente online!
Direto: remova primeiro os dígitos identificados por uma letra específica.
fonte
Python 3 , 125 bytes
Experimente online!
Depois de ler o desafio vinculado, percebi que essa é uma variação da solução Python da mdahmoune , que é baseada na solução ES6 do Draco18s , mas ei, pelo menos, conseguimos dois bytes.
Como essa solução, calculamos a resposta por meio de uma combinação linear do número de ocorrências de certas letras. Codificamos brevemente as combinações lineares, escrevendo-as como palavras nas quais as duas primeiras letras devem ser adicionadas e tudo depois deve ser subtraído. Às vezes, um personagem é necessário para preencher os dois primeiros caracteres; usamos isso para ocultar o dígito que queremos gerar (que nunca ocorrerá na entrada, portanto não afetará nosso algoritmo), com o qual extraímos
min
.fonte
R, 154
Experimente online!
fonte
Axioma, 351 bytes
resultados comentados ungolfed
fonte