De acordo com a RollingStone , abaixo estão os 26 maiores cantores de todos os tempos:
Aretha Franklin Al Green
Ray Charles Robert Plant
Elvis Presley Mick Jagger
Sam Cooke Tina Turner
John Lennon Freddie Mercury
Marvin Gaye Bob Marley
Bob Dylan Smokey Robinson
Otis Redding Johnny Cash
Stevie Wonder Etta James
James Brown David Bowie
Paul McCartney Van Morrison
Little Richard Michael Jackson
Roy Orbison Jackie Wilson
Você pode obter isso como uma lista de strings aqui .
Tarefa
Dado um nome de cantor, imprimir ou retornar uma carta A
para Z
que identifica exclusivamente o cantor. (Se o seu código retornar A para Bob Dylan , ele não poderá retornar A para nenhum outro cantor.)
Ao contrário de outros desafios semelhantes, o mapeamento depende de você , contanto que seja livre de colisões.
Regras
- A entrada é garantida como um dos 26 nomes de cantor listados acima com essa ortografia exata e sem nenhum espaço em branco à esquerda ou à direita.
- Você pode imprimir a letra em minúsculas ou maiúsculas. Mas deve ser consistente.
- Você é incentivado a fornecer um conjunto de testes para todas as 26 entradas possíveis.
- Isso é código-golfe , então a resposta mais curta em bytes vence!
Respostas:
MATL , 28 bytes
Experimente online!
Explicação
Obter implicitamente a sequência de entrada. Soma os caracteres da sequência de entrada e faça-o no módulo 98 seguido pelo módulo 40. Resultados em um dos seguintes números:
38 18 13 34 29 23 27 30 5 28 22 1 0 16 7 32 8 14 3 36 25 4 2 6 24 35
(na ordem da lista Pastebin).Empurre o alfabeto (minúsculo) com
2Y2
. Isso cuida dos números no intervalo [1,26]. No entanto, alguns números estão ausentes e temos números até 38. Portanto, anexamos (h
) uma string que cuida dos números mais altos, mapeando esses números para as letras 'ausentes'. Os espaços podem ser qualquer coisa, usei letras maiúsculas no meu programa original para minha própria conveniência.Agora podemos indexar o número do primeiro passo na string do segundo passo com
)
. Usamosw
para obter os argumentos na ordem correta. Embora possa parecer que usamos indexação baseada em 0 (os números variam de 0 a 38 e a string tem 39 caracteres), a realidade é um pouco mais complicada: usamos indexação modular baseada em 1, um recurso exclusivo para MATL. Isso significa que1
indexa paraa
,38
na verdade indexa parau
e0
indexa para a finalz
da string.fonte
Python 2 ,
8071 bytesExperimente online!
As somas dos ordinais modificados fornecem números entre
0
e38
Os números maiores que 25 são então deslocados para preencher os espaços em branco como abaixo (sequência classificada mostrada):
Subtraia
18
sei>25
:Adicione
3
sei>31
:Subtraia
8
sei>37
:O que dá a sequência
0..25
Estes são então convertidos em
A-Z
comchr(i+65)
fonte
(i>31)
ai/32
, etcRotina de código de máquina 6502 (C64), 83 bytes
Este é um código independente da posição, basta colocá-lo em algum lugar da RAM e pular para lá, por exemplo, usando o
sys
comandoDemonstração online (carrega para
$C000
/49152
).Uso:
sys49152,"[name]"
por exemplosys49152,"Aretha Franklin"
.Importante: Se o programa foi carregado a partir do disco (como na demonstração online), emita um
new
comando primeiro! Isso é necessário porque o carregamento de um programa de máquina elimina alguns ponteiros C64 BASIC.Nota: Por padrão, o C64 está em um modo sem letras minúsculas - para poder inserir nomes legíveis , alterne para o modo minúsculo primeiro pressionando
SHIFT
+CBM
.Explicação
O desafio é, de fato, encontrar uma função hash perfeita mínima para esses nomes; para o C64, tive que encontrar um que fosse facilmente computável em operações simples de 8 bits. Aqui está uma lista de desmontagem comentada:
Conjunto de testes (C64 BASIC, contendo a rotina do código da máquina em
data
linhas)Demonstração on-line do conjunto de testes .
fonte
Python 2 , 68 bytes
Experimente online!
fonte
chr(65+i-i/25*2-i/29*21+i/35*2)
) é semelhante à resposta do TFelds . As operações do módulo são brutais, forçadas por um script que eu já usei aqui e aqui .Javascript,
138132 caracteresComo todas as iniciais são únicos, com excepção de
MJ
= H ichael J ACKSON / M ick J Agger, verifico para Michael Jackson especificamente (o único com umh
sobre o quarto posição), e para todos os outros nomes Criei uma corda com as iniciais seguido por uma letra única.Fragmento de código
Experimente aqui:
fonte
Java (OpenJDK 8) ,
128126115113 bytesNão é muito pobre para uma submissão java!
Obrigado a Kevin por me salvar um monte de bytes com as expressões lambda!
Experimente online!
fonte
{a+=i;}
aa+=i;
char g(String s)
paras->
. Modifiquei seu TIO para mostrar como fazer isso, caso você esteja acostumado apenas aos métodos Java 7.Python 3,
1329996 bytesExperimente online!
Não jogava golfe de maneira brilhante, mas pensei em tentar.
-33 bytes graças a modificações feitas pelo TFeld.
-3 bytes usando em
find
vez deindex
graças a ovs.fonte
sum(map(ord,m))
, também adicionei Aretha Franklin por 128 bytes #chr(97+...)
vez deascii_lowercase
: 99 bytessum(map(ord,m))
adiciona os valores ASCII dos caracteres na sequênciam
(fornece números inteiros no intervalo 702–1506). Em seguida, chamá-chr
lo o converte em um caractere (Unicode) com esse número:chr(702)
éʾ
parachr(1506) = ע
e muito no meio. Essa solução simplesmente consulta esse caractere em uma lista de todos os caracteres possíveis (26) para obter o índice (0–26), depois retorna o caractere com código ASCII 97 + esse índice (então 'a' a 'z').PHP,
90 88 8672 + 1 bytespode ficar ainda mais curto com um módulo diferente.
Salve em arquivo e execute como pipe
-nF
ou experimente online .fonte
W
nos seus casos de teste e não háX
saída. Não sei se é um erro no próprio código ou apenas a experimentá-lo conversão online :)<?=
peça. E o 'Run as pipe' não estou trabalhando. Além disso, recebo avisos ao tentar executá-lo na linha de comando.<?=
... Então, minha pergunta ainda é: como executo seu código (na linha de comando)? Falha ao alimentá-lo$argn
na linha de comando ... Até agora, todas as minhas tentativas fornecem artefatos e ainda parecem exigir mais código para executá-lo.echo <input> | php -nF <scriptfilename>
Perl,
56,54,50, 46 +1 (-p) bytes$ = crypt $ , DT; / .. (.) /; $ _ = $ 1; y / 01268ADIJNVW / adhilmnpqsux /$ = crypt $ , DT; / .. (.) /; $ = $ 1; y / 01268JVW / hlmpqsux /; $ = lc$ = criptografia $ , mO; / .. (.) /; $ = $ 1; y / 035eft / AHPRXZ /; $ = lcGraças ao comentário do Dom, foi possível salvar mais 4 bytes, também alterado para maiúsculas para atender a melhores requisitos.
Experimente Online
fonte
perl -pe '$_=crypt$_,mO;/..(.)/;$_=$1;y/035eft/AHPRXZ/;$_=lc'
adicionando link para tio$1^$2
mas não pensou em usarcrypt
... Você pode salvar 4 bytes com alguns pedidos novamente: Experimente on-line!Python 2,
5043 bytesCrédito para japh pela nova versão
Experimente online!
Nota: Isso depende do
hash
embutido e não funcionará em todas as implementaçõesfonte
lambda n:chr(hash(n)%2354%977%237%54%26+65)
Ruby, 63 bytes
Adiciona os códigos ASCII da entrada, usa o mod 98 e, em seguida, o mod 66 para obter um dos 26 números exclusivos
n
no intervalo de 0 a 65. O grande número hexadecimal contém um1
pouco em cada um desses 26 locais; portanto, ao deslocar o direiton
, obtemos um número com 1 a 261
bits. Contamos os1
bits adicionando os códigos ascii e usando o mod 48, depois adicionamos 64 e convertemos em um código ASCII.Programa de teste
o
map
percorre o cantores imprimir o código de letras e cantor. Em seguida, ele retorna uma matriz dos códigos das letras,sort
editada para demonstrar que cada letra é usada uma vez.Saída
fonte
Oitava ,
85 83 8074 bytesEssa bagunça de um anônimo é o resultado de algumas bagunças no MATLAB tentando encontrar uma boa maneira de codificar os dados.
Basicamente, após uma análise rápida, são necessárias apenas as letras 1,2 e 8 da sequência de entrada (a menor seqüência é de 8 caracteres, portanto, somos bons) para produzir um valor único para cada entrada. A parte difícil é então converter esse valor único em algo utilizável.
O MATLAB é péssimo na compactação de dados, então tive que procurar outra maneira de fazer o mapeamento de pesquisa. Comecei a tentar encontrar alguma função nas três letras de entrada que resultassem em um valor único que também fosse um valor ASCII imprimível, para que eu pudesse incorporar o mapeamento em uma sequência de um caractere por entrada.
Acontece que a matriz multiplicando os caracteres no índice
[1 2 8]
pela matriz inteira[1;15;47]
e, em seguida, realizando o mod 124 resulta em valores únicos, todos os ASCII imprimíveis (e nenhum é um'
caractere que possa causar erros literais em strings). Agradavelmente, o mapeamento termina com oTIO
que é completamente acidental. Curiosamente, este é o único mapeamento para essa equação que fornece 26 caracteres ASCII imprimíveis exclusivos.Basicamente, esse é o meu mapeamento e cálculo de pesquisa. Fazer a pesquisa é simplesmente um caso de executar o cálculo e comparar com o mapeamento. Adicionando
'A'-1
ao índice no mapa resulta em um caractere AZ.Você pode experimentá-lo online no TIO, que mostra o mapeamento completo de entradas e saídas. Para completar, o mapeamento completo também está abaixo:
+32
.'A':'Z'
vez de localizar.fonte
JavaScript (Chrome), 102
Nota Infelizmente, ele funciona apenas no Chrome, devido às aproximações dependentes da implementação em parseInt () (obrigado @Arnauld)
Procurei uma função hash, pegando uma fatia de cada nome, convertendo em números usando a base 36 e aplicando um módulo.
Eu usei esse código para procurar o melhor hash:
E os resultados:
A melhor função hash fornece 26 valores diferentes entre 0 e 50, mas usei um diferente, com 1 duplicado, mas um intervalo menor.
Teste
fonte
parseInt()
.C,
655549 bytesh(char*s){return*s<77?(*s^s[5]+40)%13+65:(s[5]&s[4]+s[1])%13+78;}
h(char*s){return*(long*)s%887%392%224%120%67%40%26+65;}
Mesma abordagem que a resposta do KSab . C não fornece uma
hash
função de string como Python. Ou faz?Experimente online!
h
retorna umint
cujos valores são os códigos ASCII paraA .. Z
.fonte
Javascript, 98 bytes
Descobri que a combinação dos caracteres 2 e 4 dos nomes é única para cada um deles.
Portanto, eu crio uma string com as combinações de
name[4] + name[2]
, notname[2] + name[4]
ou eu teria uma repetição do grupoeh
de caracteres com o nome Aretha Franklineh
e quando Smokey Robinson e Johnny Cashoehn
forem concatenados.Eu poderia simplesmente mover Johnny Cash para outra posição da string e obter um mapeamento diferente, mas concatenar o 4º e o 2º caracteres nesta ordem evita a colisão e deixa intacta a ordem do conjunto de dados sem adicionar mais comprimento à solução. Então eu decidi seguir esse caminho (é apenas preferência pessoal)
Eu procuro a posição da concatenação da 4ª e 2ª letra do parâmetro fornecido na string e divido-a por 2 para obter um número entre 0 e 25. Em seguida, adiciono 10 e a converto em string da base 36, onde 10 corresponde
a
e 35 az
fonte
Língua Wolfram (Mathematica) , 101
126bytes+32
parece levar à menor hashtable de agitação do MathematicaInputForm
.Experimente online!
fonte
///,
390231 bytesExperimente online!
231 bytes após remover as novas linhas.
Isso é muito longo, mas /// não pode lidar com caracteres diferentes genericamente. Em outras palavras, /// não suporta regex.
fonte
Excel, 96 bytes
Depois de muito tempo desperdiçado tentando outras abordagens, implementamos a abordagem de @Eduardo Paez:
fonte