Wann bekomme ich mein Sandwich?


37

Bildbeschreibung hier eingeben

Bei einer der folgenden Eingaben:

Süßes Zwiebelhuhn Teriyaki
Ofen gebratenes Huhn
Truthahnbrust
Italienische BMT
Thunfisch
Schwarzwälder Schinken
Fleischbällchen Marinara
Geben 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.


8
Sehen Sie nicht wirklich, wie diese Komplexität Kolmogorov. Der Text ist die Eingabe ... Zahlen sind die Ausgabe.
Geokavel

5
Sagt der Sonntag auch "Meatball Marinara" oder "Meatball Marina Ra"?
Erik der Outgolfer

17
Ich bin mir ziemlich sicher, dass es Marinara sein soll, aber das Keming auf dem Bild ist ziemlich schrecklich ...
totalhuman

6
Wenn es für irgendjemanden nützlich ist: Die Anzahl von a's plus die Anzahl von e' s in jedem Eingang ist jeweils [5,4,3,2,1,3,6].
Geokavel

Antworten:


85

Python 2 , 38 30 28 Bytes

lambda S:`6793**164`[len(S)]

Probieren Sie es online!

Leider noch ein Byte länger als die bisher beste Python 2-Antwort; wenn auch nicht mit dem enklact-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**164und 78579**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**bErgebnis 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]


1
Wie haben Sie diese Nummer generiert? : o
totalhuman

10
@icrieverytim Brute Force.
Jonathan Frech

-9114**28ist eine kleinere Ganzzahl *, die auch funktioniert (* in absoluten Zahlen, nicht nur, weil sie negativ ist - 111 statt 629 Stellen). Spart jedoch keine Bytes.
Jonathan Allan

4
Hin und wieder überprüfe ich die PCG-Fragen in HNQ und bin in der Regel enttäuscht, dass Golfsprachen die ersten drei Plätze sind. Heute wurde ich nicht enttäuscht. Danke!
Sidney

4
@icrieverytim ಠ_ಠ das ist genau die gleiche Zahl, aber halbiert mit einem Verschiebungsfaktor von eins mehr ಠ_ಠ: P
HyperNeutrino

49

Python 2 , 29 Bytes

lambda s:'enklact'.find(s[3])

Probieren Sie es online!

Erläuterung

Die magische Zeichenfolge enklactwurde gefunden, indem nach der ersten Spalte mit eindeutigen Buchstaben gesucht wurde.

Die erste Spalte geht, SOTITBMwas nicht sinnvoll ist, weil sie Duplikate enthält. Die zweiten und dritten tun auch nicht funktionieren , weil sie sind wvutuleund eeranaajeweils. Die vierte Spalte funktioniert jedoch, da sie alle eindeutigen Buchstaben enthält.

lambda s:'enklact'.find(s[3])

lambda s:                      # declare a function that takes a single paramater s
                  .find(    )  # find the index of the first instance of...
                        s[3]   # the fourth (0-indexing) character of s...
         'enklact'             # in the magic string

18

Python , 26 Bytes

lambda S:1923136>>len(S)&7

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, nschnell 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 um nBits - 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, ndie sich im gleichen Bereich, aber selten in der gleichen Zahl befindet.

Das ist irgendwie verwandt. Statt von der Änderung 2**nzu n, jedoch wollen wir Wechsel von nzu 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 000und das nächste Tri-Bit sind 001, 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.


Ganz ähnlich wie bei meiner Bitmaske, aber noch besser.
Bruno Costa

12

Gelee , 10 Bytes

Was ist mit all dem "enklact" Geschäft?

⁽ṃXị“Ð$¥»i

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?

⁽ṃXị“Ð$¥»i - Link: list of characters, sandwichName  e.g. "Tuna"
⁽ṃX        - base 250 literal                             -7761
   ị       - index into sandwichName (1-indexed & modular) 'n'
    “Ð$¥»  - dictionary word                               "retinal"
         i - index of                                           5

Wie haben Sie die -7761/retinalCombo gefunden?
Emigna

3
Schrieb eine Schleife, in der "Wörter" erstellt und geprüft wurden, ob sie im Wörterbuch vorhanden waren. "Netzhaut" war die einzige zwischen -32249 und 32250 (der Bereich von ⁽...)
Jonathan Allan

... leichter Fehler - der Bereich von ⁽..ist tatsächlich [-31349,32250] - [- 99,999] (es gibt auch andere Zahlen, die man mit drei oder weniger Bytes wie 7!!oder darstellen kann ȷ76)
Jonathan Allan

9

C (gcc) , 72 71 56 46 41 39 Bytes

f(char*s){s=index(s="enklact",s[3])-s;}

Probieren Sie es online!


i;char x[]="enklact";ist kürzer als i,x[]={101,110,107,108,97,99,116};.
Jonathan Frech

War im Begriff, das zu posten: char*x="enklact"ist noch kürzer: Probieren Sie es online!
Scottinet

Sie können auch entfernen i=0.
Jonathan Frech

Noch kürzere Version mit index: Online ausprobieren!
Scottinet

@ Scottinet Schön! Ich habe noch nie index () verwendet. Vielen Dank
Cleblanc



5

Ich dachte, ich würde ein paar andere Alternativen posten

Javascript 38 Bytes

a=s=>(271474896&7<<s.Length)>>s.Length

Erklärung: Bitmaskenfelsen?

Javascript 27 Bytes

s=>"240350671"[s.length%10]

Die zweite Alternative ist 29 Bytes lang vergessena=
Bruno Costa

Warum wird das a=Teil benötigt? Schau dir Shaggys Antwort an .
Geokavel

1
@BrunoCosta Auf dieser Site müssen Sie Ihre Funktionen nicht benennen. Anonyme arbeiten, so dass Sie das nicht brauchen a=.
7.

1
@BrunoCosta das ist cool, es liegt wirklich an dir. Sie können es auch einfach nicht in der Header-Byteanzahl zählen und zum leichteren Testen in das Snippet aufnehmen.
8.

1
@MichaelBoger Leider glaube ich nicht, dass dies möglich ist, da die minimale Menge an Code, die dafür sorgt, dass dies funktioniert. Ich glaube, es ist etwas in der Art vona=s=>{b=s.Length;return(271474896&7<<b)>>b}
Bruno Costa

4

Jelly , 11 Bytes

4ị“-ƭɼoṚ0»i

Probieren Sie es online!

Erläuterung:

4ị“-ƭɼoṚ0»i
4ị          4th element of z
  “-ƭɼoṚ0»i First index in "enklactate"

2
@ Mr.Xcoder, es sei denn, ich verwende enklactateanstelle von enklactfür meine Zeichenfolge, in diesem Fall bringt es auf 11;)
Erik the Outgolfer

5
Oh, um Himmels willen, warum ist Enklactate in Jellys Wörterbuch?
Totalhuman

3
@icrieverytim Ist es nicht, enkist eine Zeichenfolge und lactateist ein Wort. BEARBEITEN: nur bestätigt, enklactatenicht im Wörterbuch.
Erik der Outgolfer

1
@icrieverytim Ich denke, es ist nur Laktat .
Mr. Xcoder

2
Oh maaan, ich wollte einen Weg finden, Jellys Wörterbuch zu verspotten ... Vielleicht beim nächsten Mal. : P
totalhuman

3

Japt , 12 Bytes

0-indiziert, Eingabe in Kleinbuchstaben.

`kÇXsm`bUg#

Probier es aus


Erläuterung

Implizite Eingabe von Kleinbuchstaben U

`kÇXsm`

Die komprimierte Zeichenfolge kotinsm.

bUg#

Holen Sie sich den ersten Index ( b) des Zeichens bei Index ( g) 26 ( #) in U. (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.

`klact`bUg3

Probier es aus


Wo ist das enhin? : P
totalhuman

1
@icrieverytim: das ist eine komprimierte Zeichenfolge; enwird zu einem nicht druckbaren komprimiert.
Shaggy

7
Ich glaube ich sehe ein bUgin deinem Code.
Shenles


3

JavaScript (ES6), 25 Byte

0-indiziert.

s=>"enklact".search(s[3])

Probier es aus

o.innerText=(f=
s=>"enklact".search(s[3])
)(i.value);oninput=_=>o.innerText=f(i.value)
<select id=i><option selected value="Sweet Onion Chicken Teriyaki">Sweet Onion Chicken Teriyaki</option><option value="Oven Roasted Chicken">Oven Roasted Chicken</option><option value="Turkey Breast">Turkey Breast</option><option value="Italian BMT">Italian BMT</option><option value="Tuna">Tuna</option><option value="Black Forest Ham">Black Forest Ham</option><option value="Meatball Marinara">Meatball Marinara</option></select><pre id=o>


1
Das sind 25 Bytes !
Geokavel

Danke, @geokavel. Ich weiß nicht, woher ich diese zusätzlichen 3 Bytes habe. selbst zählen f=würde es nur 27 machen.
Shaggy

einfache und effektive Lösung. +1 :)
Brian H.

@ Shaggy Vielleicht war Ihr drittes zusätzliches Byte eine nachgestellte Zeile.
Michael Boger

3

GolfScript , 12 Bytes

{+}*93&(5?7%

Probieren Sie es online!

Ordnet die Eingaben (über die Summe ihrer Codepunkte) 0zu 6.

Erläuterung

Gefunden mit einem GolfScript-Snippet-Brute-Force-Tool, das ich vor einiger Zeit geschrieben habe ...

{+}*  # Sum all code points.
93&   # ... AND 93.
(     # Decrement.
5?    # ... raised to the fifth power.
7%    # ... modulo 7.

So transformieren Sie die einzelnen Eingaben in das gewünschte Ergebnis:

                                 {+}*   93&     (            5?   7%
Sweet Onion Chicken Teriyaki     2658    64    63     992436543    0
Oven Roasted Chicken             1887    93    92    6590815232    1
Turkey Breast                    1285     5     4          1024    2
Italian BMT                       965    69    68    1453933568    3
Tuna                              408    24    23       6436343    4
Black Forest Ham                 1446     4     3           243    5
Meatball Marinara                1645    77    76    2535525376    6

2

Excel, 28 Bytes

Mit der enklactMethode:

=FIND(MID(A1,4,1),"enklact")

Sie können 2 Bytes löschen, indem Sie dies in Google Sheets konvertieren und die")
Taylor Scott

2

Perl 6 , 22 Bytes

tr/enklact/^6/.comb[3]

Probieren Sie es online!


perl 2017.07 akzeptiert tr/enklact/^6/.comb[3]das wären 22 bytes, aber tio.run hat es anscheinend noch nicht.
Massa

(tio.run rennt perl6 v2017.6)
Massa

1
Solange ein Interpreter vorhanden ist, der die 22-Byte-Version ausführen kann, ist er gültig.
Shaggy


2

Husk , 10 Bytes

%7^5←n93ṁc

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

%7^5←n93Σ

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.





1

Perl 5 , 43 + 1 ( -p) = 44 Bytes

for$i(S,O,TUR,I,TUN,B,M){$"++;$_=$"if/^$i/}

Probieren Sie es online!

Erfordert, dass die ersten drei Zeichen der Eingabe in Großbuchstaben geschrieben werden.


Es muss ganz in Großbuchstaben, ganz in Kleinbuchstaben oder regulär sein.
Geokavel

Nennen Sie es dann in Großbuchstaben. Alles, was über die ersten drei Zeichen hinausgeht, wird ignoriert.
Xcali

1

Java 8, 26 Bytes

Dank an @icrieverytim

Nimmt Eingaben als Zeichen []

s->"enklact".indexOf(s[3])

Sie können dies tun, s->"enklact".indexOf(s[3])wenn Sie angeben, dass Sie Eingaben als Zeichen-Array annehmen.
Shooqie

Ist das in Ordnung? Ich habe ein paar Antworten, die so gekürzt werden können
Roberto Graham


1

C ++, 119 118 77 76 73 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

#include<string>
int s(char*p){return std::string("enklact").find(p[3]);}
std::initializer_list<char*> t{
    "Sweet Onion Chicken Teriyaki",
    "Oven Roasted Chicken",
    "Turkey Breast",
    "Italian BMT",
    "Tuna",
    "Black Forest Ham",
    "Meatball Marinara"
};

for (auto& a : t) {
    std::cout << s(a);
}

Golfen mit std::string, das war offensichtlich ... was dachte ich ...


1
std::findIn einer Zeichenfolge std::stringscheint ein Wort (oder vielleicht ein Wort ) der naheliegende Weg zu sein. Im Grunde genommen die gleiche Idee wie indexoder strchrdass die C Antworten verwenden, in einer Datenstruktur , wo die 0-5 aus der Position implizit ist.
Peter Cordes

Sie können den Zeilenumbruch zwischen den Zeilen 2 und 3 entfernen.
Zacharý

Sie benötigen keine Variable, um enklact zu speichern. std::string("enklact").find(p[3])funktioniert gut. Das bringt es 3 Zeichen runter.
Michael Boger

Sie KÖNNEN Ihrer Funktion String-Literale übergeben (g ++ gibt nur eine Warnung aus), sodass das memcpy-Zeug nicht benötigt wird.
Michael Boger

0

C # (.NET Core) , 289 Byte

using System;class c{delegate int s(string r);static void Main(){s y=x=>{if(x[0]==83)return 1;if(x[0]==79)return 2;if (x[0]==84&x[2]=='r')return 3;if(x[0]==73)return 4;if(x[0]==84)return 5;if(x[0] ==66)return 6;if(x[0]==77)return 7;return 0;};Console.Write(y.Invoke(Console.ReadLine()));}}

Online ausführen


0

Golfscript, 13 Bytes

Probieren Sie es online!

'enklact'\3=?

Nimmt das vierte Zeichen (das für jedes eindeutig ist) und schlägt es in der Zeichenfolge " enklact" nach.

Alternative:

'nklact'\3=?)

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.



0

K (oK) , 13 Bytes

Lösung:

"enklact"?*3_

Probieren Sie es online!

Beispiele:

> "enklact"?*3_"Black Forest Ham"
5
> "enklact"?*3_"Turkey Breast"
2

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:

"enklact"?*3_  / the solution
           3_  / 3 drop, 3_"Turkey Breast" => "key Breast" 
          *    / first, *"key Breast" => "k"
         ?     / lookup right in left
"enklact"      / list to lookup element in
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.