Quando recebo meu sanduíche?

37

insira a descrição da imagem aqui

Dada uma das seguintes entradas:

Frango com cebola doce Teriyaki
Frango Assado no Forno
Peito de peru
BMT italiano
Atum
Presunto da Floresta Negra
Almôndega Marinara
produza um número de 1 a 7 (ou 0 a 6), representando o dia da semana em que você recebe a transação, começando com segunda-feira como o número mais baixo. As entradas podem ser todas minúsculas ou maiúsculas, se preferir (por exemplo, "bmt italiano"). Internet não permitida.

geokavel
fonte
8
Realmente não vejo como essa complexidade de Kolmogorov. O texto é a entrada ... os números são a saída.
geokavel
5
Também o domingo diz "Almôndega Marinara" ou "Almôndega Marina Ra"?
Erik the Outgolfer
17
Eu tenho certeza que é suposto ser Marinara mas o keming na imagem é terrível ...
totallyhuman
6
Se for útil a alguém: o número de a's mais o número de e' s em cada entrada é [5,4,3,2,1,3,6], respectivamente.
geokavel
22
Quando você usa sudo.
Jpmc26 5/09

Respostas:

85

Python 2 , 38 30 28 bytes

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

Experimente online!

Infelizmente ainda um byte a mais do que a melhor resposta do Python 2 até agora; embora não use a enklactabordagem-.

Agora, um byte menor que a resposta de cri everytim !

Como funciona?

Depois de muita força bruta, encontrei uma expressão que resulta em um número com os dígitos certos.
Percebi que olhar apenas um dígito específico do comprimento da string requeria 3 bytes ( %10). Então, eu escrevi outro programa Python ( link Pastebin ) para procurar mais números que mapeiam diretamente os comprimentos das strings de entrada para o dia da semana.

O número mágico é assim: 6793**164 = 28714733692312345620167113260575862840674216760386883406587492336415023761043044176257567032312859371641211117824224067391750766520256112063756278010050204239810862527958109285342869876264808102743173594017101607983288521836082497514383184553444755034407847810524083812459571382103831904835921560285915349760536969265992879312869538914200854305957428078269094250817029486005437991820466986793657301214564264748923199288698278615871481529585816783654841131577178922192383679718074693535597651237893794976519274268917335387876260270630339777501802739852278932279775510324916969726203688466311848240746465178859847331248655567344801(um número com impressionantes 629 dígitos decimais)

E como você pode ver, o número fornece o mapeamento necessário de [28, 20, 13, 11, 4, 16, 17] a [0, 1, 2, 3, 4, 5, 6] (as seqüências de caracteres Python são 0- indexados):

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

Meu programa também encontrou outras expressões que produzem números com a propriedade necessária, embora eles levam mais bytes para representar (29 em vez de 28): 19439**540, 34052**726, 39311**604, 44873**182, 67930**164e 78579**469. (Essas são todas as expressões encontradas pelo programa vinculado; sua execução levou várias horas.)

Função alternativa que requer 28 bytes: lambda S:`7954<<850`[len(S)]
Função alternativa que requer 29 bytes: lambda S:`9699<<2291`[len(S)]
Função alternativa que requer 30 bytes: lambda S:`853<<4390`[len(S)+9]
Função alternativa que requer 31 bytes:lambda S:`1052<<3330`[len(S)+8]

Como funciona? Como eu gerei esse número? (Resposta de 30 bytes)

A resposta de 30 bytes foi lambda S:`3879**41`[len(S)%10].

Observando os comprimentos da string de entrada [28, 20, 13, 11, 4, 16, 17], notei que todos os últimos dígitos da base dez diferem, resultando na lista [8, 0, 3, 1, 4, 6, 7]. Então, eu só precisava de um mapeamento dessa lista para a lista de todos os sete dias da semana [0, 1, 2, 3, 4, 5, 6].

Minha primeira abordagem simplesmente usou uma string para realizar o mapeamento:, lambda S:"13*24*560"[len(S)%10]embora a string exigisse onze bytes ( "13*24*560").
Então, escrevi um programa Python ( link Pastebin ) para testar expressões aritméticas que resultam em um número inteiro com dígitos correspondentes, na esperança de aprimorar ainda mais o programa. O que eu criei até agora é `3879**41`(apenas dez bytes, a única e, portanto, menor expressão que meu programa encontra).

Obviamente, existem muitas expressões possíveis diferentes que alguém poderia tentar; Eu apenas tive sorte que havia um na forma a**bcom um resultado razoavelmente pequeno que se encaixava na minha necessidade.

Apenas para qualquer pessoa curiosa 3879**41 = 1372495608710279938309112732193682350992788476725725221643007306215781514348937145528919415861895033279220952836384201346579163035594383625990271079 = 1.372... * 10**147.

Outra função válida que encontrei ao procurar expressões alternativas que infelizmente exigem 32 bytes: lambda S:`7**416`[len(S)%10+290]

Jonathan Frech
fonte
11
Como você gerou esse número? : o
totallyhuman
10
@icrieverytim Brute force.
Jonathan Frech 5/17
-9114**28é um número inteiro menor * que também funciona (* em termos absolutos, não apenas porque é negativo - 111 dígitos em vez de 629). Porém, não economiza em bytes.
Jonathan Allan
4
De vez em quando eu verifico as perguntas do PCG no HNQ e geralmente fico decepcionado ao descobrir que os idiomas do golfe são os três principais pontos. Hoje não fiquei desapontado. Obrigado!
Sidney
4
@icrieverytim ಠ_ಠ isso é apenas o mesmo número, mas pela metade com um factor de desvio de mais um ಠ_ಠ: P
HyperNeutrino
49

Python 2 , 29 bytes

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

Experimente online!

Explicação

A seqüência mágica,, enklactfoi encontrada procurando a primeira coluna com letras únicas.

A primeira coluna SOTITBMaparece, o que não é útil, pois contém duplicatas. O segundo e o terceiro também não funcionam porque são wvutulee eeranaarespectivamente. A quarta coluna, no entanto, funciona, pois possui todas as letras exclusivas.

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
totalmente humano
fonte
18

Python , 26 bytes

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

Experimente online!

Com uma dívida de agradecimento (pela minha segunda tentativa direta de golfe com código) pela resposta de Jonathan Frech - eu não teria pensado em usar o comprimento da string em vez de uma letra distinta!

Esse código deriva da minha experiência com De Bruijn Sequences e da programação para o xadrez.

No xadrez, você costuma trabalhar com vários números inteiros de 64 bits, onde cada bit indica que há algo verdadeiro ou falso no quadrado correspondente no tabuleiro de xadrez, como "há uma peça branca aqui" ou "este quadrado contém um peão".

Portanto, é útil poder converter rapidamente 2**npara de forma nrápida e barata. Em C e C ++, a maneira mais rápida de fazer isso é multiplicar por uma sequência De Bruijn de 64 bits - equivalente a deslocamento por nbits - e depois deslocar para a direita 58 (para colocar os primeiros seis bits por último - verifique se você ' re usando um int não assinado ou você receberá 1s na metade do tempo) e procure esse número 0..63 em uma tabela que fornece o correspondente nque está no mesmo intervalo, mas raramente o mesmo número.

Isso é meio que relacionado. Em vez de mudar de 2**npara n, no entanto, queremos mudar de npara outro número de 3 bits. Portanto, ocultamos nossos números de 3 bits em um número mágico de 31 bits (uma mudança de 28 bits requer os bits 28 a 30, com a numeração começando em 0.)

Gerei o número necessário apenas vendo quais valores tinham que cair onde (tentando 0..6 e 1..7 conforme a saída é definida). Felizmente, os valores sobrepostos (14, 16 e 17) acontecem! E como o primeiro tri-bit é 000e o próximo é 001, não precisamos dos 7 bits mais à esquerda, resultando em menos dígitos -> menos bytes de origem.

O número necessário é 000xxxx001110101011xxxx100xxxxonde os x podem ser 1 ou 0 e não afeta o resultado para esses subs específicos - eu os defino como 0 apenas para minimizar o número, mas alterar qualquer um dos últimos 8 x não deve afetar o comprimento do código fonte. Definir todos os xs como 0 e deixar de iniciar fornece 1923136 em decimal (ou 1D5840 em hexadecimal, mas você precisa do prefixo 0x - vergonha!) O & 7 no final mascara os últimos 3 bits, você também pode use% 8, mas você precisará de parênteses devido às regras de precedência do operador do python.

tl; dr: 1923136 codifica cada uma das combinações de três bits de 0 a 6, exatamente nos pontos certos em que esses nomes de sanduíches se encaixam e, em seguida, é uma questão de pegar os últimos três bits após uma mudança à direita.

Michael Boger
fonte
Muito semelhante à minha abordagem de máscara de bits, mas ainda melhor.
Bruno Costa
12

Gelatina , 10 bytes

O que há com todo esse negócio de "enklact"?

⁽ṃXị“Ð$¥»i

Um link monádico que pega uma lista de caracteres e retorna segunda-feira = 1 dia da semana.

Experimente online! ou veja a suíte de testes

Quão?

⁽ṃ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
fonte
Como você encontrou o -7761/retinalcombo?
Emigna
3
Escreveu um loop que passou pela criação de "palavras" e ver se elas existiam no dicionário. "retina" era o único entre -32249 e 32250 (o intervalo de ⁽...)
Jonathan Allan
... ligeiro erro - a gama de ⁽..é realmente [-31349,32250] - [- 99999] (também existem outros números um podem representar com três ou menos bytes como 7!!or ȷ76)
Jonathan Allan
9

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

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

Experimente online!

cleblanc
fonte
i;char x[]="enklact";é mais curto que i,x[]={101,110,107,108,97,99,116};.
Jonathan Frech 5/09
Estava prestes a publicar isso para: char*x="enklact"é ainda mais curto: Experimente online!
scottinet
Além disso, você pode remover i=0.
Jonathan Frech 5/09
Versão ainda mais curta usando index: Experimente online!
scottinet
@scottinet Nice! Eu nunca usei index () antes. Obrigado
cleblanc 5/17
7

MATL , 16 15 bytes

O5OHlO7KI6vjYm)

Experimente online! Ou verifique todos os casos de teste .

Explicação

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
fonte
5

Eu pensei em postar algumas outras alternativas

Javascript 38 bytes

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

Explicação: Máscara de bits de rochas?

Javascript 27 bytes

s=>"240350671"[s.length%10]
Bruno Costa
fonte
2ª alternativa é 29 bytes de comprimento esqueceua=
de Bruno Costa
Por que a a=peça é necessária? Veja a resposta de Shaggy .
geokavel
11
@BrunoCosta Neste site, não exigimos que você nomeie suas funções. Os anônimos funcionam, então você não precisa do a=.
Rɪᴋᴇʀ
11
@BrunoCosta isso é legal, é realmente com você. Você também não pode contá-lo na contagem de bytes do cabeçalho e incluí-lo no snippet para facilitar o teste.
Rɪᴋᴇʀ
11
@MichaelBoger Unfofrtantly Eu não acho que ele pode, porque a quantidade mínima de código para fazer esse trabalho eu acredito que é algo ao longo das linhas dea=s=>{b=s.Length;return(271474896&7<<b)>>b}
de Bruno Costa
4

Gelatina , 11 bytes

4ị“-ƭɼoṚ0»i

Experimente online!

Explicação:

4ị“-ƭɼoṚ0»i
4ị          4th element of z
  “-ƭɼoṚ0»i First index in "enklactate"
Erik, o Outgolfer
fonte
2
@ Mr.Xcoder, a menos que eu use em enklactatevez de enklactpara a minha string, nesse caso, ela a reduz para 11;)
Erik the Outgolfer
5
Ah, pelo amor de Deus , por que o enklactate está no dicionário de Jelly?
totallyhuman
3
@icrieverytim Não é, enké uma string e lactateé uma palavra. EDIT: confirmado, enklactatenão está no dicionário.
Erik the Outgolfer
11
@icrieverytim Eu acho que é apenas lactato .
Sr. Xcoder 5/09
2
Ah maaan, eu queria encontrar uma maneira de zombar do dicionário de Jelly ... Talvez da próxima vez. : P
totallyhuman
3

Japonês , 12 bytes

Indexado a 0, recebe entrada em minúsculas.

`kÇXsm`bUg#

Teste-o


Explicação

Entrada implícita de sequência minúscula U

`kÇXsm`

A sequência compactada kotinsm.

bUg#

Obtenha o primeiro índice ( b) do caractere em index ( g) 26 ( #) em U. (Yay, quebra de índice!)

Saída implícita do resultado inteiro.


Alternativo

O mesmo que o anterior (e todos os outros!), Apenas usando os caracteres no índice 3, permitindo a entrada de maiúsculas e minúsculas.

`klact`bUg3

Teste-o

Shaggy
fonte
Para onde enfoi? : P
totallyhuman
11
@icrieverytim: é uma string compactada; ené compactado para um não imprimível.
Shaggy
7
Eu acho que vejo um bUgno seu código.
shenles
3

05AB1E , 11 bytes

Economizou 1 byte graças a Erik the Outgolfer e 1 byte graças a Magic Octopus Urn.

.•ΛΓ2º•I3èk

Experimente online!

Mr. Xcoder
fonte
"enklact"->’enkl†¼’
Erik the Outgolfer
’enkl†¼’->.•ΛΓ2º•
Magic Octopus Urn
@MagicOctopusUrn Oh thanks
Mr. Xcoder
@ Mr.Xcoder é assim que eu consegui isso.
Magic Octopus Urn
@MagicOctopusUrn Manterá o arquivo, obrigado: p
Mr. Xcoder 6/17
3

JavaScript (ES6), 25 bytes

Indexado a 0.

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

Teste-o

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>

Shaggy
fonte
11
São 25 bytes !
geokavel
Obrigado, @geokavel. Não sei de onde recebi esses 3 bytes extras; mesmo contando f=só iria fazê-lo 27.
Shaggy
solução simples e eficaz. +1 :)
Brian H.
@ Shaggy Talvez seu terceiro byte extra fosse uma nova linha à direita.
precisa
3

GolfScript , 12 bytes

{+}*93&(5?7%

Experimente online!

Mapeia as entradas (através da soma de seus pontos de código) para 0para 6.

Explicação

Encontrado com uma ferramenta de força bruta do fragmento GolfScript que escrevi há algum tempo ...

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

Aqui está como isso transforma cada uma das entradas no resultado desejado:

                                 {+}*   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
fonte
2

Excel, 28 bytes

Usando o enklactmétodo:

=FIND(MID(A1,4,1),"enklact")
Wernisch
fonte
Você pode soltar 2 bytes convertendo-o no Google Sheets e soltando o")
Taylor Scott
2

Perl 6 , 22 bytes

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

Experimente online!

Massa
fonte
O perl 2017.07 aceita os tr/enklact/^6/.comb[3]22 bytes, mas aparentemente o tio.run ainda não o possui.
Massa
(tio.run executa perl6 v2017.6)
Massa
11
Enquanto existir um intérprete que possa executar a versão de 22 bytes, é válido.
Shaggy
2

Casca , 10 bytes

%7^5←n93ṁc

Experimente online!

Outra porta da minha resposta GolfScript . Tenho certeza de que, eventualmente, encontrarei um idioma que pode somar os pontos de código para um único byte ...

Husk (atualização pós-desafio), 9 bytes

%7^5←n93Σ

Experimente online!

Agora, Σ faz pontos de código soma diretamente. Como isso foi adicionado a uma solicitação depois que eu respondi a esse desafio, não vou usá-lo como minha pontuação principal.

Martin Ender
fonte
1

Pitão , 13 bytes

x"enklact"@w3

Verifique todos os casos de teste.

Alternativo:

x."atÖÅû"@w3

3 pode ser substituído por qualquer um dos seguintes valores: [3, 4, 11, 13, 21, 24, 25, 26]

Mr. Xcoder
fonte
1

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

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

Experimente online!

Requer que os três primeiros caracteres da entrada estejam em maiúsculas.

Xcali
fonte
Tem que ser todas maiúscula, minúscula ou regular.
geokavel
Chame tudo de maiúsculo, então. Qualquer coisa além dos três primeiros caracteres é ignorada.
Xcali 5/09
1

Java 8, 26 bytes

Crédito para @icrieverytim

Recebe entrada como um caractere []

s->"enklact".indexOf(s[3])
Roberto Graham
fonte
Você pode fazer isso s->"enklact".indexOf(s[3])se especificar que recebe a entrada como uma matriz de caracteres.
Shooqie
Tudo bem? Eu tenho algumas respostas que podem ser encurtadas assim
Roberto Graham
1

Haskell , 36 bytes

-9 bytes graças a H.PWiz.

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

Experimente online!

Solução alternativa, 45 bytes

Isso usa a indexOffunção em Data.Listcomo elemIndex.

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

Experimente online!

totalmente humano
fonte
11
37 bytes
H.PWiz 28/10
@ H.PWiz Oh, puro abuso de break. Obrigado!
totallyhuman
11
36
H.PWiz 28/10
@ H.PWiz Haha, como eu senti falta disso. XD
totallyhuman
1

C ++, 119 118 77 76 73 bytes

-41 bytes graças a Peter Cordes
-1 byte graças a Zacharý
-3 bytes graças a Michael Boger

No índice 3 da string, o caractere para cada sanduíche é diferente

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

Jogando golfe std::string, isso era óbvio ... o que eu estava pensando ...

HatsuPointerKun
fonte
11
std::findem uma string literal (ou talvez a std::string) parece ser o caminho óbvio a seguir. Basicamente, a mesma idéia que indexou strchrque as respostas C estão usando, em uma estrutura de dados em que o 0-5 está implícito na posição.
Peter Cordes
Você pode remover a nova linha inbetween linhas 2 e 3.
Zachary
Você não precisa de uma variável para armazenar o enklact. std::string("enklact").find(p[3])funciona bem. Isso reduz três caracteres.
Michael Boger
Você PODE passar literais de seqüência de caracteres para sua função (o g ++ gera apenas um aviso), para que o material não seja necessário.
Michael Boger
0

C # (.NET Core) , 289 bytes

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

Executar online

snorepion
fonte
0

Golfscript, 13 bytes

Experimente online!

'enklact'\3=?

Pega o quarto caractere (que, para cada um, será único) e o procura na string " enklact".

Alternativamente:

'nklact'\3=?)

Isso tira proveito do fato de que a ?função Golfscript retorna -1 se o elemento pesquisado não for encontrado (o que, na segunda-feira, não será). Se isso fosse permitido, a solução poderia ser reduzida em 1 byte.

Josiah Winslow
fonte
0

K (oK) , 13 bytes

Solução:

"enklact"?*3_

Experimente online!

Exemplos:

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

Explicação:

Interpretado da direita para a esquerda, retire o quarto elemento da entrada e retorne o local do índice zero na lista "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
rua
fonte