É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 viandeindiquez 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é.
code-golf
string
kolmogorov-complexity
geokavel
la source
la source
a
's et le nombre dee
' dans chaque entrée est respectivement [5,4,3,2,1,3,6].sudo
.Réponses:
Python 2 ,
383028 octetsEssayez-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'enklact
approche.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**164
et78579**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**b
avec 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]
la source
-9114**28
est 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.Python 2 , 29 octets
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
SOTITBM
est inutile, car elle contient des doublons. Les deuxième et troisième ne fonctionnent pas non plus parce qu’ils le sontwvutule
eteeranaa
respectivement. La quatrième colonne fonctionne cependant car elle contient toutes les lettres uniques.la source
Python , 26 octets
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
àn
rapidement 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 den
bits - 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 correspondantn
qui 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'n
un 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
000
et le suivant001
, 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.
la source
Gelée , 10 octets
Qu'est-ce qui se passe avec toutes ces affaires "enklact"?
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?
la source
-7761/retinal
combo?⁽..
.)⁽..
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 comme7!!
ouȷ76
)C (gcc) ,
727156464139 octetsEssayez-le en ligne!
la source
i;char x[]="enklact";
est plus court quei,x[]={101,110,107,108,97,99,116};
.char*x="enklact"
c'est encore plus court: essayez-le en ligne!i=0
.index
: Essayez-le en ligne!MATL ,
1615 octetsEssayez-le en ligne! Ou vérifiez tous les cas de test .
Explication
la source
Perl 5 , 24 octets
Code de 23 octets + 1 pour
-p
.-4 octets grâce à @nwellnhof !
Essayez-le en ligne!
la source
Je pensais que je posterais quelques autres alternatives
Javascript 38 octets
Explication: les roches bit-mask?
Javascript 27 octets
la source
a=
a=
pièce est-elle nécessaire? Regardez la réponse de Shaggy .a=
.a=s=>{b=s.Length;return(271474896&7<<b)>>b}
Gelée , 11 octets
Essayez-le en ligne!
Explication:
la source
enklactate
plutôt queenklact
pour ma chaîne, auquel cas il est ramené à 11;)enk
c'est une chaîne etlactate
un mot. EDIT: vient de confirmer,enklactate
n'est pas dans le dictionnaire.Japt , 12 octets
0-indexé, prend les entrées en minuscules.
Essaye-le
Explication
Entrée implicite de chaîne en minuscule
U
La chaîne compressée
kotinsm
.Récupère le premier index (
b
) du caractère à index (g
) 26 (#
) dansU
. (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.
Essaye-le
la source
en
passé le tour? : Pen
est compressé à un non imprimable.bUg
dans votre code.05AB1E , 11 octets
Enregistré 1 octet grâce à Erik the Outgolfer et 1 octet à Magic Octopus Urn.
Essayez-le en ligne!
la source
"enklact"
->’enkl†¼’
’enkl†¼’
->.•ΛΓ2º•
JavaScript (ES6), 25 octets
0 indexé.
Essaye-le
la source
f=
ne ferait que 27.GolfScript , 12 octets
Essayez-le en ligne!
Mappe les entrées (via la somme de leurs points de code)
0
sur6
.Explication
Trouvé avec un outil de force brute d'extrait de code GolfScript que j'ai écrit il y a quelque temps ...
Voici comment cela transforme chacune des entrées en résultat souhaité:
la source
Excel, 28 octets
En utilisant la
enklact
méthode:la source
")
Perl 6 , 22 octets
Essayez-le en ligne!
la source
tr/enklact/^6/.comb[3]
22 octets, mais tio.run ne l'a apparemment pas encore.v2017.6
)CJam , 11 octets
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.
la source
Coque , 10 octets
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
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.la source
Pyth , 13 octets
Vérifiez tous les cas de test.
Alternative:
3
peut être substitué par l'une des valeurs suivantes:[3, 4, 11, 13, 21, 24, 25, 26]
la source
Pyke , 12 octets
Essayez-le ici!
la source
Proton , 23 octets
Essayez-le en ligne!
: P
la source
Perl 5 , 43 + 1 (
-p
) = 44 octetsEssayez-le en ligne!
Requiert que les trois premiers caractères d’entrée soient en majuscules.
la source
Java 8, 26 octets
Crédit à @icrieverytim
Prend une entrée sous forme de caractère []
la source
s->"enklact".indexOf(s[3])
si vous indiquez que vous prenez des entrées sous forme de tableau de caractères.Haskell , 36 octets
-9 octets grâce à H.PWiz.
Essayez-le en ligne!
Solution alternative, 45 octets
Ceci utilise la
indexOf
fonction enData.List
tant queelemIndex
.Essayez-le en ligne!
la source
break
. Merci!C ++,
119118777673 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
Jouer au golf avec
std::string
, c'était évident ... ce à quoi je pensais ...la source
std::find
dans un littéral de chaîne (ou peut-être astd::string
) semble être la solution évidente. Fondamentalement, la même idée queindex
oustrchr
que les réponses C utilisent, dans une structure de données où le 0-5 est implicite à partir de la position.std::string("enklact").find(p[3])
fonctionne bien. Cela fait baisser 3 caractères.C # (.NET Core) , 289 octets
Courez en ligne
la source
Golfscript, 13 octets
Essayez-le en ligne!
Prend le 4ème caractère (qui, pour chacun, sera unique) et le recherchera dans la chaîne "
enklact
".Alternativement:
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.la source
Dyalog APL, 13 octets
Essayez-le en ligne!
la source
K (oK) , 13 octets
Solution:
Essayez-le en ligne!
Exemples:
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":
la source