Ce défi est essentiellement identique à celui-ci avec une seule différence: il est désormais autorisé de mélanger les lettres n'importe où dans la chaîne.
Scénario
John a un nombre important, et il ne veut pas que les autres le voient.
Il a décidé de crypter le numéro, en procédant comme suit:
Son nombre est toujours une séquence non décroissante (ie. "1123"
)
Il a converti chaque chiffre en mots anglais. (c.-à-d. "123" -> "ONETWOTHREE"
)
Et puis, réorganisez les lettres au hasard. (c.-à-d. "ONETWOTHREE" -> "EEWOOHRNTET"
)
John estimait que son numéro était sûr de le faire. En fait, un tel chiffrement peut être facilement déchiffré :(
Tâche
Étant donné la chaîne chiffrée, votre tâche consiste à la déchiffrer et à renvoyer le numéro d'origine.
Règles
- C'est le golf de code, donc la réponse la plus courte en octets gagne
- Vous pouvez supposer que la chaîne d'entrée est toujours valide
- La chaîne d'entrée ne contient que des lettres majuscules
- Les numéros originaux sont toujours classés par ordre croissant
- Vous pouvez renvoyer le nombre sous forme de chaîne ou d'entier
Les lettres ne seront mélangées qu'entre un mot et non entre la chaîne entière.Les lettres peuvent être mélangées n'importe où dans la chaîne.- Les nombres ne seront que de 1 à 9 inclus (
ONE
àNINE
)
Chaîne non brouillée possible
Voici une liste des chaînes juste après leur conversion en chaînes à partir des nombres:
1 -> ONE
2 -> TWO
3 -> THREE
4 -> FOUR
5 -> FIVE
6 -> SIX
7 -> SEVEN
8 -> EIGHT
9 -> NINE
Exemples
"NEO" -> 1
"NWEOOT" -> 12
"TOEERWNEHOT" -> 123
"IHNEVGENNEISTE" -> 789
"WEETVTRFSVUHNEEFRHIXEOINSNIEGTOONIEE" -> 123456789
"EWHEWROETOTTON" -> 1223
"ONEWESTV" -> 27
(merci, ETHproductions!)
la source
"ONEWESTV" -> 27
(inclut un nombre qui n'apparaît pas réellement)Réponses:
Python 2 , 123 octets
Un programme complet prenant les entrées citées et imprimant le numéro de John.
Essayez-le en ligne! ou voir une suite de tests
Comment?
Travaillons avec l'exemple "NEONSEXTOWNII" (pour donner 1269, et soyons un peu Leisure Suite Larry -esque!)
Prend d'abord la
c=map(input().count,"OWHUFXSGIQ")
saisie et compte le nombre de chacunOWHUFXSGIQ
- ce sont des lettres qui apparaissent dans chaque nombre dans l'ordre croissant, 2,4,6 et 8 ayant leurs propres lettres (WUXG
), plus une lettre supplémentaire,Q
pour ajouter un zéro à la fin et égaliser la longueur de la liste résultante. Pour l'exemple:Les entrées pour 1, 3, 5, 7 et 9 doivent être ajustées pour corriger l'abondance des autres lettres. Ceci est effectué par la boucle suivante:
Notez que les entrées à ajuster sont des entrées alternatives (1,3,5,7,9,1,3,5, ...), nous pouvons donc ajouter deux à une variable d'index à chaque étape et modulo par 10 pour rester dans plage si nous devons parcourir plusieurs fois (ce que nous faisons). Pour économiser quelques octets, nous pouvons incrémenter d'un et modulo de 5 et utiliser le double de l'index.
Étant donné que les ajustements pour 9 nécessitent le plus de travail, nous commençons là - il réside à l'index 8, donc nous commençons à
i=4
. La chaîne"71735539994"
donne ensuite les index,,j
des valeurs à supprimer à chaque étape (où nous nous sommes assurés que le neuvième index contiendra zéro en utilisant"Q"
lors de la créationc
);c[i*2]-=c[int(j)]
effectue chaque ajustement individuel eti=-~i%5
passei
à l'index suivant (où-~i
est-(-1-i)
oui+1
sauvegarde des parenthèses(i+1)%5
) en gardanti*2
dans les limites dec
.Ainsi, nous soustrayons d'abord le nombre à l'index
j=7
de celui à l'indexi*2=8
, en soustrayant le nombre de "G" comptés du nombre de "I", en ajustant le compte "NINE" par le nombre (correct) de "HUIT" ( qui a également un "je"). Nous passons ensuite ài=0
(-~4%5 = (4+1)%5 = 0
), référençant l'indexi*2 = 0
qui est pour "UN" et soustrayons la valeur trouvée à l'index enj=1
comptant "W" et donc "DEUX", en ajustant le nombre de "O" vers le bas. À la fin de la boucle, nous avons les comptes corrigés:il ne reste donc qu'à imprimer ce
c
qui représente maintenant (1269
).i
est maintenant de retour à0
, donc nous l'incrémentons au début de la boucle et l'utilisons comme chiffre:Les tiques arrière
`i`
,, sont un raccourci Python2 pourrepr(i)
lequel obtient une représentation sous forme de chaîne d'un objet (le caractère numérique en question sous la forme d'une chaîne) et la multiplication d'une chaîne par un nombre crée une nouvelle chaîne de ce nombre de répétitions (ici, nous ne montrons que len=0
virage`i`
de dire"5"
vers""
etn=1
tournant en gardant dire"6"
comme"6"
, mais cela fonctionne aussi pour les entiers positifs plus grands,"3"*4
devient ainsi"3333"
par exemple.)la source
05AB1E , 31 octets
Essayez-le en ligne!
Explication
Très inefficace pour de grandes entrées.
la source
‘Z€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š‘# # push the list ['Z','ONE','TWO','THREE','FOUR','FIVE','SIX','SEVEN','EIGHT','NINE']
: pouvez-vous expliquer un peu, j'ai du mal à comprendre comment une chaîne peut être générée.‘
délimite une chaîne compressée en majuscules de mots séparés par des espaces.Z
signifieZ
. Toutes les autres paires de 2 symboles désignent un mot compressé du dictionnaire 05AB1E . Ainsi, par exemple, se€µ
traduit parONE
.2419
. Les symboles dont nous avons besoin sont les symboles qui sont suivis par24
et19
dans les documents . Dans notre cas, c'est24=Ÿ
et19=™
ceHELLO
serait le cas‘Ÿ™‘
Rétine ,
11297 octetsEssayez-le en ligne!
-12 octets grâce à @Neil
-3 octets par utilisation de classes de caractères L en transposition
Comment ça fonctionne
Fondamentalement, cela repose sur le fait que les lettres ne sont utilisées que dans certains noms de nombres. Par exemple,
SIX
est le seul nom qui contient unX
. Cela devient plus délicat avec le fait que certains mots se chevauchent dans les lettres, comme les deuxFIVE
et enSEVEN
utilisantV
. Cela pourrait être corrigé en s'identifiantFIVE
avecF(.*)V
.la source
GH
etNO
serait adjacente, sauf pour toute substitution précédente8
ou1
d'une substitution antérieure ...}`GH
8
- être que cela fonctionnerait8
-}
cela entraînerait un nouveau tri des caractères, plaçant ainsi tous les éléments restantsG
etH
ensemble.NO -> 1
, ce qui était pratique.Kotlin 1.1 ,
359352331327325 octetsSoumission
Ne fonctionne pas sur TryItOnline car Kotlin 1.1 n'est pas pris en charge
Tester
Logique
J'ai utilisé la feuille ci-dessus pour trouver le moyen le plus simple de résoudre chaque lettre
Modifications
la source
var s=""
etreturn s
versr=""
etreturn r
en réutilisant la chaîne d'entrée, dont vous n'avez plus besoin à ce stade? Je n'avais jamais programmé à Kotlin auparavant, il se pourrait donc que je dise des bêtises ici. ; pfinal
par défaut. Hmm, une autre chose que vous pourriez jouer au golf: placez levar s=""
comme première chose dans la méthode et remplacez-leval f=r.split("").
parval f=r.split(s).
. Encore une fois, aucune idée si cela fonctionne. Dommage que TIO ne supporte pas encore la v1.1, sinon j'essaierais ces suggestions moi-même avant de me faire un son stupide ..Gelée , 37 octets
Essayez-le en ligne!
-1 merci à Jonathan Allan .
la source
NINEFIVE
,THREEFIVE
). Est-ce un bug ou le code est-il simplement inefficace?Œ!
signifie "permutations")...“©ȯ¿w¶&ÇhṆỌƘ#Ȯʋ~¢CNẓ_»...
Java 8,
248234 octetsExplication du code:
-14 Merci à Olivier Grégoire
la source
Java 8,
346345344336327 octetsEssayez-le ici.
Explication générale:
J'ai regardé les occurrences de chaque caractère de l'alphabet:
G=8; U=4; W=2; X=6
.F=5; H=3
.V=7
(en soustrayantF=5
).O=1; N=9
.N
a deux occurrencesNINE
, j'ai dû en faire une supplémentaire-1
pour chaque occurrence deN
, donc je l'ai utilisé à laI=9
place (en soustrayant trois correspondances précédentes au lieu de deux).Explication du code:
la source
Perl 5 , 100 octets
Code de 99 octets + 1 octet pour le
-n
commutateur.Essayez-le en ligne!
la source
Python 3 , 225 octets
Essayez-le en ligne!
Simple: supprimez d'abord les chiffres identifiés par une lettre spécifique.
la source
Python 3 , 125 octets
Essayez-le en ligne!
Après avoir lu le défi lié, j'ai réalisé qu'il s'agissait d' une variation de la solution Python de mdahmoune , elle-même basée sur la solution ES6 de Draco18s , mais bon, au moins nous avons joué deux octets.
Comme cette solution, nous calculons la réponse par une combinaison linéaire du nombre d'occurrences de certaines lettres. Nous codons brièvement les combinaisons linéaires en les écrivant comme des mots où les deux premières lettres doivent être ajoutées et tout ce qui doit ensuite être soustrait. Parfois, un caractère est nécessaire pour remplir les deux premiers caractères; nous l'utilisons pour masquer le chiffre que nous voulons sortir (qui ne se produira jamais dans l'entrée, donc n'affectera pas notre algorithme), que nous extrayons avec
min
.la source
R, 154
Essayez-le en ligne!
la source
Axiome, 351 octets
résultats non commentés non commentés
la source