Objectif:
Étant donné un tableau de chaînes, créez des versions abrégées de chaque chaîne.
Spécification:
Pour ce défi, une abréviation correspond aux N premiers caractères d'une chaîne. Pour la chaîne abc
: a
, ab
et abc
sont toutes les abréviations valides, alors que bc
, et ac
ne sont pas.
Étant donné un tableau de chaînes, nous voulons trouver l'ensemble d'abréviations le plus court, de sorte que, compte tenu de l'entrée et de toute abréviation, vous puissiez déterminer à quel élément de l'entrée à laquelle l'abréviation faisait référence.
Exemple:
Contribution: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]
Nous travaillons notre chemin à travers les cordes en commençant par la première.
Lundi est uniquement la chaîne d'élément avec un
M
, donc l'abréviation la plus courte possible estM
.Mardi commence par
T
, mais jeudi aussi. Cela signifie que nous essayons la chaîneTU
. Comme aucune autre chaîne ne commence par cela, nous l'utilisonsTU
.Mercredi est
W
, jeudi estTh
et vendredi estF
.
Plus d'exemples:
Input: "one,two,three,four,five,six,seven"
Output: "o,tw,th,fo,fi,si,se"
Input: "red,orange,yellow,green,blue,purple"
Output: "r,o,y,g,b,p"
Input: "a,ab,abc"
Output: Not valid! No abbreviation for `a` that doesn't apply to the other items.
Remarques:
Vous effectuez des entrées et des sorties d'une manière raisonnable.
Vous pouvez supposer que l'entrée sera toujours un tableau valide de chaînes.
Vous pouvez supposer qu'il y aura toujours une solution, contrairement au dernier cas de test.
Les chaînes seront uniquement constituées de caractères ASCII imprimables (ou des caractères imprimables de votre codage)
C'est du golf de code, donc moins d'octets gagnent!
U
pour mardi, mais une minusculeh
pour jeudi.Réponses:
Rétine , 29 octets
L'entrée et la sortie sont des listes de chaînes séparées par des sauts de ligne.
Essayez-le en ligne! (Suite de tests avec séparation par des virgules pour plus de commodité.)
Explication
Cela correspond simplement à tous les préfixes avec une seule expression régulière et les affiche (
!
).m
ets
sont les modificateurs d'expression régulière habituels pour faire des^
débuts de ligne de.
correspondance et des sauts de ligne de correspondance.la source
Python 2 ,
8786 octetsEssayez-le en ligne!
la source
lambda a:[[b[:i]for i in range(len(b))if sum(s[:i]==b[:i]for s in a)<2][0]for b in a]
pour 85 octetslen(b)
par4**8
enregistre 2 octets supplémentaires, en supposant que les chaînes ne dépasseront pas 65 536 caractèresJavaScript (ES6),
81787470 octetsPrend l'entrée comme un tableau de chaînes.
Formaté et commenté
Cas de test
Afficher l'extrait de code
la source
reduce
.Gelée , 14 octets
Essayez-le en ligne!
Comment ça marche
la source
Haskell , 48 octets
Essayez-le en ligne!
f
est la fonction principale, prenant une liste deString
s et renvoyant aString
. Sa définition est un raccourci monadique pourf a=map (a#) a
.a#x
examine la chaînex
et la listea
et essaie de trouver le préfixe le plus courtx
qui est unique dansa
. Sia
a un seul élément, utilisez simplement la chaîne vide. S'ila
n'y a pas déjà un seul élément, coupez le premier caractère dex
, filtrez et coupez les éléments dea
départ avec le même caractère, puis récursivement.la source
Mathematica, 64 octets
la source
Gelée ,
1412 octetsEssayez-le en ligne!
Comment ça marche
la source
C ++ 11 (MinGW), 198 octets
Appeler avec:
L'ajout d'un
void
identifiant avant la fonction devrait également la faire compiler sur d'autres compilateurs, ajoutant ainsi 5 octets à la longueur.la source
void f...
, ça ne marche pas autrement ... + 5 octets, malheureusement. Pour autant que je sache, les fonctions ont besoin de spécificateurs de type en C ++Javascript ES6, 70 caractères
la source
PHP,
131 120 119118 octetsMerci @ Jörg pour
preg_grep
.prend l'entrée des arguments de la ligne de commande; imprime les résultats une ligne chacun.
Courez avec
-nr
ou essayez-le en ligne .-
.+15 octets à corriger: remplacez le second
$argv
pararray_slice($argv,1)
.a&
par""<
(+1 octet) pour corriger.insérez
&($t.=$c)
avant&&
et remplacez". preg_quote($t.=$c)."
par$t
.panne
version non regex,
131130 octetsRemplacez le premier et le dernier
a&
par""<
(+2 octets) pour corriger pour PHP 7.1.panne
note complètement inintéressante:
strstr($u,$t)==$u
et0===strpos($u,$t)
ont la même longueur et le même résultat.la source
0x0A
) au lieu de\n
, cela économisera un octet;).PHP, 127 octets
ne fonctionne pas avec des tableaux invalides
PHP, 132 octets
Version en ligne
151 octets prennent en charge les caractères spéciaux
PHP, 140 octets
la source
preg_quote
Make only 10 Bytes more0
. Mais vous pouvez enregistrer un octet avec$i=+$s=""
.count()-count()
truc: l'entrée est garantie d'être valide (-21 octets). Je pense que je pourrais réparer et jouer au golf jusqu'à 120 octets.$_GET
était une bonne idée!Clojure, 118 octets
Cela fonctionne sur les préfixes jusqu'à la longueur de
1e2
mais le même nombre d'octets peut prendre en charge jusqu'à1e9
.i
boucles longueurs de préfixes,S
est la séquence de sous-chaînes de longueuri
. Le dernierfor
remplace les sous-chaînes avecnil
lesquelles se produisent plus d'une fois. La réduction conserve la première valeur non nulle pour chaque chaîne, dommage qu'elleor
ne soit pas une fonction, j'ai donc dû la boucler.Cela renvoie en fait des listes de listes de personnages comme
((\M) (\T \u) (\W) (\T \h) (\F))
, mais je suppose que c'est acceptable. Clojure est assez verbeux avec des cordes, etsubs
lanceraitStringIndexOutOfBoundsException
contrairementtake
.Exemples complets:
la source
SQL (version PostgreSQL 9.4), 219 octets
Maintenant, pour la réponse la plus longue :) Je ne pense pas que cela puisse même battre Java. Je vais essayer d'en raser un peu plus. En espérant me débarrasser de l'une des requêtes imbriquées, mais je n'aime pas mes chances.
Cela suppose qu'il existe une table contenant les chaînes sur lesquelles travailler. Comme il s'agit de SQL, l'ordre de retour n'est pas garanti identique à l'ordre de la table et, dans ce cas, peu probable. Si c'est un problème, je supprimerai.
Explication de SQL Fiddle
La requête la plus interne utilise
generate_series
et uneLATERAL
jointure pour créer des lignes pour la chaîne divisée en longueurs croissantes, donc «un» devient «o», «on», «un». Le nombre de caractères dans le retour est également conservé.Ensuite, nous ajoutons le nombre d'enregistrements qui ont le même résultat. Par exemple, «f» de quatre et cinq en a 2, mais «fo» et «fi» en ont chacun un. L'
OVER
instruction en SQL peut être assez puissante.COUNT(*)
serait la manière habituelle, maisSUM(1)
donne le même résultat.Ensuite, nous classons les résultats pour chaque entrée en fonction du moins de répétitions et de caractères.
ROW_NUMBER
fonctionnerait ici aussi, mais est plus long.Enfin, nous sélectionnons le numéro de rang le plus bas pour chaque mot.
la source
Pure Bash , 146 octets
Essayez-le en ligne!
la source
APL (Dyalog) , 27 octets
Essayez-le en ligne!
{
une fonction anonyme, où ⍵ représente l'argument ...∘.(
une table de fonction où la fonction est⊃
le premier élément de⍷
la liste booléenne "l'argument gauche commence ici dans l'argument droit?")
où sont les bons arguments⍵
les arguments(
et l'argument de gauche est↑
une table avec des rangées,/
préfixes de¨
chacun des⍵
les arguments+/
somme à travers (compte le nombre d'arguments commençant par ce préfixe)↓
diviser le tableau en liste de lignes⍳⍨¨
dans chacun, trouver l'emplacement du premier1
un (c'est-à-dire le premier préfixe qui ne dirige qu'un seul argument)↑¨⍨
pour chaque emplacement, prend autant de caractères de l'élément correspondant de⍵
l'argument}
fin de la fonction anonymela source
PowerShell,
151139 octetsIntéressé s'il y a une meilleure façon de le faire. J'ai dû utiliser un
foreach
(sur un|%
) pour pouvoir effectuer unbreak
dans la boucle imbriquée sans l'étiqueter.Edit: 2 golfs d'AdmBorkBork
la source
-notin
place de-not$x.contains($a)
et!($w...
au lieu de-not($w...
sauvegarder quelques octets, oui?APL, 26 octets
Explication:
↓↑⍵
: remplir chaque chaîne⍵
pour qu'elle corresponde à la longueur de la plus longue chaîne∘.(
...)⍨
: pour chaque paire de chaînes possible, recherchez le préfixe partagé:≢
: inégalité de tableau∧
: et=
: égalité par élément∧\
: and-scan (conserver uniquement les correspondances principales)+/¨
: additionne chaque vecteur du tableau, donnant la longueur des préfixes partagés⌈/
: trouver la valeur maximale dans chaque colonne1+
: ajoutez-en un, en donnant le nombre de caractères nécessaires pour garder chaque chaîne unique⍵↑¨⍨
: prendre autant de caractères de chaque chaîneTester:
la source
Q, 93 octets
Résolu récursivement, prend la chaîne en entrée, obtient les n premiers éléments de chaque chaîne à chaque récursivité. Si l'un de ces éléments n'est pas unique, il les remplace par les premiers n + 1 éléments.
la source