Diese Herausforderung ist im Wesentlichen identisch mit dieser, mit nur einem Unterschied: Es ist jetzt zulässig, Buchstaben an einer beliebigen Stelle in der Zeichenfolge zu mischen.
Szenario
John hat eine wichtige Nummer und er möchte nicht, dass andere sie sehen.
Er beschloss, die Nummer mit den folgenden Schritten zu verschlüsseln:
Seine Nummer ist immer eine nicht abnehmende Folge (d. H. "1123"
)
Er wandelte jede Ziffer in englische Wörter um. (dh. "123" -> "ONETWOTHREE"
)
Ordnen Sie die Buchstaben dann nach dem Zufallsprinzip neu an. (dh. "ONETWOTHREE" -> "EEWOOHRNTET"
)
John hatte das Gefühl, dass seine Nummer in Sicherheit war. In der Tat kann eine solche Verschlüsselung leicht entschlüsselt werden :(
Aufgabe
Angesichts der verschlüsselten Zeichenfolge s besteht Ihre Aufgabe darin, sie zu entschlüsseln und die ursprüngliche Nummer zurückzugeben.
Regeln
- Dies ist Codegolf, daher gewinnt die kürzeste Antwort in Bytes
- Sie können davon ausgehen, dass die Eingabezeichenfolge immer gültig ist
- Die Eingabezeichenfolge enthält nur Großbuchstaben
- Die ursprünglichen Nummern sind immer in aufsteigender Reihenfolge angeordnet
- Sie können die Zahl im String- oder Integer-Format zurückgeben
Die Buchstaben werden nur zwischen einem Wort und nicht zwischen der gesamten Zeichenfolge gemischt.Die Buchstaben können an einer beliebigen Stelle in der Zeichenfolge gemischt werden.- Die Zahlen sind nur von 1 bis einschließlich 9 (
ONE
bisNINE
)
Mögliche nicht verschlüsselte Zeichenfolge
Hier ist eine Liste der Zeichenfolgen, nachdem sie aus den Zahlen in Zeichenfolgen konvertiert wurden:
1 -> ONE
2 -> TWO
3 -> THREE
4 -> FOUR
5 -> FIVE
6 -> SIX
7 -> SEVEN
8 -> EIGHT
9 -> NINE
Beispiele
"NEO" -> 1
"NWEOOT" -> 12
"TOEERWNEHOT" -> 123
"IHNEVGENNEISTE" -> 789
"WEETVTRFSVUHNEEFRHIXEOINSNIEGTOONIEE" -> 123456789
"EWHEWROETOTTON" -> 1223
"ONEWESTV" -> 27
(Danke, ETHproductions!)
quelle
"ONEWESTV" -> 27
(enthält eine Nummer, die nicht wirklich erscheint)Antworten:
Python 2 , 123 Bytes
Ein vollständiges Programm, bei dem die angegebene Nummer eingegeben und ausgedruckt wird.
Probieren Sie es online! oder sehen Sie sich eine Testsuite an
Wie?
Lassen Sie uns mit dem Beispiel "NEONSEXTOWNII" arbeiten (um 1269 zu erhalten und etwas Leisure Suite Larry -esque zu sein!)
Nimmt zuerst
c=map(input().count,"OWHUFXSGIQ")
die Eingabe und zählt die Anzahl von jedem vonOWHUFXSGIQ
- dies sind Buchstaben, die in jeder Zahl in aufsteigender Reihenfolge erscheinen, wobei 2,4,6 und 8 ihre "eigenen" Buchstaben (WUXG
) plus einen zusätzlichen Buchstaben haben,Q
um eine Null anzufügen bis zum Ende und machen Sie die Länge der resultierenden Liste gerade. Zum Beispiel:Die Einträge für 1, 3, 5, 7 und 9 müssen angepasst werden, um die Häufigkeit der anderen Buchstaben zu korrigieren. Dies wird von der nächsten Schleife ausgeführt:
Beachten Sie, dass es sich bei den anzupassenden Einträgen um alternative Einträge handelt (1,3,5,7,9,1,3,5, ...). Daher können wir bei jedem Schritt zwei zu einer Indexvariablen hinzufügen und modulo um 10 addieren, um darin zu bleiben Bereich, wenn wir mehr als einmal überqueren müssen (was wir tun). Um einige Bytes zu sparen, können wir um eins und modulo um 5 erhöhen und den doppelten Index verwenden.
Da die Anpassungen für 9 die meiste Arbeit erfordern, die wir dort beginnen, befindet sie sich bei Index 8, also beginnen wir bei
i=4
. Die Zeichenfolge"71735539994"
gibt dann die Indizesj
der Werte an, die in jeder Phase entfernt werden sollen (wobei wir sichergestellt haben, dass der neunte Index"Q"
bei der Erstellung Null enthältc
).c[i*2]-=c[int(j)]
führt jede einzelne Einstellung undi=-~i%5
bewegt sichi
zu dem nächsten Index (wobei-~i
ist-(-1-i)
oderi+1
Spar Klammern(i+1)%5
) keepingi*2
innerhalb der Grenzenc
.Also subtrahieren wir zuerst die Zahl am Index
j=7
von der Zahl am Indexi*2=8
, subtrahieren die Anzahl der gezählten "G" von der Anzahl der "I" und passen den "NINE" Countdown um die (richtige) Anzahl der "EIGHT" an ( das hat auch ein "ich"). Wir bewegen uns dann aufi=0
(-~4%5 = (4+1)%5 = 0
), referenzieren den Index,i*2 = 0
der für "EINS" steht, und subtrahieren den am Index gefundenen Wert vonj=1
dem Eintrag, der "W" und somit "ZWEI" zählt, und passen die Anzahl der "O" abwärts an. Am Ende der Schleife haben wir die korrigierten Zählungen:Sie müssen also nur noch ausdrucken, was
c
jetzt für (1269
) steht.i
ist jetzt wieder bei0
, also erhöhen wir es am Anfang der Schleife und verwenden es als unsere Ziffer:Die hinteren
`i`
Häkchen sind Python2-Abkürzungen, fürrepr(i)
die eine Zeichenfolgendarstellung eines Objekts (das betreffende Ziffernzeichen als Zeichenfolge) abgerufen und durch Multiplizieren einer Zeichenfolge mit einer Zahl eine neue Zeichenfolge mit so vielen Wiederholungen erstellt wird (hier zeigen wir nur dasn=0
Drehen`i`
von etwa)"5"
zu""
undn=1
drehen sagen"6"
wie"6"
, aber es funktioniert auch für größere positive ganze Zahlen, so"3"*4
wird"3333"
zum Beispiel.)quelle
05AB1E , 31 Bytes
Probieren Sie es online!
Erläuterung
Sehr ineffizient für große Eingaben.
quelle
‘Z€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š‘# # push the list ['Z','ONE','TWO','THREE','FOUR','FIVE','SIX','SEVEN','EIGHT','NINE']
: Kannst du etwas erklären, ich habe Mühe zu verstehen, wie ein String erzeugt werden kann.‘
eine komprimierte Zeichenfolge mit durch Leerzeichen getrennten Wörtern in Großbuchstaben.Z
bedeutetZ
. Alle anderen 2-Symbol-Paare bezeichnen ein komprimiertes Wort aus dem 05AB1E- Wörterbuch . Also zum Beispiel€µ
übersetzt alsONE
.2419
. Die Symbole, die wir benötigen, sind die Symbole, die von24
und19
in den Dokumenten gefolgt werden . In unserem Fall ist dies24=Ÿ
und19=™
soHELLO
wäre es‘Ÿ™‘
Retina ,
11297 BytesProbieren Sie es online!
-12 Bytes dank @Neil
-3 Bytes durch Verwendung von L Zeichenklassen bei der Transposition
Wie es funktioniert
Grundsätzlich beruht dies auf der Tatsache, dass Buchstaben nur in bestimmten Nummernnamen verwendet werden. Zum Beispiel
SIX
ist der einzige Name, der ein enthältX
. Dies wird schwieriger, wenn einige Wörter in Buchstaben überlappen, z. B. beideFIVE
undSEVEN
usingV
. Dies könnte korrigiert werden, indem man sichFIVE
mit identifiziertF(.*)V
.quelle
GH
undNO
wäre nebeneinander, außer für alle vorherigen8
oder1
von einem vorherigen Ersatz ...}`GH
8
würde das funktionieren8
- das}
würde dazu führen, dass die Zeichen erneut sortiert werden, wodurch alle verbleibendenG
undH
zusammengefügt werden.NO -> 1
, was praktisch war.Kotlin 1.1 ,
359352331327325 BytesEinreichung
Funktioniert nicht mit TryItOnline, da Kotlin 1.1 nicht unterstützt wird
Prüfung
Logik
Ich habe das Blatt oben verwendet, um die einfachste Lösung für jeden Buchstaben zu finden
Bearbeitungen
quelle
var s=""
undreturn s
zur=""
undreturn r
, die Sie nicht mehr benötigen an dieser Stelle durch die Eingabe-String Wiederverwendung? Ich habe noch nie in Kotlin programmiert, also könnte es sein, dass ich hier Unsinn rede. ; pfinal
standardmäßig eingestellt. Hmm, eine andere Sache, die Sie vielleicht golfen können: Platzieren Sie dievar s=""
als erstes in der Methode und ersetzen Sie sieval f=r.split("").
durchval f=r.split(s).
. Auch hier keine Ahnung, ob es funktioniert. Schade, dass TIO v1.1 noch nicht unterstützt, ansonsten würde ich diese Vorschläge selbst ausprobieren, bevor ich mich blödJelly , 37 Bytes
Probieren Sie es online!
-1 Danke an Jonathan Allan .
quelle
NINEFIVE
,THREEFIVE
) tritt eine Zeitüberschreitung auf . Ist es ein Fehler oder ist der Code nur ineffizient?Œ!
bedeutet "Permutationen")...“©ȯ¿w¶&ÇhṆỌƘ#Ȯʋ~¢CNẓ_»...
Java 8,
248234 BytesCode Erklärung:
-14 Dank an Olivier Grégoire
quelle
Java 8,
346345344336327 BytesProbieren Sie es hier aus.
Allgemeine Erklärung:
Ich habe mir die Vorkommen der einzelnen Zeichen im Alphabet angesehen:
G=8; U=4; W=2; X=6
.F=5; H=3
.V=7
(durch Subtrahieren vonF=5
).O=1; N=9
.N
es zwei Vorkommen in gibtNINE
, musste ich-1
für jedes Vorkommen von ein zusätzliches machenN
, also habe ichI=9
stattdessen verwendet (indem ich drei vorherige Übereinstimmungen anstelle von zwei subtrahiere).Code Erklärung:
quelle
Perl 5 , 100 Bytes
99 Byte Code + 1 Byte für
-n
Switch.Probieren Sie es online!
quelle
Python 3 , 225 Bytes
Probieren Sie es online!
Ganz einfach: Entfernen Sie zuerst die Ziffern, die mit einem bestimmten Buchstaben gekennzeichnet sind.
quelle
Python 3 , 125 Bytes
Probieren Sie es online!
Nachdem ich die verknüpfte Herausforderung gelesen hatte, stellte ich fest, dass es sich um eine Variation der Python-Lösung von mdahmoune handelt , auf der sie selbst basiert der ES6-Lösung Draco18s basiert .
Wie diese Lösung berechnen wir die Antwort durch eine lineare Kombination der Anzahl der Vorkommen bestimmter Buchstaben. Wir kodieren die linearen Kombinationen kurz, indem wir sie als Wörter schreiben, bei denen die ersten beiden Buchstaben hinzugefügt und anschließend alles subtrahiert werden soll. Manchmal wird ein Zeichen benötigt, um die ersten beiden Zeichen aufzufüllen. Wir verwenden dies, um die auszugebende Ziffer auszublenden (die in der Eingabe niemals vorkommt und daher unseren Algorithmus nicht beeinflusst), mit der wir extrahieren
min
.quelle
R 154
Probieren Sie es online!
quelle
Axiom, 351 Bytes
ungolfed kommentierte Ergebnisse
quelle