Selon RollingStone , voici les 26 plus grands chanteurs de tous les temps:
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
Vous pouvez obtenir ceci sous forme de liste de chaînes ici .
Tâche
Étant donné un nom de chanteur, imprimer ou retourner une lettre A
à Z
qui identifie de manière unique ce chanteur. (Si votre code renvoie A pour Bob Dylan , il ne peut pas renvoyer A pour un autre chanteur.)
Contrairement à d'autres défis similaires, la cartographie vous appartient tant que vous évitez les collisions.
Règles
- L’entrée est l’un des 26 noms de chanteurs énumérés ci-dessus avec cette orthographe exacte et sans aucun espace au début ni à la fin.
- Vous pouvez écrire la lettre en minuscule ou en majuscule. Mais cela doit être cohérent.
- Nous vous encourageons à fournir une suite de tests pour les 26 entrées possibles.
- C'est du code-golf , donc la réponse la plus courte en octets gagne!
Réponses:
MATL , 28 octets
Essayez-le en ligne!
Explication
Obtenir implicitement la chaîne d'entrée. Faites la somme des caractères de la chaîne d'entrée et faites-le module 98 suivi du module 40. Résultat dans l'un des nombres suivants:
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
(dans l'ordre de la liste de Pastebin).Appuyez sur l'alphabet (minuscule) avec
2Y2
. Ceci prend en charge les nombres dans l'intervalle [1,26]. Cependant, certains nombres manquent et nous avons des nombres allant jusqu'à 38. Par conséquent, nous ajoutons (h
) une chaîne qui prend en charge les nombres les plus élevés, en mappant ces nombres aux lettres «manquantes». Les espaces peuvent être n'importe quoi, j'ai utilisé des majuscules dans mon programme original pour ma propre commodité.Nous pouvons maintenant indexer le nombre de la première étape dans la chaîne de la deuxième étape avec
)
. Nous utilisonsw
pour obtenir les arguments dans le bon ordre. Il peut sembler que nous utilisions une indexation basée sur 0 (les nombres varient de 0 à 38, et une chaîne de 39 caractères), mais la réalité est en réalité un peu plus compliquée: nous utilisons l’indexation modulaire à 1, une fonctionnalité unique en son genre. MATL. Cela signifie que les1
index versa
, les38
index versu
et les0
index vers la finz
de la chaîne.la source
Python 2 ,
8071 octetsEssayez-le en ligne!
Les sommes des ordinaux modded donnent des nombres entre
0
et38
Les nombres supérieurs à 25 sont ensuite décalés pour remplir les blancs comme ci-dessous (séquence triée affichée):
Soustrayez
18
sii>25
:Ajouter
3
sii>31
:Soustrayez
8
sii>37
:Ce qui donne la séquence
0..25
Ceux-ci sont ensuite convertis en
A-Z
avecchr(i+65)
la source
(i>31)
ài/32
, etc6502 routine de code machine (C64), 83 octets
C'est un code indépendant de la position, mettez-le simplement quelque part dans la RAM et sautez-y, par exemple en utilisant la
sys
commande.Démo en ligne (chargement vers
$C000
/49152
).Utilisation:
sys49152,"[name]"
, par exemplesys49152,"Aretha Franklin"
.Important: Si le programme a été chargé à partir du disque (comme dans la démonstration en ligne), lancez d'abord une
new
commande! Cela est nécessaire car le chargement d'un programme machine supprime certains pointeurs C64 BASIC.Remarque: le C64 est par défaut en mode sans lettres minuscules. Pour pouvoir saisir des noms lisibles , passez tout d'abord en mode minuscule en appuyant sur
SHIFT
+CBM
.Explication
Le défi consiste en fait à trouver une fonction de hachage parfaite minimale pour ces noms; pour le C64, je devais en trouver un facilement calculable en opérations 8 bits simples. Voici une liste de désassemblage commentée:
Suite de tests (C64 BASIC, contenant la routine de code machine en
data
lignes)Démo en ligne de la suite de tests .
la source
Python 2 , 68 octets
Essayez-le en ligne!
la source
chr(65+i-i/25*2-i/29*21+i/35*2)
) est similaire à la réponse de TFelds . Les opérations modulo sont renforcées par un script que j'ai déjà utilisé ici et ici .Javascript,
138132 caractèresComme toutes les initiales sont uniques, à l'exception de
MJ
= M ichael J ackson / M e Jick J agger, je vérifie plus particulièrement Michael Jackson (le seul avec unh
4ème position), et pour tous les autres noms, j'ai créé une chaîne avec les initiales suivies par une lettre unique.Extrait de code
Essayez-le ici:
la source
Java (OpenJDK 8) ,
128126115113 octetsPas trop mal pour une soumission java!
Merci à Kevin de m'avoir épargné beaucoup d'octets avec les expressions lambda!
Essayez-le en ligne!
la source
{a+=i;}
dea+=i;
char g(String s)
au golfs->
. J'ai modifié votre TIO pour montrer comment procéder, au cas où vous ne seriez habitué qu'aux méthodes Java 7.Python 3,
1329996 octetsEssayez-le en ligne!
Pas brillamment au golf, mais je pensais tenter le coup.
-33 octets grâce aux modifications apportées par TFeld.
-3 octets en utilisant
find
au lieu deindex
grâce à ovs.la source
sum(map(ord,m))
, j'ai aussi ajouté Aretha Franklin pour 128 octetschr(97+...)
au lieu deascii_lowercase
: 99 octetssum(map(ord,m))
additionne les valeurs ASCII des caractères de la chaînem
(donne les entiers compris entre 702 et 1506). Puis appelle ,chr
il la convertit en un caractère (Unicode) avec ce numéro:chr(702)
estʾ
àchr(1506) = ע
et beaucoup entre les deux. Cette solution cherche simplement ce caractère dans une liste de tous les caractères possibles (26) pour obtenir l'index (0 à 26), puis renvoie le caractère avec le code ASCII 97 + cet index (donc 'a' à 'z').PHP,
90 88 8672 + 1 octetspourrait devenir encore plus court avec un modulo différent.
Enregistrez dans un fichier et exécutez-le comme un tuyau
-nF
ou essayez-le en ligne .la source
W
sur vos cas de test, et il n'y a pas deX
sortie. Je ne sais pas s'il s'agit d'une erreur dans le code lui-même ou si vous essayez simplement la conversion en ligne :)<?=
pièce. Et le 'Run as pipe`, je ne travaille pas. En outre, je reçois des avis lorsque j'essaie de l'exécuter en ligne de commande.<?=
... Donc ma question est toujours, comment puis-je exécuter votre code (en ligne de commande)? Je ne parviens pas à le nourrir$argn
en ligne de commande ... Tous mes essais jusqu'à présent donnent des artefacts et semblent toujours nécessiter plus de code pour le faire fonctionner.echo <input> | php -nF <scriptfilename>
Perl,
56,54,50, 46 +1 (-p) octets$ = crypt $ , DT; / .. (.) /; $ _ = $ 1; y / 01268ADIJNVW / adhilmnpqsux /$ = crypt $ , DT; / .. (.) /; $ = $ 1; y / 01268JVW / hlmpqsux /; $ = lc$ = crypt $ , mO; / .. (.) /; $ = $ 1; y / 035eft / AHPRXZ /; $ = lcGrâce au commentaire de Dom, nous avons pu économiser 4 octets supplémentaires, qui ont également été changés en majuscules pour mieux répondre aux besoins.
Essayez-le en ligne
la source
perl -pe '$_=crypt$_,mO;/..(.)/;$_=$1;y/035eft/AHPRXZ/;$_=lc'
ajout d'un lien vers tio$1^$2
mais je n’avais pas pensé à l’utilisercrypt
... Vous pouvez économiser 4 octets avec quelques réorganisations: essayez-le en ligne!Python 2,
5043 octetsCrédit à japh pour la nouvelle version
Essayez-le en ligne!
Remarque: Cela dépend de la commande
hash
intégrée et ne fonctionnera pas dans toutes les implémentations.la source
lambda n:chr(hash(n)%2354%977%237%54%26+65)
Ruby, 63 octets
Ajoute les codes ascii de l’entrée, les prend mod 98 puis mod 66 pour obtenir l’un des 26 nombres uniques
n
dans la plage 0..65. L'énorme nombre hexadécimal contient un1
bit dans chacun de ces 26 emplacements. Ainsi, en le décalant avec des droits,n
nous obtenons un nombre contenant 1..261
bits. Nous comptons les1
bits en ajoutant les codes ASCII et en prenant le mod 48, puis nous ajoutons 64 et les convertissons en code ASCII.Programme de test
les
map
itèrent à travers les chanteurs imprimant le code lettre et le chanteur. Il retourne ensuite un tableau des codes de lettre, qui estsort
édité pour démontrer que chaque lettre est utilisée une fois.Sortie
la source
Octave ,
85 83 8074 octetsCe fouillis d’anonymat est le résultat d’une foutaise dans MATLAB qui tente de trouver un bon moyen de coder les données.
Fondamentalement, après une analyse rapide, seules les lettres 1, 2 et 8 de la chaîne d'entrée (la plus petite chaîne est composée de 8 caractères, nous sommes donc bons) sont nécessaires pour produire une valeur unique à partir de chaque entrée. La partie difficile est alors de convertir cette valeur unique en quelque chose d’utilisable.
MATLAB supporte mal la compression des données. J'ai donc dû rechercher un autre moyen de mapper le mappage de recherche. Je me suis mis à la recherche d’une fonction sur les trois lettres d’entrée qui donnait une valeur unique qui était aussi une valeur ASCII imprimable afin de pouvoir incorporer le mappage dans une chaîne d’un caractère par entrée.
Il s'avère que cette matrice qui multiplie les caractères d'index
[1 2 8]
par la matrice entière[1;15;47]
, puis exécute le mod 124, donne des valeurs uniques qui sont toutes imprimables en ASCII (et aucune n'est un'
caractère susceptible de semer la confusion dans les chaînes de caractères). Heureusement la cartographie se termine parTIO
ce qui est complètement accidentel. Fait intéressant, il s'agit du seul mappage de cette équation qui donne 26 caractères ASCII imprimables uniques.Donc, en gros, c’est ma cartographie et mon calcul de recherche. La recherche consiste simplement à effectuer le calcul et à comparer le mappage. L'ajout
'A'-1
à l'index de la carte donne un caractère AZ.Vous pouvez l' essayer en ligne sur TIO, qui montre la cartographie complète des entrées et des sorties. Pour être complet, le mappage complet est également présenté ci-dessous:
+32
.'A':'Z'
plutôt que trouver.la source
JavaScript (Chrome), 102
Note Malheureusement, cela ne fonctionne que dans Chrome, à cause des approximations dépendantes de l'implémentation dans parseInt () (merci @Arnauld)
J'ai cherché une fonction de hachage, prenant une tranche de chaque nom, la convertissant en nombres en utilisant la base 36, puis en appliquant un modulo.
J'ai utilisé ce code pour rechercher le meilleur hash:
Et les résultats:
La meilleure fonction de hachage donne 26 valeurs différentes entre 0 et 50, mais j'ai utilisé une valeur différente, avec 1 duplicata mais avec une plage plus petite.
Tester
la source
parseInt()
.C,
655549 octetsh(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;}
Même approche que la réponse de KSab . C ne fournit pas une
hash
fonction de chaîne comme Python. Ou le fait-il?Essayez-le en ligne!
h
renvoie unint
dont les valeurs sont les codes ASCII pourA .. Z
.la source
Javascript, 98 octets
J'ai trouvé que la combinaison du 2ème et du 4ème caractère des noms est unique pour chacun d'eux.
Par conséquent, je crée une chaîne avec les combinaisons de
name[4] + name[2]
, pasname[2] + name[4]
ou j'aurais une répétition du groupeeh
de caractères du prénom Aretha Franklineh
et lorsque Smokey Robinson et Johnny Cashoehn
sont concaténés.Je pourrais simplement déplacer Johnny Cash à un autre emplacement de la chaîne et obtenir un mappage différent, mais concaténer le 4ème et le 2ème caractère dans cet ordre évite la collision et laisse l'ordre de jeu de données intact sans ajouter plus de longueur à la solution. J'ai donc décidé de suivre cette voie (c'est juste une préférence personnelle)
Je recherche la position de la concaténation des 4ème et 2ème lettres du paramètre donné dans la chaîne et la divise par 2 pour obtenir un nombre compris entre 0 et 25. Ensuite, j'ajoute 10 et le convertis en chaîne à partir de la base 36, où 10 correspond à
a
et 35 àz
la source
Wolfram Language (Mathematica) , 101
126octets+32
semble conduire à la table de hachage la plus courte de MathematicaInputForm
.Essayez-le en ligne!
la source
///,
390231 octetsEssayez-le en ligne!
231 octets après la suppression des nouvelles lignes.
C'est très long, mais /// ne peut pas gérer différents caractères de manière générique. En d'autres termes, /// ne supporte pas les regex.
la source
Excel, 96 octets
Après avoir perdu trop de temps à essayer d'autres approches, nous avons mis en œuvre l'approche de @Eduardo Paez:
la source