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 Marinaraproduza 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.
code-golf
string
kolmogorov-complexity
geokavel
fonte
fonte
a
's mais o número dee
' s em cada entrada é [5,4,3,2,1,3,6], respectivamente.sudo
.Respostas:
Python 2 ,
383028 bytesExperimente online!
Infelizmente ainda um byte a mais do que a melhor resposta do Python 2 até agora; embora não use aenklact
abordagem-.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**164
e78579**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**b
com 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]
fonte
-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.Python 2 , 29 bytes
Experimente online!
Explicação
A seqüência mágica,,
enklact
foi encontrada procurando a primeira coluna com letras únicas.A primeira coluna
SOTITBM
aparece, o que não é útil, pois contém duplicatas. O segundo e o terceiro também não funcionam porque sãowvutule
eeeranaa
respectivamente. A quarta coluna, no entanto, funciona, pois possui todas as letras exclusivas.fonte
Python , 26 bytes
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**n
para de forman
rá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 porn
bits - 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 correspondenten
que está no mesmo intervalo, mas raramente o mesmo número.Isso é meio que relacionado. Em vez de mudar de
2**n
paran
, no entanto, queremos mudar den
para 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 é
000
e 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 é
000xxxx001110101011xxxx100xxxx
onde 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.
fonte
Gelatina , 10 bytes
O que há com todo esse negócio de "enklact"?
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?
fonte
-7761/retinal
combo?⁽..
.)⁽..
é realmente [-31349,32250] - [- 99999] (também existem outros números um podem representar com três ou menos bytes como7!!
orȷ76
)C (gcc) ,
727156464139 bytesExperimente online!
fonte
i;char x[]="enklact";
é mais curto quei,x[]={101,110,107,108,97,99,116};
.char*x="enklact"
é ainda mais curto: Experimente online!i=0
.index
: Experimente online!MATL ,
1615 bytesExperimente online! Ou verifique todos os casos de teste .
Explicação
fonte
Perl 5 , 24 bytes
Código de 23 bytes + 1 para
-p
.-4 bytes graças a @nwellnhof !
Experimente online!
fonte
Eu pensei em postar algumas outras alternativas
Javascript 38 bytes
Explicação: Máscara de bits de rochas?
Javascript 27 bytes
fonte
a=
a=
peça é necessária? Veja a resposta de Shaggy .a=
.a=s=>{b=s.Length;return(271474896&7<<b)>>b}
Gelatina , 11 bytes
Experimente online!
Explicação:
fonte
enklactate
vez deenklact
para a minha string, nesse caso, ela a reduz para 11;)enk
é uma string elactate
é uma palavra. EDIT: confirmado,enklactate
não está no dicionário.Japonês , 12 bytes
Indexado a 0, recebe entrada em minúsculas.
Teste-o
Explicação
Entrada implícita de sequência minúscula
U
A sequência compactada
kotinsm
.Obtenha o primeiro índice (
b
) do caractere em index (g
) 26 (#
) emU
. (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.
Teste-o
fonte
en
foi? : Pen
é compactado para um não imprimível.bUg
no seu código.05AB1E , 11 bytes
Economizou 1 byte graças a Erik the Outgolfer e 1 byte graças a Magic Octopus Urn.
Experimente online!
fonte
"enklact"
->’enkl†¼’
’enkl†¼’
->.•ΛΓ2º•
JavaScript (ES6), 25 bytes
Indexado a 0.
Teste-o
fonte
f=
só iria fazê-lo 27.GolfScript , 12 bytes
Experimente online!
Mapeia as entradas (através da soma de seus pontos de código) para
0
para6
.Explicação
Encontrado com uma ferramenta de força bruta do fragmento GolfScript que escrevi há algum tempo ...
Aqui está como isso transforma cada uma das entradas no resultado desejado:
fonte
Excel, 28 bytes
Usando o
enklact
método:fonte
")
Perl 6 , 22 bytes
Experimente online!
fonte
tr/enklact/^6/.comb[3]
22 bytes, mas aparentemente o tio.run ainda não o possui.v2017.6
)CJam , 11 bytes
Experimente online!
Uma porta da minha resposta GolfScript . Custa 1 byte para ler a entrada explicitamente, mas economizamos dois ao somar os pontos de código.
fonte
Casca , 10 bytes
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
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.fonte
Pitão , 13 bytes
Verifique todos os casos de teste.
Alternativo:
3
pode ser substituído por qualquer um dos seguintes valores:[3, 4, 11, 13, 21, 24, 25, 26]
fonte
Pyke , 12 bytes
Experimente aqui!
fonte
Próton , 23 bytes
Experimente online!
: P
fonte
Perl 5 , 43 + 1 (
-p
) = 44 bytesExperimente online!
Requer que os três primeiros caracteres da entrada estejam em maiúsculas.
fonte
Java 8, 26 bytes
Crédito para @icrieverytim
Recebe entrada como um caractere []
fonte
s->"enklact".indexOf(s[3])
se especificar que recebe a entrada como uma matriz de caracteres.Haskell , 36 bytes
-9 bytes graças a H.PWiz.
Experimente online!
Solução alternativa, 45 bytes
Isso usa a
indexOf
função emData.List
comoelemIndex
.Experimente online!
fonte
break
. Obrigado!C ++,
119118777673 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
Jogando golfe
std::string
, isso era óbvio ... o que eu estava pensando ...fonte
std::find
em uma string literal (ou talvez astd::string
) parece ser o caminho óbvio a seguir. Basicamente, a mesma idéia queindex
oustrchr
que as respostas C estão usando, em uma estrutura de dados em que o 0-5 está implícito na posição.std::string("enklact").find(p[3])
funciona bem. Isso reduz três caracteres.C # (.NET Core) , 289 bytes
Executar online
fonte
Golfscript, 13 bytes
Experimente online!
Pega o quarto caractere (que, para cada um, será único) e o procura na string "
enklact
".Alternativamente:
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.fonte
Dyalog APL, 13 bytes
Experimente online!
fonte
K (oK) , 13 bytes
Solução:
Experimente online!
Exemplos:
Explicação:
Interpretado da direita para a esquerda, retire o quarto elemento da entrada e retorne o local do índice zero na lista "enklact":
fonte