Diretrizes
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" -> "ENOWTOHEETR"
)
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.
- 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
"ENOWOT" -> 12
"EONOTWHTERE" -> 123
"SNVEEGHEITNEIN" -> 789
"ENOOWTEERHTRUOFEVIFXISNEVESTHGIEENIN" -> 123456789
"NOEWOTTOWHEERT" -> 1223
fonte
Respostas:
Geléia ,
3837 bytesUm link monádico que obtém uma lista de caracteres (a sequência) e retorna um número inteiro.
Experimente online!
Usa um muito diferente do método a resposta geléia de Pietu1998 ,
ainda tem a mesma contagem de bytes(Eu realmente pensei que poderiaele se acabar como menos)!Não depende da monotonicidade do número original (portanto, uma entrada de
HTREEWTONOE
funcionaria, por exemplo).Quão?
Primeiro, observe que as próprias palavras (e, portanto, quaisquer anagramas) podem ser alteradas para as de comprimento 4 removendo Rs, Gs e Ss e substituindo qualquer Os por dois caracteres (digamos "12") e qualquer Xs com três caracteres ( diga "345").
Podemos então mapear o produto dos ordinais desses caracteres para os números de 1 a 9 usando o módulo aritmético, dependendo da nossa escolha (o "12345"), e procurá-los em uma lista reordenada dos dígitos. O código realmente converte os caracteres primeiro e depois substitui os ordinais, mas também é possível em 37 bytes por caracteres, por exemplo, "DIAAE" ( tente ).
fonte
NINEONENIENOENNNIENOENNEINEONEINEONNENIENOINNEINENINNEINENIENNIENNNNIENNEININENIENNENINEINENINENNIEINNEINNENNIENIN
.Python 2,
121117115 bytes-4 bytes: Depois de tudo isso, esqueci de incorporar uma variável de uso único. Peido de cérebro.
-2 bytes: recuo em espaço duplo → recuo em uma guia (graças a Coty Johnathan Saxman); observe que isso não aparece corretamente na resposta.
Ungolfed (compatível com python 3):
Localizador de número mágico:
Explicação:
Tive a sensação de poder esmagar os bits ASCII juntos e resumir de alguma forma para determinar quando eu tinha uma palavra completa. Originalmente, tentei mexer
3**ord(letter)
e comparar com os resultados esperados, mas resultou em alguns números muito grandes. Eu acho que seria apropriado aplicar um pouco de força bruta a alguns parâmetros, a saber, módulo (para garantir que os números sejam pequenos) e um multiplicador para dispersar os números de maneira diferente em torno do intervalo do módulo.Acabei mudando a variável multiplicadora para uma variável que afetava o poder em si, porque (por tentativa e erro) que de alguma forma conseguiu me dar uma resposta ligeiramente mais curta.
E acima, você vê os resultados dessa força bruta e um pouco de golfe manual.
A razão para escolher
3**x
originalmente é porque eu sabia que você poderia representar todos os números lá. Os dígitos mais repetidos que qualquer número teve são dois (thrEE, sEvEn, NiNe, etc), então decidi pensar em cada entrada como um número base-3. Dessa forma, eu poderia (mentalmente) representá-los como algo como10100000000010020000
(três; um 1 not
slot, um 1 nor
slot, um 1 noh
slot e um 2 noe
slot). Cada número dessa maneira obtém uma representação única que pode ser facilmente reunida, iterando a string e somando alguns números, e acaba independente da ordem real das letras. Obviamente, essa não foi a solução ideal, mas a solução atual ainda está escrita com essa ideia em mente.fonte
\x83
,\x8e
e,\x92
na seqüência.SyntaxError: Non-ASCII character '\xc2' in file <stdin> on line 3, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
. Funciona se eu colocar ocoding
comentário lá em cima, mas isso ganha 15 bytes extras.Python 2 ,
131127 bytesExperimente online!
Com base em uma versão corrigida da solução JavaScript Draco18s .
fonte
vars
!PHP , 164 bytes
Experimente online!
PHP , 179 bytes
com base na abordagem anterior, verifique primeiro os números pares e depois os números ímpares em ordem crescente
Experimente online!
PHP , 201 bytes
Experimente online!
fonte
ENOOWTWTOWOT
$i++<9
e em$i
vez de$i<10
e++$i
(-1 byte);_405162738[$i]
em vez de$i%2?$i/2+4:$i/2-1
(-4 bytes) ($i/2+~($i%2*-5)
iria trabalhar muito, mas isso é um byte mais tempo.)Javascript (ES6),
288150144 bytesMais do que
as outras duas,uma das outras entradas JS, mas pensei em abandonar uma abordagem interessante que poderia funcionar para alguém em outro idioma.Essencialmente, podemos determinar o seguinte:
Qualquer ocorrência dessas letras implica que esse dígito exista no número original. A partir daqui, podemos deduzir o restante dos dígitos:
Incluindo os dois casos complicados:
Ambos
1
e9
área Hard comparativamente. Para ONE,E
aparece mais de uma vez em algumas palavras (SEVEN
tem duas) e fazN
(NINE
), então estamos presos à verificação doO
que ocorre em outros dois lugares, felizmente, ambos são simples.Para Nove, nove é difícil, não importa como você o corta.
Assim, terminamos com este mapa:
9 é capaz de referenciar siX, eiGht e Five (com 5 referências anteriores) com as atribuições de variáveis, economizando bytes. Graças a Neil por isso, ele usa vários recursos do JS com os quais eu não estou familiarizado (os back-tiquetaques para retirar
('
ao meio, por exemplo) e, na verdade, chega muito mais perto da idéia que eu escrevi no papel antes de tentar codificá-lo (Eu tinha deixado 9 como "o que sobrou", pensando nisso como "se eu vir umX
, posso removê-lo e umS
eI
da corda, então ..." para que, depois dos quatro casos simples, os próximos três se tornem simples).A razão dessa entrada ser interessante é porque ela pode manipular qualquer sequência aleatória como entrada. ou seja, em vez de as palavras individuais serem embaralhadas, podemos embaralhar toda a cadeia, que é o que eu pensei que John estava fazendo originalmente:
fonte
s.split(t).length-1
, 2 bytes usandos.repeat(n>0&&n)
(por que n é menor que zero afinal? Salva 7 bytes). Salve um monte de bytes declarandog
no escopo des
forma que você não precise continuar passando o tempo todo; e melhor ainda, você pode torná-lo um modelo marcado, que economiza 55 bytes no total (antes da correção 9). Economize mais bytes salvando valores repetidos em temporários, e eu raspei mais alguns fora de usarmap
:s=>[,(l=t=>s.split(t).length-1)`O`-l`W`-l`U`,w=l`W`,l`R`-w,u=l`U`,l`F`-u,x=l`X`,l`S`-x,g=l`G`,l`I`-x-g].map((n,i)=>`${i}`.repeat(n)).join``
.Mathematica, 133 bytes
entrada
saída
fonte
c@#[[i]]
nãoc[#[[i]]]
? Você pode salvar outro byte usando a sintaxe de infix~
noTable
.C #, 218 bytes
Versão curta:
Versão expandida:
Experimente ONLINE!
Sendo minha primeira entrada, não tenho certeza sobre as regras ... Estou apenas contando o tamanho da classe usada para descriptografar, não o código que a testa, certo?
Editar
E por diversão - eis o que comecei a fazer, sem ler as regras completas: S - Veja no IdeOne . Ele é criptografado mesmo quando caracteres de um dígito podem ser embaralhados para qualquer lugar da string.
Editar 2
Encurtado de acordo com as dicas de TheLethalCoder. Obrigado!
Editar 3
E agora Titus raspou mais alguns bytes. Obrigado!
fonte
public static
-lo para. Você pode converter para um método anônimo comos=>{<do stuff>return"";}
. Você pode usarvar
algumas vezes, declarar variáveis juntas economiza bytes, ieint i=1,j;
. Criar um array a partir de uma string e dividi-la geralmente é mais curto (embora eu não tenha verificado neste caso), por exemplo"ONE|TWO".Split('|')
. Você pode usar em<0
vez de==-1
s=>{var n="ONE|TWO|THREE|FOUR|FIVE|SIX|SEVEN|EIGHT|NINE".Split('|');for(int i=0,j;++i<= 9;)for(j=0;n[i-1].IndexOf(s[j])<0;){if(++j==n[i-1].Length){var r=i+"";while(j<s.Length){j+=n[i].Length;r+=++i;}return r;}}return "";}
JavaScript (ES6),
142139 bytesGuardado 3 bytes graças a Neil .
Atualmente, não aproveita os números que estão sempre organizados em ordem crescente
fonte
"axbxc".split`x`.join``
. Como isso é chamado? Não consigo encontrar nada no google.split
ejoin
x=`foo${5+5}bar`
), eles estão com etiquetas quando você chamar uma função de usá-los sem parênteses:foo`foo${5+5}bar`
o que é o mesmo quefoo(['foo','bar'], 10)
f(s.slice(y))
é sempre uma string para que você não precise do''+
antes.Gelatina , 38 bytes
Experimente online!
Explicação
fonte
"EIGHTNINE"
para ele :)3
com2.2
por usar um limite superior menor, o que permite calcular facilmente o 789 sem alterar o princípio de funcionamento.2
seria bom, mas dificilmente falharia em certas entradas com muitos seis.Javascript (ES6), 221 bytes
Exemplo de trecho de código:
fonte
Retina , 160 bytes
Experimente online! Basicamente baseado na resposta do PowerShell do @ TessellatingHeckler.
fonte
Retina , 88 bytes
Experimente online!
Explicação
fonte
PowerShell , 182 bytes
Experimente online!
Código ungolfed mas não trabalhando:
por exemplo,
(?<3>[THRE]{5})
corresponde à classe de caracteresTHRE
, para que possa correspondê-los fora de ordem e deve corresponder a qualquer um desses caracteres cinco vezes um ao lado do outro, e o grupo de captura é nomeado '3' para mapear nomes com números.Compactação rudimentar trocando o texto repetido
})|(?<
por az
.fonte
C ++,
296, 288 bytesVersão curta:
Versão completa:
Experimente ONLINE!
Edit:
1) 200-> 296 bytes, para incluir namespace e definição de N na contagem, conforme sugerido pelo orlp 2) 296-> 288, para usar macro, graças a Zacharý
fonte
N
eusing namespace std;
a contagem de bytes.Q
logo após, sem outras adições.Ruby,
138114110 bytesA contagem de bytes inclui 1 byte para a
-p
opção.O que?
Este:
é um literal de regex que, através da interpolação de cadeias, avalia como:
Se atribuirmos isso a
regex
, o resto do código será um pouco fácil de entender: Cada correspondência na entrada é substituída pelo número do grupo de captura, extraído da variável mágica$~
que contém os dados de correspondência atuais:Experimente online!
fonte
Java 8,
198256 bytes+58 bytes .. devido ao regex da versão anterior não estar funcionando corretamente (também correspondia a "EEE"; "EEN"; etc.)
Explicação:
Experimente aqui.
fonte
"ENOOWTEERHTRUOFEVIFXISNEVESTHGIEENIN"
:([ONE]{3}
é que ela também correspondeEEN
no final do caso de teste às partes OITO e Nove. E duvido que exista. um regex para combinar todos estes:ENO|EON|NEO|NOE|OEN|ONE
sem também correspondênciaEEE;EEN;EEO;...
para todos os números que é menor do que 40 bytes .. Talvez eu possa fazer algo usandosubstring
e reverter verificando os números, mas eu realmente não tenho tempo para descobrir isso agora ..Java (OpenJDK 8) , 181 bytes
Experimente online!
Tomei a liberdade de reutilizar o modelo de TIO de Kevin Cruyssen . Espero que você não se importe;)
fonte
s.substring
. A pior parte é que eu estou usandos.substring
na minha resposta atual, lol .. Ah, bem, +1 de mim. Ainda bem que é quase fim de semana ..05AB1E ,
3631 bytesExperimente online!
Ver executado com depuração: TIO With Debug
fonte
FURONESEV
retornosFUR1SEV
:(Perl 5 , 102 + 1 (-n) = 103 bytes
Experimente online!
fonte
map{...}
muitas vezes pode ser substituído commap...,
,length
ey///c
geralmente são intercambiáveis também (nem sempre menor quando não está trabalhando no$_
embora!), Em vez dowhile
,++$,x s/^$i//
é mais curto, e se você mudar-n
para-p
que você pode acrescentar a `$ \` vez de ligarprint
! Experimente online!Python 3 ,
238236 bytesExperimente online!
Solução de força bruta, não aproveita a não diminuição dos dígitos.
Graças a @Mr. Xcoder para economizar 2 bytes!
fonte
def f(s):
na sua contagem de bytes, esta não é uma função anonymouoswhile len(s)>0
porwhile len(s)
e
para o cabeçalho da função para -1 byte. Além disso, asexec
compreensões de lista e podem salvar bytes no recuo.PHP, 141 bytes
versão mais antiga, 151 bytes :
percorre os dígitos de 1 a 9, contando caracteres únicos na palavra e subtraindo as contagens de caracteres não únicos, imprimindo o dígito em movimento.
Embora esteja imprimindo em qualquer lugar, as contagens de dígitos devem ser armazenadas para que o
9
caso funcione.Execute como pipe
-nR
ou experimente online .Ele economizaria mais 4 bytes para armazenar as contagens de dígitos em
$a[$i]
vez de$a[$i+48]
e usar ASCII1
e7
(entre aspas) em vez dos próprios caracteres de dígito.demolir
ONE
não é a única palavra com umO
, portanto, é necessário subtrair as contagens paraW
(apenas aparecendo emTWO
) eU
(somente aparecendo emFOUR
) e assim por diante.NINE
é especial, porque não há como subtrair apenas se eu usasse as letras (isso exigiriaI-X-G-F+U
ouN-O-S+W+U+X
), então, use as contagens de dígitos.PHP, 160 bytes
assume todas as entradas em maiúsculas; caracteres podem ser misturados por toda parte.
Execute como pipe
-nR
ou experimente online .explicação
percorre as palavras dos dígitos, contando as ocorrências de seus caracteres únicos na entrada e no processo, reduzindo a contagem de outros caracteres. "Outros caracteres" pode significar todos os outros caracteres da palavra; mas apenas considerando aqueles que serão necessários posteriormente, salvou 19 bytes.
A transformação do
str_repeat
loop em um loop combinado economizou 5 bytes.E o uso de variáveis variáveis para a contagem de dígitos salvou outros 8.
demolir
fonte