Según RollingStone , a continuación se encuentran los 26 mejores cantantes de todos los tiempos:
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
Puede obtener esto como una lista de cadenas aquí .
Tarea
Dado un nombre de cantante, imprimir o devolver una carta de A
a Z
la que identifica de forma exclusiva este cantante. (Si su código devuelve A para Bob Dylan , entonces no puede devolver A para ningún otro cantante).
A diferencia de otros desafíos similares, el mapeo depende de usted siempre que esté libre de colisiones.
Reglas
- Se garantiza que la entrada sea uno de los 26 nombres de cantantes mencionados anteriormente con esta ortografía exacta y sin espacios en blanco iniciales o finales.
- Puede mostrar la letra en minúsculas o mayúsculas. Pero debe ser consistente.
- Le recomendamos que proporcione un conjunto de pruebas para las 26 entradas posibles.
- Este es el código de golf , por lo que gana la respuesta más corta en bytes.
Respuestas:
MATL , 28 bytes
Pruébalo en línea!
Explicación
Implícitamente obtiene la cadena de entrada. Suma los caracteres de la cadena de entrada y hazlo módulo 98 seguido del módulo 40. Resultados en uno de los siguientes 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
(en orden de la lista de Pastebin).Empuje el alfabeto (minúscula) con
2Y2
. Esto se encarga de los números en el rango [1,26]. Sin embargo, faltan algunos números, y tenemos números hasta 38. Por lo tanto, agregamos (h
) una cadena que se ocupa de los números más altos, asignando estos números a las letras 'faltantes'. Los espacios pueden ser cualquier cosa, utilicé letras mayúsculas en mi programa original para mi propia conveniencia.Ahora podemos indexar el número del primer paso en la cadena del segundo paso con
)
. Usamosw
para obtener los argumentos en el orden correcto. Si bien puede parecer que usamos indexación basada en 0 (los números varían de 0 a 38 y la cadena tiene 39 caracteres de largo), la realidad es un poco más complicada: utilizamos indexación modular basada en 1, una característica exclusiva de MATL. Esto significa que1
indexaa
,38
indexau
e0
indexa al finalz
de la cadena.fuente
Python 2 ,
8071 bytesPruébalo en línea!
Las sumas de ordinales modificados dan números entre
0
y38
Los números mayores que 25 se desplazan para completar los espacios en blanco como se muestra a continuación (se muestra la secuencia ordenada):
Resta
18
sii>25
:Agregar
3
sii>31
:Resta
8
sii>37
:Que da la secuencia
0..25
Estos luego se convierten a
A-Z
conchr(i+65)
fuente
(i>31)
ai/32
, etc6502 rutina de código de máquina (C64), 83 bytes
Este es un código independiente de la posición, simplemente colóquelo en algún lugar de la RAM y salte allí, por ejemplo, utilizando el
sys
comandoDemostración en línea (cargas a
$C000
/49152
).Uso:
sys49152,"[name]"
por ejsys49152,"Aretha Franklin"
.Importante: si el programa se cargó desde el disco (como en la demostración en línea), ¡emita
new
primero un comando! Esto es necesario porque cargar un programa de máquina destruye algunos punteros BÁSICOS C64.Nota: El C64 está por defecto en un modo sin letras minúsculas, para poder ingresar legible nombres , primero cambie al modo minúsculas presionando
SHIFT
+CBM
.Explicación
El desafío es, de hecho, encontrar una función hash perfecta mínima para estos nombres; para el C64, tuve que encontrar uno que sea fácilmente computable en operaciones simples de 8 bits. Aquí hay un listado de desmontaje comentado:
Conjunto de pruebas (C64 BASIC, que contiene la rutina del código de máquina en
data
líneas)Demostración en línea del conjunto de pruebas .
fuente
Python 2 , 68 bytes
Pruébalo en línea!
fuente
chr(65+i-i/25*2-i/29*21+i/35*2)
) es similar a la respuesta de TFelds . Las operaciones de módulo son forzadas por un script que ya usé aquí y aquí .Javascript,
138132 caracteresComo todas las iniciales son únicas, a excepción de
MJ
= M ichael J ackson / M ick J agger, verifico específicamente a Michael Jackson (el único con unh
en la cuarta posición), y para todos los demás nombres, creé una cadena con las iniciales seguidas por una carta únicaFragmento de código
Pruébalo aquí:
fuente
Java (OpenJDK 8) ,
128126115113 bytes¡No está mal para una presentación de Java!
¡Gracias a Kevin por salvarme muchos bytes con las expresiones lambda!
Pruébalo en línea!
fuente
{a+=i;}
aa+=i;
char g(String s)
as->
. Modifiqué tu TIO para mostrar cómo hacerlo, en caso de que solo estés acostumbrado a los métodos Java 7.Python 3,
1329996 bytesPruébalo en línea!
No jugaba al golf de manera brillante, pero pensé en intentarlo.
-33 bytes gracias a las modificaciones realizadas por TFeld.
-3 bytes usando en
find
lugar deindex
gracias a los ovs.fuente
sum(map(ord,m))
, también agregué Aretha Franklin por 128 byteschr(97+...)
lugar deascii_lowercase
: 99 bytessum(map(ord,m))
suma los valores ASCII de los caracteres en la cadenam
(da enteros en el rango 702-1506). Luego, llamarlochr
lo convierte en un carácter (Unicode) con ese número:chr(702)
isʾ
tochr(1506) = ע
y mucho en el medio. Esta solución simplemente busca este carácter en una lista de todos los caracteres posibles (26) para obtener el índice (0–26), luego devuelve el carácter con el código ASCII 97 + ese índice (entonces 'a' a 'z').PHP,
90 88 8672 + 1 bytespodría acortarse aún más con un módulo diferente.
Guardar en el archivo y ejecutar como canalización
-nF
o probarlo en línea .fuente
W
en sus casos de prueba, y no hayX
salida. No sé si es un error en el código en sí o simplemente la conversión de prueba en línea :)<?=
parte. Y el 'Ejecutar como tubería' no estoy trabajando. Además, recibo avisos cuando intento ejecutarlo desde la línea de comandos.<?=
... Entonces mi pregunta es, ¿cómo ejecuto su código (desde la línea de comandos)? No puedo alimentarlo$argn
en la línea de comando ... Todos mis intentos hasta ahora dan artefactos y todavía parecen requerir más código para que se ejecute.echo <input> | php -nF <scriptfilename>
Perl,
56,54,50, 46 +1 (-p) bytes$ = cripta $ , DT; / .. (.) /; $ _ = $ 1; y / 01268ADIJNVW / adhilmnpqsux /$ = cripta $ , DT; / .. (.) /; $ = $ 1; y / 01268JVW / hlmpqsux /; $ = lc$ = cripta $ , mO; / .. (.) /; $ = $ 1; y / 035eft / AHPRXZ /; $ = lcGracias al comentario de Dom podría ahorrar 4 bytes más, también cambió a mayúsculas para ajustarse a los mejores requisitos.
Pruébalo en línea
fuente
perl -pe '$_=crypt$_,mO;/..(.)/;$_=$1;y/035eft/AHPRXZ/;$_=lc'
agregar enlace a tio$1^$2
pero no pensé en usarlocrypt
... Puede guardar 4 bytes con algunos reordenamientos: ¡ Pruébelo en línea!Python 2,
5043 bytesCrédito a japh por la nueva versión
Pruébalo en línea!
Nota: Esto depende de lo
hash
incorporado y no funcionará en todas las implementacionesfuente
lambda n:chr(hash(n)%2354%977%237%54%26+65)
Ruby, 63 bytes
Agrega los códigos ascii de la entrada, los toma mod 98 y luego mod 66 para obtener uno de los 26 números únicos
n
en el rango 0..65. El gran número hexadecimal contiene un1
bit en cada uno de estos 26 lugares, por lo que al desplazarlo con el derechon
obtenemos un número con 1..261
bits. Contamos los1
bits agregando los códigos ascii y tomando mod 48, luego agregamos 64 y convertimos a un código ASCII.Programa de prueba
el
map
itera a través de los cantantes que imprimen el código de la letra y el cantante. Luego devuelve una matriz de códigos de letras, que sesort
edita para demostrar que cada letra se usa una vez.Salida
fuente
Octava ,
85 83 8074 bytesEste desorden anónimo es el resultado de algunos errores en MATLAB tratando de encontrar una buena manera de codificar los datos.
Básicamente, después de un análisis rápido, solo se necesitan las letras 1,2 y 8 de la cadena de entrada (la cadena más pequeña es de 8 caracteres, por lo que estamos bien) para producir un valor único de cada entrada. La parte difícil es convertir ese valor único en algo utilizable.
MATLAB es terrible para comprimir datos, así que tuve que buscar otra forma de hacer el mapeo de búsqueda. Me propuse tratar de encontrar alguna función en las tres letras de entrada que resultaran en un valor único que también fuera un valor ASCII imprimible para poder incrustar la asignación en una cadena de un carácter por entrada.
Resulta que la matriz que multiplica los caracteres en el índice
[1 2 8]
por la matriz entera[1;15;47]
y luego realiza el mod 124 da como resultado valores únicos que todos los ASCII imprimibles (y ninguno es un'
carácter que fastidie los literales de cadena). Agradablemente el mapeo termina con loTIO
cual es completamente accidental. Curiosamente, este es el único mapeo para esta ecuación que proporciona 26 caracteres ASCII imprimibles únicos.Básicamente, ese es mi mapeo de búsqueda y cálculo. Hacer la búsqueda es simplemente un caso de realizar el cálculo y compararlo con el mapeo. Agregar
'A'-1
al índice en el mapa da como resultado un carácter AZ.Puede probarlo en línea en TIO, que muestra la asignación completa de entradas y salidas. Para completar, el mapeo completo también está a continuación:
+32
.'A':'Z'
lugar de find.fuente
JavaScript (Chrome), 102
Nota Desafortunadamente, solo funciona en Chrome, debido a aproximaciones dependientes de la implementación en parseInt () (gracias @Arnauld)
Busqué una función hash, tomando una porción de cada nombre, convirtiendo a números usando la base 36 y luego aplicando un módulo.
Usé este código para buscar el mejor hash:
Y los resultados:
La mejor función hash da 26 valores diferentes entre 0 y 50, pero utilicé uno diferente, con 1 duplicado pero un rango más pequeño.
Prueba
fuente
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;}
El mismo enfoque que la respuesta de KSab . C no proporciona una
hash
función de cadena como Python. O lo hace?Pruébalo en línea!
h
devuelve unint
cuyos valores son los códigos ASCII paraA .. Z
.fuente
Javascript, 98 bytes
Descubrí que la combinación de los caracteres segundo y cuarto de los nombres es única para cada uno de ellos.
Por lo tanto, creo una cadena con las combinaciones de
name[4] + name[2]
, noname[2] + name[4]
o tendría una repetición del grupoeh
de caracteres del primer nombre Aretha Franklineh
y cuando Smokey Robinson y Johnny Cashoehn
se concatenan.Podría mover a Johnny Cash a otra posición de la cadena y obtener un mapeo diferente, pero concatenando el 4 ° y 2 ° carácter en este orden evita la colisión y deja el orden del conjunto de datos intacto sin agregar más longitud a la solución. Así que decidí ir por ese camino (es solo una preferencia personal)
Busco la posición de la concatenación de la 4ª y 2ª letra del parámetro dado en la cadena y la divido por 2 para obtener un número entre 0 y 25. Luego agrego 10 y lo convierto en cadena desde la base 36, donde 10 corresponde a
a
y 35 az
fuente
Wolfram Language (Mathematica) , 101
126bytes+32
parece conducir a la tabla hash de agitación más corta en MathematicaInputForm
.Pruébalo en línea!
fuente
///,
390231 bytesPruébalo en línea!
231 bytes después de eliminar las nuevas líneas.
Esto es muy largo, pero /// no puede manejar diferentes caracteres genéricamente. En otras palabras, /// no admite expresiones regulares.
fuente
Excel, 96 bytes
Después de perder demasiado tiempo probando otros enfoques, he implementado el enfoque de @Eduardo Paez:
fuente