Bei einer der folgenden Eingaben:
Süßes Zwiebelhuhn Teriyaki Ofen gebratenes Huhn Truthahnbrust Italienische BMT Thunfisch Schwarzwälder Schinken Fleischbällchen MarinaraGeben Sie eine Zahl von 1-7 (oder 0-6) aus, die den Wochentag darstellt, an dem Sie den Deal erhalten. Beginnen Sie mit Montag als niedrigster Zahl. Die Eingabe kann wahlweise in Klein- oder Großbuchstaben erfolgen (z. B. "italienisches BMT"). Kein Internet erlaubt.
code-golf
string
kolmogorov-complexity
Geokavel
quelle
quelle
a
's plus die Anzahl vone
' s in jedem Eingang ist jeweils [5,4,3,2,1,3,6].sudo
.Antworten:
Python 2 ,
383028 BytesProbieren Sie es online!
Leider noch ein Byte länger als die bisher beste Python 2-Antwort; wenn auch nicht mit demenklact
-Ansatz.Jetzt ein Byte kürzer als die Antwort von i cri everytim !
Wie funktioniert es?
Nach viel roher Gewalt habe ich einen Ausdruck gefunden, der eine Zahl ergibt, die genau die richtigen Ziffern hat.
Ich bemerkte, dass das Betrachten nur einer bestimmten Ziffer der angegebenen Zeichenkettenlänge 3 Bytes (
%10
) erforderte . Deshalb habe ich ein anderes Python-Programm ( Pastebin-Link ) geschrieben, um weiter nach Zahlen zu suchen, die die Längen der Eingabezeichenfolgen direkt auf den Wochentag abbilden.Die magische Zahl sieht folgendermaßen aus:
6793**164 = 28714733692312345620167113260575862840674216760386883406587492336415023761043044176257567032312859371641211117824224067391750766520256112063756278010050204239810862527958109285342869876264808102743173594017101607983288521836082497514383184553444755034407847810524083812459571382103831904835921560285915349760536969265992879312869538914200854305957428078269094250817029486005437991820466986793657301214564264748923199288698278615871481529585816783654841131577178922192383679718074693535597651237893794976519274268917335387876260270630339777501802739852278932279775510324916969726203688466311848240746465178859847331248655567344801
(eine Zahl mit beeindruckenden 629 Dezimalstellen)Und wie Sie sehen können, liefert die Zahl die notwendige Zuordnung von [28, 20, 13, 11, 4, 16, 17] zu [0, 1, 2, 3, 4, 5, 6] (Python-Strings sind 0- indexiert):
2871 4 733692 3 1 2 34 5 6 20 1 6711326 0 5758628406742167603868834... [4]^ [11]^ [13]^ [16]^ ^[17] ^[20] ^[28]
Mein Programm auch andere Ausdrücke gefunden , die Zahlen mit der erforderlichen Eigenschaft ergeben, obwohl sie nehmen mehr Bytes zu repräsentieren (29 statt 28):
19439**540
,34052**726
,39311**604
,44873**182
,67930**164
und78579**469
. (Dies sind alle Ausdrücke, die vom verknüpften Programm gefunden wurden. Die Ausführung dauerte mehrere Stunden.)Alternative Funktion, die 28 Bytes benötigt:
lambda S:`7954<<850`[len(S)]
Alternative Funktion, die 29 Bytes benötigt:
lambda S:`9699<<2291`[len(S)]
Alternative Funktion, die 30 Bytes benötigt:
lambda S:`853<<4390`[len(S)+9]
Alternative Funktion, die 31 Bytes benötigt:
lambda S:`1052<<3330`[len(S)+8]
Wie funktioniert es? Wie habe ich diese Nummer generiert? (30-Byte-Antwort)
Die 30-Byte-Antwort lautete
lambda S:`3879**41`[len(S)%10]
.Als
[28, 20, 13, 11, 4, 16, 17]
ich die Länge der Eingabezeichenfolge betrachtete , bemerkte ich, dass sich alle letzten Ziffern in der Basis 10 unterscheiden, was zu der Liste führte[8, 0, 3, 1, 4, 6, 7]
. Ich brauchte also nur eine Zuordnung von dieser Liste zu der Liste aller sieben Tage der Woche[0, 1, 2, 3, 4, 5, 6]
.Mein erster Ansatz verwendete einfach eine Zeichenfolge, um das Mapping durchzuführen:
lambda S:"13*24*560"[len(S)%10]
obwohl die Zeichenfolge elf Bytes ("13*24*560"
) benötigte.Also schrieb ich ein Python-Programm ( Pastebin-Link ), um auf arithmetische Ausdrücke zu testen, die eine ganze Zahl mit übereinstimmenden Ziffern ergeben, in der Hoffnung, das Programm weiter zu verbessern. Was mir bisher eingefallen ist
`3879**41`
(nur zehn Bytes, der einzige und damit kleinste Ausdruck, den mein Programm findet).Natürlich gibt es viele verschiedene mögliche Ausdrücke, die man ausprobieren könnte; Ich hatte nur das Glück, dass es einen in der Form gab, dessen
a**b
Ergebnis einigermaßen klein war und meinen Anforderungen entsprach.Nur für Neugierige
3879**41 = 1372495608710279938309112732193682350992788476725725221643007306215781514348937145528919415861895033279220952836384201346579163035594383625990271079 = 1.372... * 10**147
.Eine weitere gültige Funktion, die ich bei der Suche nach alternativen Ausdrücken gefunden habe, für die leider 32 Bytes erforderlich sind:
lambda S:`7**416`[len(S)%10+290]
quelle
-9114**28
ist eine kleinere Ganzzahl *, die auch funktioniert (* in absoluten Zahlen, nicht nur, weil sie negativ ist - 111 statt 629 Stellen). Spart jedoch keine Bytes.Python 2 , 29 Bytes
Probieren Sie es online!
Erläuterung
Die magische Zeichenfolge
enklact
wurde gefunden, indem nach der ersten Spalte mit eindeutigen Buchstaben gesucht wurde.Die erste Spalte geht,
SOTITBM
was nicht sinnvoll ist, weil sie Duplikate enthält. Die zweiten und dritten tun auch nicht funktionieren , weil sie sindwvutule
undeeranaa
jeweils. Die vierte Spalte funktioniert jedoch, da sie alle eindeutigen Buchstaben enthält.quelle
Python , 26 Bytes
Probieren Sie es online!
Dankeschön (für meinen zweiten direkten Code-Golf-Versuch) an Jonathan Frechs Antwort - ich hätte nicht gedacht, die Stringlänge anstelle eines unterscheidenden Buchstabens zu verwenden!
Dieser Code stammt aus meiner Erfahrung mit De Bruijn Sequences und der Programmierung für Schach.
Beim Schachspiel arbeiten Sie häufig mit mehreren 64-Bit-Ganzzahlen, wobei jedes Bit darauf hinweist, dass das entsprechende Feld auf dem Schachbrett richtig oder falsch ist, z.
Es ist daher sinnvoll
2**n
,n
schnell und kostengünstig auf umrüsten zu können . In C und C ++ ist der schnellste Weg, dies zu tun, das Multiplizieren mit einer 64-Bit-De Bruijn-Sequenz - gleichbedeutend mit dem Verschieben umn
Bits - und dann die Rechtsverschiebung 58 (um die ersten sechs Bits zum Schluss zu setzen - stellen Sie sicher, dass Sie Verwenden Sie ein nicht vorzeichenbehaftetes int (andernfalls erhalten Sie die Hälfte der Zeit) und suchen Sie diese 0..63-Zahl in einer Tabelle, in der Sie die entsprechende Zahl finden,n
die sich im gleichen Bereich, aber selten in der gleichen Zahl befindet.Das ist irgendwie verwandt. Statt von der Änderung
2**n
zun
, jedoch wollen wir Wechsel vonn
zu einer anderen 3-Bit - Zahl. Also verstecken wir unsere 3-Bit-Zahlen in einer magischen 31-Bit-Zahl (eine 28-Bit-Verschiebung erfordert die Bits 28-30, wobei die Nummerierung bei 0 beginnt).Ich habe die benötigte Zahl generiert, indem ich nur gesehen habe, welche Werte wo fallen mussten (indem ich sowohl 0..6 als auch 1..7 als Ausgabesätze ausprobiert habe). Glücklicherweise klappen die überlappenden Werte (14, 16 und 17)! Und da das erste Tri-Bit
000
und das nächste Tri-Bit sind001
, brauchen wir nicht die 7 Bits ganz links, was zu weniger Ziffern -> weniger Bytes der Quelle führt.Die erforderliche Anzahl ist
000xxxx001110101011xxxx100xxxx
, wobei die x 1 oder 0 sein können und das Ergebnis für diese speziellen Subs nicht beeinflusst - ich setze sie auf 0, nur um die Anzahl zu minimieren, aber das Ändern der letzten 8 x sollte sich nicht auswirken die Länge des Quellcodes. Wenn Sie alle xs auf 0 setzen und den Start weglassen, erhalten Sie 1923136 als Dezimalzahl (oder 1D5840 als Hexadezimalzahl, aber dann brauchen Sie das 0x-Präfix - Schande!). Das & 7 am Ende maskiert nur die letzten 3 Bits, Sie könnten es auch verwende% 8, aber dann brauchst du Klammern, weil Pythons Operator Vorrangregeln haben.tl; dr: 1923136 codiert jede der Drei-Bit-Kombinationen von 0 bis 6 an genau den richtigen Stellen, an denen diese Sandwich-Namen zufällig vorkommen, und dann müssen die letzten drei Bits nach einer Rechtsverschiebung verwendet werden.
quelle
Gelee , 10 Bytes
Was ist mit all dem "enklact" Geschäft?
Ein monadischer Link, der eine Liste von Zeichen aufnimmt und den Montag = 1 Wochentag zurückgibt.
Probieren Sie es online! oder sehen Sie sich die Testsuite an
Wie?
quelle
-7761/retinal
Combo gefunden?⁽..
.)⁽..
ist tatsächlich [-31349,32250] - [- 99,999] (es gibt auch andere Zahlen, die man mit drei oder weniger Bytes wie7!!
oder darstellen kannȷ76
)C (gcc) ,
727156464139 BytesProbieren Sie es online!
quelle
i;char x[]="enklact";
ist kürzer alsi,x[]={101,110,107,108,97,99,116};
.char*x="enklact"
ist noch kürzer: Probieren Sie es online!i=0
.index
: Online ausprobieren!MATL ,
1615 BytesProbieren Sie es online! Oder überprüfen Sie alle Testfälle .
Erläuterung
quelle
Perl 5 , 24 Bytes
23 Byte Code + 1 für
-p
.-4 Bytes dank @nwellnhof !
Probieren Sie es online!
quelle
Ich dachte, ich würde ein paar andere Alternativen posten
Javascript 38 Bytes
Erklärung: Bitmaskenfelsen?
Javascript 27 Bytes
quelle
a=
a=
Teil benötigt? Schau dir Shaggys Antwort an .a=
.a=s=>{b=s.Length;return(271474896&7<<b)>>b}
Jelly , 11 Bytes
Probieren Sie es online!
Erläuterung:
quelle
enklactate
anstelle vonenklact
für meine Zeichenfolge, in diesem Fall bringt es auf 11;)enk
ist eine Zeichenfolge undlactate
ist ein Wort. BEARBEITEN: nur bestätigt,enklactate
nicht im Wörterbuch.Japt , 12 Bytes
0-indiziert, Eingabe in Kleinbuchstaben.
Probier es aus
Erläuterung
Implizite Eingabe von Kleinbuchstaben
U
Die komprimierte Zeichenfolge
kotinsm
.Holen Sie sich den ersten Index (
b
) des Zeichens bei Index (g
) 26 (#
) inU
. (Ja, Index Wrapping!)Implizite Ausgabe eines ganzzahligen Ergebnisses.
Alternative
Das Gleiche wie oben (und alle anderen!), Nur die Zeichen bei Index 3 verwenden, um die Eingabe von Groß- und Kleinschreibung zu ermöglichen.
Probier es aus
quelle
en
hin? : Pen
wird zu einem nicht druckbaren komprimiert.bUg
in deinem Code.05AB1E , 11 Bytes
1 Byte dank Erik the Outgolfer und 1 Byte dank Magic Octopus Urn gespeichert.
Probieren Sie es online!
quelle
"enklact"
->’enkl†¼’
’enkl†¼’
->.•ΛΓ2º•
JavaScript (ES6), 25 Byte
0-indiziert.
Probier es aus
quelle
f=
würde es nur 27 machen.GolfScript , 12 Bytes
Probieren Sie es online!
Ordnet die Eingaben (über die Summe ihrer Codepunkte)
0
zu6
.Erläuterung
Gefunden mit einem GolfScript-Snippet-Brute-Force-Tool, das ich vor einiger Zeit geschrieben habe ...
So transformieren Sie die einzelnen Eingaben in das gewünschte Ergebnis:
quelle
Excel, 28 Bytes
Mit der
enklact
Methode:quelle
")
Perl 6 , 22 Bytes
Probieren Sie es online!
quelle
tr/enklact/^6/.comb[3]
das wären 22 bytes, aber tio.run hat es anscheinend noch nicht.v2017.6
)CJam , 11 Bytes
Probieren Sie es online!
Ein Port meiner GolfScript-Antwort . Es kostet 1 Byte, die Eingabe explizit zu lesen, aber wir sparen zwei, wenn wir die Codepunkte summieren.
quelle
Husk , 10 Bytes
Probieren Sie es online!
Ein weiterer Port meiner GolfScript-Antwort . Ich bin mir sicher, dass ich irgendwann eine Sprache finden werde, die die Codepunkte für ein einzelnes Byte summieren kann ...
Schale (Update nach der Herausforderung), 9 Byte
Probieren Sie es online!
Nun
Σ
tut Summencodepunkte direkt. Da dies auf Anfrage hinzugefügt wurde, nachdem ich diese Herausforderung beantwortet habe, verwende ich es jedoch nicht als meine primäre Punktzahl.quelle
Pyth , 13 Bytes
Überprüfen Sie alle Testfälle.
Alternative:
3
kann durch einen der folgenden Werte ersetzt werden:[3, 4, 11, 13, 21, 24, 25, 26]
quelle
Pyke , 12 Bytes
Probieren Sie es hier aus!
quelle
Proton , 23 Bytes
Probieren Sie es online!
: P
quelle
Perl 5 , 43 + 1 (
-p
) = 44 BytesProbieren Sie es online!
Erfordert, dass die ersten drei Zeichen der Eingabe in Großbuchstaben geschrieben werden.
quelle
Java 8, 26 Bytes
Dank an @icrieverytim
Nimmt Eingaben als Zeichen []
quelle
s->"enklact".indexOf(s[3])
wenn Sie angeben, dass Sie Eingaben als Zeichen-Array annehmen.Haskell , 36 Bytes
-9 Bytes dank H.PWiz.
Probieren Sie es online!
Alternative Lösung, 45 Bytes
Dies nutzt die
indexOf
Funktion inData.List
aselemIndex
.Probieren Sie es online!
quelle
break
. Vielen Dank!C ++,
119118777673 Bytes-41 Bytes dank Peter Cordes
-1 Bytes dank Zacharý
-3 Bytes dank Michael Boger
Beim String-Index 3 ist das Zeichen für jedes Sandwich unterschiedlich
Golfen mit
std::string
, das war offensichtlich ... was dachte ich ...quelle
std::find
In einer Zeichenfolgestd::string
scheint ein Wort (oder vielleicht ein Wort ) der naheliegende Weg zu sein. Im Grunde genommen die gleiche Idee wieindex
oderstrchr
dass die C Antworten verwenden, in einer Datenstruktur , wo die 0-5 aus der Position implizit ist.std::string("enklact").find(p[3])
funktioniert gut. Das bringt es 3 Zeichen runter.C # (.NET Core) , 289 Byte
Online ausführen
quelle
Golfscript, 13 Bytes
Probieren Sie es online!
Nimmt das vierte Zeichen (das für jedes eindeutig ist) und schlägt es in der Zeichenfolge "
enklact
" nach.Alternative:
Dies nutzt die Tatsache aus, dass die
?
Funktion von Golfscript -1 zurückgibt, wenn das gesuchte Element nicht gefunden wird (was für Montag nicht der Fall ist). Wenn dies erlaubt wäre, könnte die Lösung um 1 Byte reduziert werden.quelle
Dyalog APL, 13 Bytes
Probieren Sie es online!
quelle
K (oK) , 13 Bytes
Lösung:
Probieren Sie es online!
Beispiele:
Erläuterung:
Von rechts nach links interpretiert, ziehen Sie das 4. Element aus der Eingabe heraus und geben Sie die Nullindexposition in der "enklact" -Liste zurück:
quelle