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.


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

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]


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

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.


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

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!


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


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]

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"

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


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

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>


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

2

Excel, 28 bytes

Usando o enklactmétodo:

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

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!


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.





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.


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])

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

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 ...


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


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.



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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.