Inspiré par cette chaîne de commentaires ...
Je veux
enklact
sortir de ce défi mais je ne peux pas ...@ETHproductions to enklact (v): pour implémenter une table de correspondance en utilisant une sous-section composée d'éléments uniques.
Enklacting est un moyen très utile de compresser une table de recherche. Par exemple, supposons que vous ayez la liste de couleurs suivante:
red
green
blue
yellow
purple
orange
Si vous voulez pouvoir prendre une couleur en entrée et retourner son index dans cette liste, il existe évidemment un moyen simple:
["red", "green", "blue", "yellow", "purple", "orange"].index(input())
Mais il y a un moyen de faire cela de manière beaucoup moins d'octets:
"rgbypo".index(input()[0])
Cela fonctionne car le premier (ou 0ème) index de chaque chaîne est unique. Cet exemple est évident, mais parfois c'est un peu plus difficile. Et si nous voulions créer une table de consultation pour cette liste?
Sweet Onion Chicken Teriyaki
Oven Roasted Chicken
Turkey Breast
Italian BMT
Tuna
Black Forest Ham
Meatball Marinara
Dans ce cas, nous ne pouvons pas faire ceci:
"SOTITBM".index(input()[0])
parce qu'il y a deux entrées différentes qui commencent par un 'T'
, à savoir "Thon" et "Turquie". Nous devons regarder un index différent. Si vous regardez le 4ème index de chaque chaîne, vous remarquerez qu'ils sont tous uniques. Donc on peut faire ça ...
"enklact".index(input()[3])
Dans ce cas, la "chaîne enklaction" est "enklact".
Cela nous conduit au défi d'aujourd'hui ...
Étant donné une liste de chaînes, renvoyez toute chaîne enklaction valide. Ou, en d'autres termes, étant donné une liste de chaînes, renvoyez toute nouvelle chaîne où chaque lettre est unique et la chaîne est formée en joignant la ième lettre de chaque chaîne.
S'il n'y a pas de chaîne enklaction valide, votre soumission doit renvoyer une chaîne vide ou une valeur de cohérence cohérente. Comme d'habitude, les fonctions ou les programmes complets sont autorisés, et les formats d'entrée / sortie sont permissifs (dans des limites raisonnables).
Chaque chaîne ne contiendra que de l'ASCII imprimable, et ce défi est sensible à la casse.
C'est du code-golf , alors essayez d'écrire le programme le plus court possible dans la langue de votre choix!
Cas de test
Input:
Programming
Puzzles
Code
Golf
Output (any one of these):
"ozdl"
"gzef"
Input:
the quick
brown fox
jumped over
lazy dogs
Output:
"tbjl"
"hrua"
"eomz"
" wpy"
"qne "
"if o"
"kxvs"
Note that "u dd" and "coog" are not valid.
Input:
Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Output:
""
Input:
AbC
aBc
bbC
Output:
"Aab"
Input:
@#$%^_
Hello_World
How are you?
Output:
"#eo"
"$lw"
"%l "
"^oa"
Input:
a
ab
ac
Output:
""
Réponses:
Python3, 59 octets
Retourne une chaîne avec l'enklact, None sinon
la source
Python 2 ,
686761 octetsEssayez-le en ligne!
Améliorations
Si la sortie ne doit pas nécessairement être une chaîne:
Python 3 , 49 octets
Essayez-le en ligne!
la source
max(`j`[2::5]for j in[""]+zip(*a)if len(set(j))==len(j))
fonctionne, pour sauver un octet.Retina ,
4332 octetsEssayez-le en ligne! Edit: 11 octets enregistrés grâce à @MartinEnder. Explication:
Répétez pendant que l'entrée change ...
... seulement si une ligne est vide ou deux lignes commencent par le même caractère ...
... supprime le premier caractère de chaque ligne. La répétition s’arrête donc si a) toutes les lignes commencent par des caractères différents, auquel cas la condition échoue et que l’entrée ne soit pas modifiée, ou b) au moins une ligne devient vide, auquel cas tous les caractères sont finalement supprimés, à quel point l'entrée cesse de changer.
Recueillir le premier caractère de chaque ligne. (S'il n'y avait pas de solution, la boucle ci-dessus aura tout supprimé et il n'y aura rien à collecter.)
la source
m
avec un groupe ici, il semble que l'étape conditionnelle ne propage pas l'option).Haskell , 71 octets
Essayez-le en ligne!
BMO a enregistré 3 octets avec
any null x
→elem""x
.Ørjan Johansen a sauvegardé un octet avec
sum[1|b<-y,a==b]<2
→filter(==a)[y]==[a]
.Explication
Si lancer une erreur (
Prelude.head: empty list
) alors qu'il n'y a pas de solution est OK,|elem""x=""
peut être effacé pour 61 octets .la source
filter(==a)y==[a]
Ruby , 38 octets
Essayez-le en ligne!
Merci à GB d'avoir signalé un bug.
la source
Pyth , 6 octets
Suite de tests.
La sortie est une liste de singleton, comme autorisé par défaut ; la liste [] (liste vide, falsy) est renvoyée au cas où la chaîne ne pourrait pas être enklactified .
Explication
Pyth , 5 octets
Cela aurait été valable si le crash avait été compté comme une valeur de fausseté.
Suite de tests.
la source
Haskell ,
7674 octetsEssayez-le en ligne! Retourne la dernière chaîne de recherche valide ou une chaîne vide s'il n'en existe aucune.
7169 octetsSi le lancement d'une exception cohérente en tant que valeur falsy est autorisé:
Essayez-le en ligne! Lève une
empty list
exception si aucune chaîne n'est trouvée, sinon retourne la première chaîne valide.-2 octets grâce à Ørjan Johansen
la source
notElem x
peut être raccourci àall(/=x)
.Gelée , 7 octets
Retourne l'entier 0 si les chaînes ne peuvent pas être enklactified.
Essayez-le en ligne!
Comment ça marche
la source
Perl 5 , 61 octets
Essayez-le en ligne!
la source
Stax ,
9 à8 octetsExécuter et déboguer
Explication (non emballée):
la source
R , 127 octets
Essayez-le en ligne!
sapply
renvoie généralement unmatrix
lorsque tous leslength(FUN(X[[i]]))
sont égaux, sauf quandlength(FUN(X[[i]]))==1
, auquel cas il retourne unvector
. Pour utiliser les opérations de la matrice, alors, nous devonssubstring
un autre que nous devons garantir unematrix
, ce qui explique pourquoix
étend àmax(nchar(S)+1)
.Nous filtrons ensuite les lignes sans doublons ni chaînes vides. Étant donné que nous ne pouvons renvoyer qu'une seule chaîne, nous prenons la première, à l'exception que s'il n'y a aucune ligne répondant aux critères, une erreur est générée. Nous ajoutons donc une ligne supplémentaire
""
à la fin.Ensuite, nous imprimons la
enklact
chaîne ified ou la chaîne vide.la source
R ,
11610795 octetsR + pryr
Essayez-le en ligne!
base R
Essayez-le en ligne!
Ces deux variantes économisent 9 octets grâce à Giuseppe .
Explication:
Cela tronque efficacement toutes les piqûres du vecteur
v
à la longueur du plus court et itère les index suivants. Ensuite, vérifie s'il y a des doublons dans les lettres choisies et sinon, les colle et les imprimecat
. Si tous les index renvoient des résultats dupliqués, cela affiche une chaîne vide.Tout est encapsulé dans une
pryr
fonction anonyme avecbreak
pour arrêter la boucle, ou la fonction de base R met à zéro le vecteur pour rompre la boucle.la source
R+pryr
ou 107 octets dans la base R.Japt, 9 octets
Prend en entrée un tableau de tableaux de caractères, retourne un tableau de caractères ou
undefined
Essayez-le (ajoutez une nouvelle ligne au début du programme avec le code
qR mq
à prendre en entrée sous forme de chaîne séparée par une nouvelle ligne, afin de vous éviter les tracas liés à la création des tableaux.)Explication
la source
z æ_¬eZ¬â
05AB1E , 7 octets
Essayez-le en ligne!
Explication
la source
Python 3 , 75 octets
Fonctionne sur des listes de caractères au lieu de chaînes. Renvoie False si aucune chaîne enklaction valide n'existe.
Essayez-le en ligne!
la source
f=
soit inclus dans le nombre d'octets.C (gcc) , 161 octets
Essayez-le en ligne!
Chaque position de caractère est testée pour la duplication et ignorée si une duplication est détectée; cela se poursuit jusqu'à la fin de la chaîne la plus courte. Malheureusement, il n’ya que l’ASCII: les chaînes DBCS / UTF-8 cassent mal cette fonction!
la source
Japt , 12 octets
Renvoie
undefined
les chaînes non-enklactiques.Essayez-le en ligne!
Explication:
la source
split
s.Wolfram Language (Mathematica) , 54 octets
Essayez-le en ligne!
Prend une liste de caractères en entrée, retourne une liste de caractères. Contient U + F3C7, correspondant à l'opérateur "Transpose".
Résultats
#1
et jette un tas d'erreurs ignorables lorsqu'il n'y a pas de chaîne appropriée.Explication:
Complétez l'entrée de sorte que chaque "chaîne" (liste de caractères) ait la même longueur. Ceci ajoute un entier
0
s (pas une chaîne"0"
s). Puis transposer.Sélectionnez les chaînes qui ne contiennent pas d’entiers
0
et qui ont tous des caractères uniques.Obtenez le premier.
la source
JavaScript (ES6), 66 octets
Retourne une chaîne ou
undefined
s'il n'y a pas de solution.Essayez-le en ligne!
Commenté
la source
Charbon de bois ,
2321 octets-2 octets grâce à @Neil !
Essayez-le en ligne!
la source
q
cessé d'être toujours une chaîne b) StringMap a commencé à travailler sur des non-chaînes? Quoi qu'il en soit, votreRange
est inutile, vous économisant 2 octets.Coque , 9 octets
Essayez-le en ligne!
Explication
la source
←ġLT
overḞz:∞ø
devrait sauver un octet.Retina ,
8156 octetsEssayez-le en ligne!
-25 octets grâce à @Neil
Transposer du texte rectangulaire dans Retina est étonnamment difficile.
la source
Perl 6 , 27 octets
Essayez-le en ligne!
Après avoir constaté que la version ruby a été votée, j'ai copié l'approche et utilisé des listes de caractères au lieu de chaînes. Je n'aime pas ça
Ma soumission la plus ancienne et la plus correcte est la suivante:
Perl 6 , 38 octets
Split, zip, vérifier l'unicité, rejoindre.
Essayez-le en ligne!
la source
C (gcc) ,
121113110 octetsEssayez-le en ligne!
Ungolfed
-3 grâce à ceilingcat
Cela abuse de la possibilité d'ajouter simplement 1 à un pointeur de chaîne en C pour obtenir la "queue" de la chaîne. Les principaux économiseurs d'octets sont:
d+=x[y[i++]=*(*_)++]++
qui ajoute le premier caractère de la première chaîne de_
toy
, avance la première chaîne de_
pour supprimer son premier caractère, ajoute l'x
entrée correspondant à ce caractèred
et incrémente laditex
entréeq=d?*x:puts(y)
qui imprimey
sid
est non nul tout en fixantq
une valeur non nulle, ouq
non à zéro si le premier élément dex
est différent de zéro (si nous étions à la fin de l’une des chaînes, cet élément serait non zéro)Éditer: les octets rasés en passant de la boucle while à l’appel final récursif et en supprimant les crochets de la boucle for.
la source
for(d=i=0;*_;)
lieu defor(d=0,i=0;*_;++_)
et au*(*_++)++]++;d=d?!*x*f(s)
lieu de*(*_)++]++;d=d?*x?0:f(s)
Pyth, 13 octets
Essayez ici
la source
Rouge , 139 octets
Essayez-le en ligne!
Explication:
Prend l'entrée comme un bloc (liste) de chaînes. Retourne la chaîne enklaction ou
none
sinon.la source
Röda ,
8077 octetsEssayez-le en ligne!
-1 octet grâce au charlatan des vaches
Explication:
Le
try
mot-clé est utilisé pour supprimer les erreurs qui se produisent sii
est supérieure à la longueur de la plus petite chaînea
ou s'il n'y a pas de réponse ethead
provoque une erreur.la source
seq
pour sauvegarder un octetJava 10, 106 octets
Donnera une erreur au lieu de retourner une chaîne vide si aucune solution ne peut être trouvée. L'entrée est une matrice de caractères.
Essayez-le en ligne.
Explication:
la source
Clojure, 59 octets
Retourne une liste de listes de caractères.
la source
APL + WIN,
3533 octets2 octets économisés grâce à Adám
Invite les lignes de texte sous forme de matrice de caractères:
Essayez-le en ligne! Gracieuseté de Dyalog Classic
Explication:
la source
⊂[1]
→,⌿