Quand est-ce que je reçois mon sandwich?

37

entrez la description de l'image ici

Étant donné l'une des entrées suivantes:

Teriyaki au poulet et aux oignons doux
Poulet Rôti Au Four
Poitrine de dinde
BMT Italien
Thon
Jambon Forêt Noire
Marinara aux boulettes de viande
indiquez un nombre de 1 à 7 (ou 0 à 6) représentant le jour de la semaine où vous obtenez cet accord, en commençant par lundi comme le nombre le plus bas. Les entrées peuvent être toutes minuscules ou majuscules si vous préférez (par exemple, "italian bmt"). Pas d'internet autorisé.

geokavel
la source
8
Je ne vois pas vraiment comment cette complexité de Kolmogorov. Le texte est l'entrée ... les nombres sont la sortie.
geokavel
5
Le dimanche dit-il également "Meatball Marinara" ou "Meatball Marina Ra"?
Erik the Outgolfer
17
Je suis à peu près sûr que c'est supposé être Marinara mais le keming de l'image est plutôt affreux ...
totalement humain
6
Si cela est utile à quiconque: le nombre de a's et le nombre de e' dans chaque entrée est respectivement [5,4,3,2,1,3,6].
geokavel

Réponses:

85

Python 2 , 38 30 28 octets

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

Essayez-le en ligne!

Malheureusement, il reste encore un octet de plus que la meilleure réponse de Python 2 à ce jour; bien que ne pas utiliser l' enklactapproche.

Maintenant, un octet plus court que la réponse de i cri everytim !

Comment ça marche?

Après beaucoup de force brute, j'ai trouvé une expression qui donne un nombre qui a les bons chiffres.
J'ai remarqué que regarder un seul chiffre spécifique de la longueur de la chaîne donnée nécessitait 3 octets ( %10). J'ai donc écrit un autre programme Python ( lien Pastebin ) pour rechercher davantage les nombres qui mappent directement la longueur des chaînes en entrée au jour de la semaine.

Le nombre magique ressemble à ceci: 6793**164 = 28714733692312345620167113260575862840674216760386883406587492336415023761043044176257567032312859371641211117824224067391750766520256112063756278010050204239810862527958109285342869876264808102743173594017101607983288521836082497514383184553444755034407847810524083812459571382103831904835921560285915349760536969265992879312869538914200854305957428078269094250817029486005437991820466986793657301214564264748923199288698278615871481529585816783654841131577178922192383679718074693535597651237893794976519274268917335387876260270630339777501802739852278932279775510324916969726203688466311848240746465178859847331248655567344801(un nombre avec 629 chiffres décimaux impressionnant)

Et comme vous pouvez le constater, le nombre fournit le mappage nécessaire de [28, 20, 13, 11, 4, 16, 17] à [0, 1, 2, 3, 4, 5, 6] (les chaînes Python valent 0- indexé):

2871 4 733692 3 1 2 34 5 6 20 1 6711326 0 5758628406742167603868834... [4]^ [11]^ [13]^ [16]^ ^[17] ^[20] ^[28]

Mon programme a également trouvé d' autres expressions qui donnent des nombres avec la propriété nécessaire, mais ils prennent plus d' octets pour représenter (29 au lieu de 28): 19439**540, 34052**726, 39311**604, 44873**182, 67930**164et 78579**469. (Ce sont toutes les expressions trouvées par le programme lié; son exécution a pris plusieurs heures.)

Fonction alternative qui nécessite 28 octets: lambda S:`7954<<850`[len(S)]
Fonction alternative qui nécessite 29 octets: lambda S:`9699<<2291`[len(S)]
Fonction alternative qui nécessite 30 octets: lambda S:`853<<4390`[len(S)+9]
Fonction alternative qui nécessite 31 octets:lambda S:`1052<<3330`[len(S)+8]

Comment ça marche? Comment ai-je généré ce nombre? (Réponse sur 30 octets)

La réponse de 30 octets était lambda S:`3879**41`[len(S)%10].

En regardant la longueur de la chaîne d'entrée [28, 20, 13, 11, 4, 16, 17], j'ai remarqué que tous les derniers chiffres de la base dix diffèrent, ce qui donne la liste [8, 0, 3, 1, 4, 6, 7]. Donc, je n'avais besoin que d'une correspondance de cette liste avec la liste des sept jours de la semaine [0, 1, 2, 3, 4, 5, 6].

Ma première approche utilisait simplement une chaîne pour effectuer le mappage:, lambda S:"13*24*560"[len(S)%10]bien que la chaîne nécessite onze octets ( "13*24*560").
J'ai donc écrit un programme Python ( lien Pastebin ) pour tester les expressions arithmétiques aboutissant à un entier avec des chiffres identiques, dans l’espoir de jouer plus avant au programme. Ce que j’ai trouvé jusqu’à présent, c’est `3879**41`(seulement dix octets, la seule et donc la plus petite expression trouvée par mon programme).

Bien sûr, il existe de nombreuses expressions possibles que l’on peut essayer; Je viens d'avoir la chance qu'il y en ait un dans la forme a**bavec un résultat assez petit qui correspond à mes besoins.

Juste pour tous les curieux, 3879**41 = 1372495608710279938309112732193682350992788476725725221643007306215781514348937145528919415861895033279220952836384201346579163035594383625990271079 = 1.372... * 10**147.

Une autre fonction valide que j'ai trouvée lors de la recherche d'expressions alternatives nécessitant malheureusement 32 octets: lambda S:`7**416`[len(S)%10+290]

Jonathan Frech
la source
1
Comment avez-vous généré ce nombre? : o
totalement humain
10
@icrieverytim Force brute.
Jonathan Frech
-9114**28est un entier plus petit * qui fonctionne également (* en termes absolus et pas seulement parce qu’il est négatif - 111 chiffres au lieu de 629). N'économise pas sur les octets cependant.
Jonathan Allan
4
De temps en temps, je vérifie les questions de PCG dans HNQ et je suis généralement déçu de constater que les langues de golf sont les trois premières places. Aujourd'hui je n'ai pas été déçu. Merci!
Sidney
4
@icrieverytim ಠ_ಠ c'est exactement le même nombre mais divisé par deux avec un facteur de décalage d'un facteur de plus _ಠ: P
HyperNeutrino
49

Python 2 , 29 octets

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

Essayez-le en ligne!

Explication

La chaîne magique enklact, a été trouvée en recherchant la première colonne avec des lettres uniques.

La première colonne SOTITBMest inutile, car elle contient des doublons. Les deuxième et troisième ne fonctionnent pas non plus parce qu’ils le sont wvutuleet eeranaarespectivement. La quatrième colonne fonctionne cependant car elle contient toutes les lettres uniques.

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
totalement humain
la source
18

Python , 26 octets

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

Essayez-le en ligne!

Avec une dette de remerciement (pour mon deuxième essai consécutif de golf-code) à la réponse de Jonathan Frech - je n’aurais pas pensé à utiliser la longueur de la chaîne au lieu d’une lettre distinctive!

Ce code provient de mon expérience avec les séquences de Bruijn et la programmation pour les échecs.

Aux échecs, vous travaillez souvent avec plusieurs entiers de 64 bits, où chaque bit indique que le carré correspondant sur l’échiquier a une valeur vraie ou fausse, par exemple "il y a une pièce blanche ici" ou "ce carré contient un pion".

Il est donc utile de pouvoir convertir rapidement 2**nà nrapidement et à moindre coût. En C et C ++, le moyen le plus rapide consiste à multiplier par une séquence de De Bruijn à 64 bits - ce qui équivaut à un décalage de nbits - puis au décalage à droite de 58 (pour mettre les six premiers bits en dernier, assurez-vous que vous ' utilisez un unsigned int ou vous obtiendrez 1s la moitié du temps) et rechercherez ce nombre 0..63 dans un tableau qui vous donnera le correspondant nqui se trouve dans la même plage, mais rarement le même nombre.

C'est un peu lié. Au lieu de passer de 2**nà n, cependant, nous souhaitons passer d' nun autre nombre à 3 bits. Nous cachons donc nos nombres de 3 bits dans un nombre magique de 31 bits (un décalage de 28 bits nécessite les bits 28-30, avec une numérotation commençant à 0).

J'ai généré le nombre nécessaire simplement en voyant quelles valeurs devaient tomber où (en essayant 0..6 et 1..7 en tant qu'ensembles de sortie). Heureusement, les valeurs qui se chevauchent (14, 16 et 17) ont fonctionné! Et comme le premier tri-bit est 000et le suivant 001, nous n'avons pas besoin des 7 bits les plus à gauche, ce qui donne moins de chiffres -> moins d'octets de source.

Le nombre requis est 000xxxx001110101011xxxx100xxxx, où les x peuvent être 1 ou 0 et n'affectent pas le résultat de ces sous-marins particuliers - je les mets à 0 juste pour minimiser le nombre, mais changer l'un des 8 derniers x ne devrait pas affecter la longueur du code source. Si vous définissez tous les x sur 0 et que vous quittez le début, vous obtenez 1923136 en décimal (ou 1D5840 en hexadécimal, mais vous avez besoin du préfixe 0x - honte!) Les & 7 à la fin masquent simplement les 3 derniers bits, vous pouvez également utilisez% 8, mais vous auriez alors besoin de parenthèses en raison des règles de priorité des opérateurs de python.

tl; dr: 1923136 code chacune des combinaisons de trois bits de 0 à 6 exactement aux bons endroits pour que ces noms de sandwich tombent à la place, puis il suffit de prendre les trois derniers bits après un décalage à droite.

Michael Boger
la source
Assez similaire à mon approche de masque de bit, mais encore mieux.
Bruno Costa
12

Gelée , 10 octets

Qu'est-ce qui se passe avec toutes ces affaires "enklact"?

⁽ṃXị“Ð$¥»i

Un lien monadique prenant une liste de caractères et renvoyant le lundi = 1 jour de la semaine.

Essayez-le en ligne! ou voir la suite de tests

Comment?

⁽ṃ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
Jonathan Allan
la source
Comment avez-vous trouvé le -7761/retinalcombo?
Emigna
3
A écrit une boucle qui créait des "mots" et vérifiait s'ils existaient dans le dictionnaire. "rétinal" était le seul entre -32249 et 32250 (la gamme de ⁽...)
Jonathan Allan
... légère erreur - la plage de ⁽..est en fait [-31349,32250] - [- 99,999] (il y a aussi d'autres nombres que l'on peut représenter avec trois octets ou moins comme 7!!ou ȷ76)
Jonathan Allan Le
9

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

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

Essayez-le en ligne!

cleblanc
la source
i;char x[]="enklact";est plus court que i,x[]={101,110,107,108,97,99,116};.
Jonathan Frech
Était sur le point de poster cela à: char*x="enklact"c'est encore plus court: essayez-le en ligne!
scottinet
En outre, vous pouvez supprimer i=0.
Jonathan Frech
Même version plus courte en utilisant index: Essayez-le en ligne!
scottinet
@scottinet Nice! Je n'ai jamais utilisé index () auparavant. Merci
cleblanc
7

MATL , 16 15 octets

O5OHlO7KI6vjYm)

Essayez-le en ligne! Ou vérifiez tous les cas de test .

Explication

O5OHlO7KI6 % Push numbers 0, 5, 0, 2, 1, 0, 7, 4, 3, 6
v          % Concatenate all numbers into a column vector
j          % Push input as a string
Ym         % Mean (of ASCII codes)
)          % Index into the column vector (modular, 1-based, with implicit rounding)
           % Implicit display
Luis Mendo
la source
5

Je pensais que je posterais quelques autres alternatives

Javascript 38 octets

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

Explication: les roches bit-mask?

Javascript 27 octets

s=>"240350671"[s.length%10]
Bruno Costa
la source
la deuxième alternative est 29 octets depuis longtemps oubliéa=
Bruno Costa
Pourquoi la a=pièce est-elle nécessaire? Regardez la réponse de Shaggy .
geokavel
1
@BrunoCosta Sur ce site, nous ne vous demandons pas de nommer vos fonctions. Les anonymes fonctionnent, vous n’avez donc pas besoin de a=.
Rɪᴋᴇʀ
1
@BrunoCosta c'est cool, c'est vraiment à vous de décider. Vous pouvez également ne pas le compter dans le nombre d'octets d'en-tête et l'inclure dans l'extrait pour faciliter les tests.
Rɪᴋᴇʀ
1
@MichaelBoger Je ne pense pas que ce soit le cas, car le minimum de code nécessaire pour que cela fonctionne fonctionne, je pense que c'est un peu commea=s=>{b=s.Length;return(271474896&7<<b)>>b}
Bruno Costa
4

Gelée , 11 octets

4ị“-ƭɼoṚ0»i

Essayez-le en ligne!

Explication:

4ị“-ƭɼoṚ0»i
4ị          4th element of z
  “-ƭɼoṚ0»i First index in "enklactate"
Erik le golfeur
la source
2
@ Mr.Xcoder sauf si j'utilise enklactateplutôt que enklactpour ma chaîne, auquel cas il est ramené à 11;)
Erik the Outgolfer
5
Oh, pour l'amour du fudge, pourquoi enklactate dans le dictionnaire de Jelly?
totalement humain
3
@icrieverytim Ce n'est pas, enkc'est une chaîne et lactateun mot. EDIT: vient de confirmer, enklactaten'est pas dans le dictionnaire.
Erik the Outgolfer
1
@icrieverytim Je pense que c'est juste du lactate .
M. Xcoder
2
Aw maaan, je voulais trouver un moyen de me moquer du dictionnaire de Jelly ... Peut-être la prochaine fois. : P
totalement humain
3

Japt , 12 octets

0-indexé, prend les entrées en minuscules.

`kÇXsm`bUg#

Essaye-le


Explication

Entrée implicite de chaîne en minuscule U

`kÇXsm`

La chaîne compressée kotinsm.

bUg#

Récupère le premier index ( b) du caractère à index ( g) 26 ( #) dans U. (Oui, emballage d'index!)

Sortie implicite du résultat entier.


Alternative

Identique à ce qui précède (et à tous les autres!), En utilisant simplement les caractères de l'index 3, permettant ainsi la saisie de la casse du titre.

`klact`bUg3

Essaye-le

Hirsute
la source
Où est enpassé le tour? : P
totalement humain
1
@icrieverytim: c'est une chaîne compressée; enest compressé à un non imprimable.
Shaggy
7
Je pense que je vois un bUgdans votre code.
Shenles
3

05AB1E , 11 octets

Enregistré 1 octet grâce à Erik the Outgolfer et 1 octet à Magic Octopus Urn.

.•ΛΓ2º•I3èk

Essayez-le en ligne!

M. Xcoder
la source
"enklact"->’enkl†¼’
Erik the Outgolfer
’enkl†¼’->.•ΛΓ2º•
Urne Magic Octopus
@MagicOctopusUrn Oh merci
M. Xcoder
@ Mr.Xcoder c'est comme ça que j'ai eu ça.
Urne Magic Octopus
@MagicOctopusUrn conservera dans les archives, merci: p
M. Xcoder
3

JavaScript (ES6), 25 octets

0 indexé.

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

Essaye-le

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>

Hirsute
la source
1
C'est 25 octets !
geokavel
Merci, @geokavel. Je ne sais pas d'où j'ai obtenu ces 3 octets supplémentaires; même compter f=ne ferait que 27.
Shaggy
solution simple et efficace. +1 :)
Brian H.
@Shaggy Peut-être que votre troisième octet supplémentaire était un saut de ligne.
Michael Boger
3

GolfScript , 12 octets

{+}*93&(5?7%

Essayez-le en ligne!

Mappe les entrées (via la somme de leurs points de code) 0sur 6.

Explication

Trouvé avec un outil de force brute d'extrait de code GolfScript que j'ai écrit il y a quelque temps ...

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

Voici comment cela transforme chacune des entrées en résultat souhaité:

                                 {+}*   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
Martin Ender
la source
2

Excel, 28 octets

En utilisant la enklactméthode:

=FIND(MID(A1,4,1),"enklact")
Wernisch
la source
Vous pouvez supprimer 2 octets en le convertissant en Google Sheets et en lâchant")
Taylor Scott
2

Perl 6 , 22 octets

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

Essayez-le en ligne!

Massa
la source
perl 2017.07 accepte tr/enklact/^6/.comb[3]22 octets, mais tio.run ne l'a apparemment pas encore.
Massa
(tio.run court perl6 v2017.6)
Massa
1
Tant qu'il existe un interprète capable d'exécuter la version à 22 octets, sa validité est respectée.
Shaggy
2

CJam , 11 octets

l1b93&(5#7%

Essayez-le en ligne!

Un port de ma réponse GolfScript . Il faut un octet pour lire les entrées de manière explicite, mais nous en économisons deux lorsque nous additionnons les points de code.

Martin Ender
la source
2

Coque , 10 octets

%7^5←n93ṁc

Essayez-le en ligne!

Un autre port de ma réponse GolfScript . Je suis sûr que je finirai par trouver un langage qui puisse additionner les points de code pour un seul octet ...

Husk (mise à jour post-challenge), 9 octets

%7^5←n93Σ

Essayez-le en ligne!

Maintenant, le Σ fait des points de code de somme directement. Etant donné que cela a été ajouté suite à une demande après avoir répondu à ce défi, je ne vais pas l'utiliser comme score principal.

Martin Ender
la source
1

Pyth , 13 octets

x"enklact"@w3

Vérifiez tous les cas de test.

Alternative:

x."atÖÅû"@w3

3 peut être substitué par l'une des valeurs suivantes: [3, 4, 11, 13, 21, 24, 25, 26]

M. Xcoder
la source
1

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

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

Essayez-le en ligne!

Requiert que les trois premiers caractères d’entrée soient en majuscules.

Xcali
la source
Il doit être tout en majuscule, tout en minuscule ou régulier.
geokavel
Appelez ça tout en majuscule, alors. Tout ce qui dépasse les trois premiers caractères est ignoré.
Xcali
1

Java 8, 26 octets

Crédit à @icrieverytim

Prend une entrée sous forme de caractère []

s->"enklact".indexOf(s[3])
Roberto Graham
la source
Vous pouvez le faire s->"enklact".indexOf(s[3])si vous indiquez que vous prenez des entrées sous forme de tableau de caractères.
Shooqie
Est-ce OK? J'ai quelques réponses qui peuvent être raccourcies comme ça
Roberto Graham
1

Haskell , 36 octets

-9 octets grâce à H.PWiz.

f s=length$fst$span(/=s!!3)"enklact"

Essayez-le en ligne!

Solution alternative, 45 octets

Ceci utilise la indexOffonction en Data.Listtant que elemIndex.

import Data.List
(`elemIndex`"enklact").(!!3)

Essayez-le en ligne!

totalement humain
la source
1
37 octets
H.PWiz Le
@ H.PWiz Oh, bel abus d'abus break. Merci!
totalement humain
1
36
H.PWiz Le
@ H.PWiz Haha, comment cela m'a-t-il manqué? XD
totalement humain
1

C ++, 119 118 77 76 73 octets

-41 octets grâce à Peter Cordes
-1 octets grâce à Zacharý
-3 octets grâce à Michael Boger

À l'index des chaînes 3, le caractère de chaque sandwich est différent

#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);
}

Jouer au golf avec std::string, c'était évident ... ce à quoi je pensais ...

HatsuPointerKun
la source
1
std::finddans un littéral de chaîne (ou peut-être a std::string) semble être la solution évidente. Fondamentalement, la même idée que indexou strchrque les réponses C utilisent, dans une structure de données où le 0-5 est implicite à partir de la position.
Peter Cordes le
Vous pouvez supprimer la nouvelle ligne entre les lignes 2 et 3.
Zacharý
Vous n'avez pas besoin d'une variable pour stocker enklact. std::string("enklact").find(p[3])fonctionne bien. Cela fait baisser 3 caractères.
Michael Boger
Vous POUVEZ transmettre des littéraux de chaîne à votre fonction (g ++ ne génère qu'un avertissement) afin que le contenu de la mémoire ne soit pas nécessaire.
Michael Boger
0

C # (.NET Core) , 289 octets

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()));}}

Courez en ligne

ronflement
la source
0

Golfscript, 13 octets

Essayez-le en ligne!

'enklact'\3=?

Prend le 4ème caractère (qui, pour chacun, sera unique) et le recherchera dans la chaîne " enklact".

Alternativement:

'nklact'\3=?)

Cela tire parti du fait que la ?fonction de Golfscript renvoie -1 si l'élément recherché n'est pas trouvé (ce qui, pour lundi, ne le sera pas). Si cela était autorisé, la solution pourrait être réduite d'un octet.

Josiah Winslow
la source
0

K (oK) , 13 octets

Solution:

"enklact"?*3_

Essayez-le en ligne!

Exemples:

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

Explication:

Interprétée de droite à gauche, extrayez le 4ème élément de l'entrée et retournez l'emplacement d'index zéro dans la liste "enklact":

"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
streetster
la source