Richtlinien
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" -> "ENOWTOHEETR"
)
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 Zahlen sind nur von 1 bis einschließlich 9 (
ONE
bisNINE
)
Möglicher nicht verschlüsselter String
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
"ENOWOT" -> 12
"EONOTWHTERE" -> 123
"SNVEEGHEITNEIN" -> 789
"ENOOWTEERHTRUOFEVIFXISNEVESTHGIEENIN" -> 123456789
"NOEWOTTOWHEERT" -> 1223
quelle
Antworten:
Jelly ,
3837 BytesEin monadischer Link, der eine Liste von Zeichen (die Zeichenfolge) aufnimmt und eine Ganzzahl zurückgibt.
Probieren Sie es online!
Verwendet eine ganz andere Methode als Pietu1998's Jelly-Antwort ,
hat aber die gleicheByteanzahl (ich dachte wirklich, es könnte sein, dasses weniger wird)!Verlässt sich nicht auf die Monotonie der ursprünglichen Nummer (so
HTREEWTONOE
würde zum Beispiel eine Eingabe von funktionieren).Wie?
Beachten Sie zunächst, dass die Wörter selbst (und daher alle Anagramme davon) alle in Wörter der Länge 4 geändert werden können, indem Sie Rs, Gs und Ss entfernen und Os durch zwei Zeichen (sagen Sie "12") und Xs durch drei Zeichen ersetzen ( sagen Sie "345").
Wir können dann das Produkt der Ordnungszahlen dieser Zeichen den Zahlen 1 bis 9 unter Verwendung von Modulo-Arithmetik zuordnen, abhängig von unserer Wahl (die "12345"), und diese dann in einer neu geordneten Liste der Ziffern nachschlagen. Der Code wird zuerst in Zeichen umgewandelt und ersetzt dann die Ordnungszahlen. Es ist jedoch auch möglich, 37 Byte mit Zeichen zu versehen, z. B. "DIAAE" ( probieren Sie es aus ).
quelle
NINEONENIENOENNNIENOENNEINEONEINEONNENIENOINNEINENINNEINENIENNIENNNNIENNEININENIENNENINEINENINENNIEINNEINNENNIENIN
.Python 2,
121117115 Bytes-4 Bytes: Nach all dem Golfen habe ich vergessen, eine Single-Use-Variable einzutragen. Gehirnfurz.
-2 Bytes: Einzug mit zwei Abständen → Einzug mit einem Tabulator (danke an Coty Johnathan Saxman); Beachten Sie, dass dies in der Antwort nicht richtig angezeigt wird.
Ungolfed (kompatibel mit Python 3):
Magic Number Finder:
Erläuterung:
Ich hatte das Gefühl, ich könnte die ASCII-Bits zusammenschlagen und sie irgendwie zusammenfassen, um festzustellen, wann ich ein vollständiges Wort hatte. Ursprünglich habe ich versucht, mit
3**ord(letter)
den erwarteten Ergebnissen zu experimentieren und sie zu vergleichen, aber es gab einige sehr große Zahlen. Ich denke, es wäre angebracht, einige Parameter ein wenig zu brachialisieren, nämlich den Modul (um sicherzustellen, dass die Zahlen klein sind) und einen Multiplikator, um die Zahlen im Bereich des Moduls unterschiedlich zu verteilen.Am Ende habe ich die Multiplikatorvariable in eine Variable geändert, die sich auf die Leistung selbst auswirkt, weil es mir (nach Versuch und Irrtum) irgendwie gelungen ist, eine etwas kürzere Antwort zu geben.
Und oben sehen Sie die Ergebnisse dieses brachialen und ein wenig manuellen Golfspiels.
Der Grund für die
3**x
ursprüngliche Wahl war, dass ich wusste, dass Sie jede Zahl dort vertreten können. Die am häufigsten wiederholten Ziffern einer Zahl sind zwei (thrEE, sEvEn, NiNe usw.), daher habe ich beschlossen, jede Eingabe als Zahl zur Basis 3 zu betrachten. Auf diese Weise könnte ich sie (mental) als so etwas wie10100000000010020000
(drei; eine 1 imt
Steckplatz, eine 1 imr
Steckplatz, eine 1 imh
Steckplatz und eine 2 ime
Steckplatz) darstellen. Auf diese Weise erhält jede Zahl eine eindeutige Darstellung, die durch Iteration der Zeichenfolge und Summieren einiger Zahlen leicht zusammengesetzt werden kann, und sie endet unabhängig von der tatsächlichen Reihenfolge der Buchstaben. Natürlich stellte sich dies nicht als die ideale Lösung heraus, aber die aktuelle Lösung ist immer noch unter Berücksichtigung dieser Idee geschrieben.quelle
\x83
,\x8e
und\x92
in der Zeichenkette.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
. Es funktioniert, wenn ich dencoding
Kommentar dort oben platziere, aber das bringt 15 zusätzliche Bytes.Python 2 ,
131127 BytesProbieren Sie es online!
Basiert auf einer korrigierten Version der JavaScript Draco18s- Lösung.
quelle
vars
!PHP , 164 Bytes
Probieren Sie es online!
PHP , 179 Bytes
basierend auf dem vorherigen Ansatz überprüfen Sie zuerst die geraden und dann die ungeraden Zahlen in aufsteigender Reihenfolge
Probieren Sie es online!
PHP , 201 Bytes
Probieren Sie es online!
quelle
ENOOWTWTOWOT
$i++<9
und$i
anstelle von$i<10
und++$i
(-1 Byte);_405162738[$i]
anstelle von$i%2?$i/2+4:$i/2-1
(-4 Bytes) ($i/2+~($i%2*-5)
würde auch funktionieren, aber das ist ein Byte länger.)Javascript (ES6),
288150144 BytesLänger als
die beidenanderen JS-Einträge, aber ich dachte, ich würde einen interessanten Ansatz fallen lassen, der für jemanden in einer anderen Sprache funktionieren könnte.Grundsätzlich können wir folgendes feststellen:
Jedes Vorkommen dieser Buchstaben impliziert, dass diese Ziffer in der ursprünglichen Nummer vorhanden ist. Von hier können wir den Rest der Ziffern ableiten:
Einschließlich der zwei komplizierten Fälle:
Beides
1
und9
Area Hard vergleichsweise. Bei ONE wirdE
in einigen WörternSEVEN
mehrmals angezeigt ( hat zwei), ebenso wie beiN
(NINE
). Wir bleiben also bei der Überprüfung,O
welche an zwei anderen Stellen auftritt. Glücklicherweise sind beide einfach.Für NEUN ist neun schwer, egal wie Sie es schneiden.
So kommen wir zu dieser Karte:
9 ist in der Lage, siX, eiGht und Five (mit 5 Rückverweisen für) mit den variablen Zuweisungen rückzuverweisen, wodurch Bytes gespart werden. Dank Neil nutzt es einige Funktionen von JS, mit denen ich nicht vertraut bin (zum Beispiel die Back-Ticks für das Halbieren
('
) und kommt der Idee, die ich vor dem Versuch, sie zu codieren, auf Papier gezeichnet hatte, tatsächlich viel näher (ich hatte links 9 als „was übrig bleibt“, darüber nachzudenken , wie „wenn ich sehe , einX
ich es entfernen und einS
undI
aus dem String, dann ...“ , so dass nach den vier einfachen Fällen die nächsten 3 würde sich einfach).Der Grund, warum dieser Eintrag interessant ist, ist, dass er eine beliebige gemischte Zeichenfolge als Eingabe verarbeiten kann. Das heißt, anstatt die einzelnen Wörter zu mischen, können wir die gesamte Zeichenfolge mischen, was ich dachte, dass John ursprünglich tat:
quelle
s.split(t).length-1
, 2 Bytes mits.repeat(n>0&&n)
(warum ist n ohnehin kleiner als Null? Spart 7 Bytes). Sparen Sie eine Menge Bytes, indem Sieg
im Bereich von deklarieren,s
damit Sie es nicht ständig weitergeben müssen, und noch besser, Sie können es zu einer mit Tags versehenen Vorlage machen, die insgesamt 55 Bytes spart (vor 9 Korrekturen). Speichern Sie mehr Bytes durch wiederholte Werte in Provisorien zu speichern, und ich rasierte ein paar mehr dran mitmap
: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
Eingang
Ausgabe
quelle
c@#[[i]]
anstelle von speichernc[#[[i]]]
? Möglicherweise können Sie ein anderes Byte speichern, indem Sie die Infix-Syntax~
auf dem verwendenTable
.C # 218 Bytes
Kurzfassung:
Erweiterte Version:
Versuchen Sie es ONLINE!
Als mein erster Eintrag bin ich mir nicht sicher über die Regeln ... Ich zähle nur die Größe der Klasse, die zum Entschlüsseln verwendet wird, nicht den Code, der sie testet, oder?
Bearbeiten
Und zum Spaß - hier ist, was ich angefangen habe, nicht die vollständigen Regeln zu lesen: S - Sehen Sie es bei IdeOne . Es wird entschlüsselt, auch wenn Zeichen aus einer Ziffer an eine beliebige Stelle in der Zeichenfolge verschlüsselt werden können.
Bearbeiten 2
Verkürzt nach Tipps von TheLethalCoder. Vielen Dank!
Bearbeiten 3
Und jetzt rasierte sich Titus noch ein paar Bytes. Vielen Dank!
quelle
public static
können. Sie können zu einer anonymen Methode wie konvertierens=>{<do stuff>return"";}
. Sie könnenvar
ein paar Mal verwenden, wenn Sie Variablen zusammen deklarieren, werden Bytes gespart, dint i=1,j;
. H. Das Erstellen eines Arrays aus einer Zeichenfolge und das Aufteilen darauf ist normalerweise kürzer (obwohl ich dies in diesem Fall nicht überprüft habe)"ONE|TWO".Split('|')
. Sie können<0
anstelle von==-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 Bytes3 Bytes gespart dank Neil .
Derzeit nicht ausgenutzt Nummern sind immer in aufsteigender Reihenfolge angeordnet
quelle
"axbxc".split`x`.join``
. Wie heißt das? Ich kann auf Google nichts finden.split
und keine Parens benötige.join
x=`foo${5+5}bar`
), sie sind markiert, wenn Sie eine Funktion aufrufen, die sie ohne Parens verwendet:foo`foo${5+5}bar`
das ist das Gleiche wiefoo(['foo','bar'], 10)
f(s.slice(y))
ist immer eine Zeichenfolge, daher brauchen Sie die''+
vorher nicht.Jelly , 38 Bytes
Probieren Sie es online!
Erläuterung
quelle
"EIGHTNINE"
zu geben :)3
mit ersetzen2.2
, um eine kleinere Obergrenze zu verwenden, mit der Sie problemlos 789 berechnen können, ohne das Arbeitsprinzip zu ändern.2
Wäre nett, würde aber bei bestimmten Eingaben mit vielen Sechsern kaum scheitern.Javascript (ES6), 221 Byte
Beispielcode-Snippet:
quelle
Netzhaut , 160 Bytes
Probieren Sie es online! Lose basierend auf @ TessellatingHecklers PowerShell-Antwort.
quelle
Netzhaut , 88 Bytes
Probieren Sie es online!
Erläuterung
quelle
PowerShell , 182 Byte
Probieren Sie es online!
Ungolfed aber kein funktionierender Code:
Beispiel:
(?<3>[THRE]{5})
Stimmt mit der Zeichenklasse übereinTHRE
, sodass sie in der angegebenen Reihenfolge übereinstimmen kann. Jedes dieser Zeichen muss fünfmal nebeneinander übereinstimmen. Die Erfassungsgruppe erhält den Namen '3', um Namen mit Zahlen zuzuordnen.Rudimentäre Komprimierung durch Austauschen des Wiederholungstextes
})|(?<
gegen az
.quelle
C ++,
296, 288 BytesKurzfassung:
Vollversion:
Versuchen Sie es ONLINE!
Edit:
1) 200-> 296 Bytes, um den Namespace und die Definition von N in die Zählung aufzunehmen, wie von orlp vorgeschlagen. 2) 296-> 288, um dank Zacharý ein Makro zu verwenden
quelle
N
undusing namespace std;
in Ihre Byteanzahl aufnehmen.Q
direkt danach ohne weitere Zusätze anrufen .Ruby,
138114110 BytesDie Byteanzahl umfasst 1 Byte für die
-p
Option.Was?
Dies:
ist ein Regex-Literal, das durch String-Interpolation Folgendes ergibt:
Wenn wir das zuordnen,
regex
ist der Rest des Codes einigermaßen leicht zu verstehen: Jede Übereinstimmung in der Eingabe wird durch die Nummer der Erfassungsgruppe ersetzt, die aus der magischen Variablen extrahiert wurde,$~
die die aktuellen Übereinstimmungsdaten enthält:Probieren Sie es online!
quelle
Java 8,
198256 Bytes+58 Bytes .. aufgrund von Regex der Vorgängerversion, die nicht richtig funktionierte (es passte auch zu "EEE"; "EEN"; etc.)
Erläuterung:
Probieren Sie es hier aus.
quelle
"ENOOWTEERHTRUOFEVIFXISNEVESTHGIEENIN"
:([ONE]{3}
ist, dass sie auchEEN
am Ende dieses Testfalls mit Teilen von ACHT und NEUN übereinstimmt. Und ich bezweifle, dass es eine gibt ein regulärer Ausdruck all diese übereinstimmen:ENO|EON|NEO|NOE|OEN|ONE
ohne auch passendEEE;EEN;EEO;...
für alle Zahlen , die kürzer als 40 Byte ist .. Vielleicht kann ich mit so etwas tunsubstring
jetzt und kehren sie die Zahlen überprüft, aber ich weiß nicht wirklich die Zeit haben , um es herauszufinden ..Java (OpenJDK 8) , 181 Byte
Probieren Sie es online!
Ich habe mir erlaubt, Kevin Cruyssens TIO-Vorlage wiederzuverwenden . Hoffe es macht dir nichts aus;)
quelle
s.substring
. Das Schlimmste ist, dass ichs.substring
in meiner aktuellen Antwort verwende, lol .. Ah gut, +1 von mir.05AB1E ,
3631 BytesProbieren Sie es online!
View it lief mit Debug: TIO With Debug
quelle
FURONESEV
gibtFUR1SEV
:(Perl 5 , 102 + 1 (-n) = 103 Bytes
Probieren Sie es online!
quelle
map{...}
oft ersetzt werdenmap...,
,length
undy///c
sind in der Regel austauschbar zu (nicht immer kleiner , wenn sie nicht arbeiten ,$_
obwohl!), Statt daswhile
,++$,x s/^$i//
kürzer ist , und wenn Sie ändern ,-n
um-p
Sie zu `$ \` stattdessen kann anhängen zu nennenprint
! Probieren Sie es online!Python 3 ,
238236 BytesProbieren Sie es online!
Brute-Force-Lösung, nutzt die Gleichmäßigkeit der Ziffern nicht aus.
Vielen Dank an @Mr. Xcoder zum Speichern von 2 Bytes!
quelle
def f(s):
in Ihrewhile len(s)>0
mitwhile len(s)
e
in den Funktionsheader für -1 Byte verschieben. Auchexec
und Listenverständnisse können Bytes beim Einrücken sparen.PHP, 141 Bytes
ältere Version, 151 Bytes :
Durchläuft die Ziffern von 1 bis 9, zählt die einzelnen Zeichen im Wort und subtrahiert die Anzahl der nicht eindeutigen Zeichen.
Obwohl unterwegs gedruckt wird, müssen die Ziffern gespeichert werden, damit der
9
Fall funktioniert.Laufen Sie als Pipe mit
-nR
oder probieren Sie es online aus .Es würden 4 weitere Bytes eingespart, um die Ziffernanzahl
$a[$i]
anstelle von$a[$i+48]
ASCII1
und7
(in Anführungszeichen) anstelle der Ziffernzeichen selbst zu speichern .Nervenzusammenbruch
ONE
ist nicht das einzige Wort mit einemO
, daher muss es die Zählungen fürW
(nur inTWO
) undU
(nur inFOUR
) usw. subtrahieren .NINE
ist etwas Besonderes, weil es keine Möglichkeit gibt, nur zu subtrahieren, wenn ich die Buchstaben verwendet habe (das würdeI-X-G-F+U
oder erfordernN-O-S+W+U+X
), also verwende ich stattdessen die Ziffernanzahl.PHP, 160 Bytes
setzt alle Großbuchstaben voraus; Zeichen können überall verwürfelt sein.
Laufen Sie als Pipe mit
-nR
oder probieren Sie es online aus .Erläuterung
Durchläuft die Ziffernwörter und zählt dabei die Vorkommen ihrer eindeutigen Zeichen in der Eingabe und verringert die Anzahl der anderen Zeichen. "Andere Zeichen" können alle anderen Zeichen im Wort bedeuten. aber nur unter Berücksichtigung derer, die später benötigt werden, werden 19 Bytes gespart.
Transformieren der
str_repeat
Schleife zu einer kombinierten Schleife 5 Bytes gespeichert.Durch die Verwendung variabler Variablen für die Stellenzahl wurden weitere 8 gespeichert.
Nervenzusammenbruch
quelle