Pour ce défi, vous devez implémenter le Abbrev
module Ruby dans le moins de code possible.
Défi
L'entrée sera tout ce que votre langue a comme un tableau (tableau, liste, séquence, etc.) de chaînes. Vous pouvez écrire une fonction ou accepter des mots séparés par des virgules sur STDIN.
Vous devez ensuite calculer l'ensemble de préfixes non ambigus pour ces chaînes. Cela signifie que vous devez renvoyer un hachage (ou une carte, un objet, etc.) d'abréviations à leurs chaînes d'origine.
Un "préfixe" est une sous-chaîne de la chaîne d'origine commençant au début de la chaîne. Par exemple, "pref" est un préfixe du mot "prefix".
Un préfixe non ambigu est celui qui ne peut signifier qu'un seul mot. Par exemple, si votre entrée est
car,cat
, ceca
n'est pas un préfixe sans ambiguïté, car cela pourrait signifier «voiture» ou «chat».L'exception à cette règle est qu'un mot est toujours un préfixe de lui-même. Par exemple, si vous avez une entrée telle que
car,carpet
,car:car
doit être dans votre sortie.
Vous pouvez ensuite renvoyer le hachage / map / objet / etc. à partir de votre fonction (ou faites l'équivalent dans votre langue), ou imprimez-le par
key:value
paire sous STDOUT sous la forme def:foo,fo:foo,...
. (Les paires clé-valeur peuvent également être séparées par des espaces si cela raccourcit votre code.)
Cas de test
Input code,golf,going
Output c:code,co:code,cod:code,code:code,gol:golf,golf:golf,goi:going,goin:going,going:going
Input pie
Output p:pie,pi:pie,pie:pie
Input pie,pier,pierre
Output pie:pie,pier:pier,pierr:pierre,pierre:pierre
Input a,dog
Output a:a,d:dog,do:dog,dog:dog
Règles
L'entrée ne contiendra pas d'éléments en double.
Votre sortie peut être dans n'importe quel ordre; vous n'avez pas à le trier.
Vous ne pouvez pas utiliser un
Abbrev
module / fonction / chose intégré comme Ruby.Il s'agit de code-golf , donc le code le plus court en octets gagnera!
key:value\nkey:value\nkey:value
...?Réponses:
APL (46)
(Oui, le jeu de caractères APL tient dans un octet, avec de la place à revendre.)
Il s'agit d'une fonction qui prend une liste de chaînes et renvoie une matrice 2 par N, où chaque ligne contient un préfixe non ambigu et le mot auquel elle appartient:
Explication:
∆←⍵
: stocke le bon argument dans∆
.{↑∘⍵¨⍳⍴⍵}¨∆
: pour chaque élément de∆
, obtenez les préfixes possibles de cet élément:⍳⍴⍵
: obtenir une liste de1
la longueur de⍵
↑∘⍵¨
: pour chacun de ces nombres, obtenez autant d'éléments⍵
.∪⊃,/
: concaténer les listes ensemble et prendre les valeurs uniques.{
...}¨
: pour chacun des préfixes uniques:∆/⍨⊃¨⍵∘⍷¨∆
: sélectionnez les mots qui commencent par ce préfixe(⊂⍵),
: place également le préfixe et concatène∆/⍨2=⍴∆←
: ne renvoie la liste que s'il y a deux éléments (le préfixe et un mot correspondant)↑
: transformer la liste des tuples en matricela source
Python 2,7 -
146141 octetsNotez que l'indentation sur les lignes 4 et 5 n'est pas 4 espaces, c'est un effet secondaire de l'interpréteur de démarque de SE. C'est un caractère de tabulation littéral, donc un seul octet.
Ce n'est pas techniquement conforme, mais je vais le changer si Doorknob clarifie. Il utilise des sauts de ligne au lieu de virgules pour séparer la sortie. Par exemple:
Nouveau: j'ai pu me débarrasser de 5 caractères en affectant la chaîne que je vérifie à une variable
e
. Cela signifie que je n'ai qu'à tapere
au lieu dew[:a]
trois fois. Cela signifie également que je sauvegarde des personnages en faisante=w[:a+1]
et en changeant...range(1,len(w)+1)
enrange(len(w))
.Explication:
la source
sum(b.startswith(e) for b in l)
place delen(filter(lambda b:b.startswith(e),l))
b.startswith(e)
enb.find(e)==0
oub[:a+1]==e
, et vérifier<2
le nombre au lieu de==1
.e=""\n for a in w:\n\te+=a
for a in range(len(w)):\n\te=w[:a+1]
J - 47 car
J considère les chaînes comme de simples vecteurs de caractères, ce qui signifie que lorsqu'il essaie de faire une liste de chaînes, il finit par créer un tableau de caractères, de sorte que les extrémités sont remplies d'espaces. La solution de J à cela s'appelle la boîte , donc cette fonction prend comme argument une liste encadrée de chaînes, afin de conserver la longueur.
De plus, il manque un type de hachage à J, donc le plus proche de lui est un tableau d'éléments à deux colonnes, par exemple des chaînes encadrées. Si cela est inacceptable et que je dois utiliser par défaut le formulaire de valeur-clé, je peux reformater la sortie de ce formulaire en 67 caractères au total:
Explication par explosion:
Exemples:
la source
Haskell
9687Version non golfée:
Exemple:
J'ai utilisé la
inits
fonction, qui trouve tous les préfixes d'une liste / chaîne. Est-ce que ça compte comme de la triche?la source
concatMap
par(=<<)
, qui se trouve dans le Prélude. Vous enregistre 10 caractères.concatMap
mais je ne peux pas enregistrer plus de 9 caractères.>>=\
comme un lexème unique. Désolé pour ça ...Python 3 (97)
Nous parcourons les préfixes de chaque mot dans l'entrée, en imprimant la paire préfixe / mot correspondante si elle apparaît exactement une fois ou si elle correspond au mot entier. Nous profitons du comportement de court-circuit de
or
(etprint
étant une fonction) pour imprimer uniquement si l'une de ces conditions est remplie.La
while
boucle coupe à plusieurs reprises le dernier caractère pour créer des préfixes de plus en plus courts, se terminant lorsque la chaîne vide reste. C'est la seule fois où nous indexons ou découpons quelque chose.Nous comptons les occurrences du préfixe
e
dans l'entrée en recherchant les sous-chaînesS
dans la chaîne d' entrée séparée par des virgules d'origine','+e
. Nous ajoutons au préalable une virgule à la chaîne d'entrée. Cet ajout provoque un élément de chaîne vide supplémentaire lorsque noussplit
, mais cela n'a aucun effet car il n'a pas de sous-chaînes non vides.Pour vérifier le cas où la sous
e
- chaîne est le mot entierw
, nous les comparons en utilisant l'opérateur de comparaison de chaînes. Cela compare lexicographiquement, donc les préfixes plus courts sont plus petits. La double comparaison échoue si l'une==w
ou l' autreS.count(c+e)<2
.Si l'impression des sorties dans le formulaire
e,w
était autorisée, je sauverais un caractère en écrivant à lae+c+w
place.Crédit undergroundmonorail de dont la réponse que je fondé ma structure de code globale.
la source
(e<w)*S.count(c+e)>1
peut être jouée<w<w*S.count(c+e)
pour enregistrer 2 caractères.Rubis, 114
Non golfé:
la source
k4 (70)
pas particulièrement golfé; je suis sûr que ça pourrait être plus court
assez similaire au J impl. ci-dessus, je pense - recueille simplement tous les préfixes (appropriés), supprime à nouveau les mots des préfixes (pour gérer le cas
"car"
/"carpet"
), les regroupe en classes d'équivalence, sélectionne les classes avec un seul élément, les réduit des listes à chaînes et ajoute dans la carte des chaînes à eux-mêmes.quelques cas de test
notez que dans
k
/q
, une chaîne est une liste de caractères, donc une chaîne ne contenant qu'un seul caractère doit être marquée comme telle en utilisant la,
fonction unaire ; & mmwrt une liste de chaînes ne contenant qu'une seule chaîneceux-ci utilisent
q
lashow
fonction, qui a un formatage intégré pour certaines structures de données, pour rendre les résultats plus lisibles:la source
JavaScript - 212
Golf initial.
Contribution:
code,golf,going
Production:
["c:code", "co:code", "cod:code", "code:code", "gol:golf", "golf:golf", "goi:going", "goin:going", "going:going"]
la source
Perl,
9377Avec des nouvelles lignes et un retrait pour la lisibilité:
Un peu trop tard et trop long, mais je suis content qu'il soit finalement passé en dessous de 100. La fonction renvoie une liste qui peut être affectée à la variable de hachage:
et
En fait, la liste retournée n'est pas encore filtrée - la construction du hachage est terminée au moment de son affectation, c'est-à-dire la fonction extérieure. SI ce n'est pas propre / assez juste, ajoutez 3 pour compter et mettez le contenu de la fonction entre accolades, en ajoutant
+
- puis la fonction renvoie la référence de hachage «vraie».la source
Q: 44 octets
REMARQUES
Le langage Q a un noyau interne nommé en interne K4 (utilisé dans cette réponse et une autre réponse précédemment à cette question)
Pour tester le code, téléchargez l'interprète (kx.com, gratuit pour une utilisation non commerciale, prise en charge de Windows, Linux, Mac)
L'interprète admet deux syntaxes:
verbeux (noms plus lisibles, noms distincts pour les mœurs et les diades, plus de bibliothèques, ...). Charger le fichier source avec l'extension q ou un interpréteur interactif
compact (noyau interne fonctionnel, opérateurs à une lettre, même lettre pour les deux utilisations monad / diad, ...). Charger le fichier source avec l'extension k, ou un interpréteur interactif en mode k (écrire \ à l'invite). Le code doit être testé dans ce mode
Le code définit un lambda (fonction anonyme). Pour donner un nom à la fonction, nous avons besoin du nom du préfixe: (ex f: {..}), donc nécessite 46 octets
TESTER
(en supposant la fonction nommée: sinon remplacez f par le code)
renvoie un dictionnaire (clés de syntaxe! valeurs). Les clés sont une liste de symboles (`symb`symb ..), et les valeurs une liste de liste de symboles. Si nous exécutons le sentente à l'interpréteur interactif, nous avons une présentation plus pratique (chaque clé et valeurs associées sur une ligne différente)
EXPLICATION
x
est l'argument implicite du lambda$x
convertir la liste des symboles en liste de chaînes(-1_)\
itère sur chaque élément de la liste des symboles(se lit comme pour chaque chaîne calcule les préfixes (à l'itération de manger supprime le dernier caractère de la chaîne (-1_), jusqu'à la chaîne vide)
$
se transforme à nouveau en liste de symboles (liste de tous les préfixes)p:
et attribue à p,/
tout raser (concatène et crée une structure à un niveau)=
classer -> pour chaque préfixe unique, associe les mots correspondants#:'
calcule la longueur (nombre de mots associés à chaque préfixe)1=
vrai si longueur = 1 (sans ambiguïté), faux sinon&
où -> index des vrais élémentsp in\:
détermine pour tous les préfixes s'ils sont dans un préfixe non ambigu(..)'
applique (..) à chaque valeur à droite (préfixe non ambigu)?0,&:
-> distinct 0 concaténé où (faire face aux mots comme préfixe de lui-même)p@
transformer des index en symbolesx!..
construire un dictionnaire avec x (mots) comme clés et .. comme valeursLire comme:
Construisez et retournez un dictionnaire avec les mots comme clés et les valeurs.
... valeurs d'index à des positions distinctes 0 (tous les mots) et où préfixe sans ambiguïté
... sans ambiguïté calculé comme des préfixes qui n'apparaissent qu'à un seul mot (la liste de mots associée à chaque symbole a une longueur d'un)
... listes résultant de la classification de tous les symboles uniques avec les mots correspondants
... préfixes calculés en répétant drop dernier caractère de chaque mot
la source
PHP 7.0, 67 octets (postdate le défi)
prend l'entrée des arguments de la ligne de commande; imprime une virgule de fin; courir avec
-nr
.pour les PHP plus récents , ajoutez un octet: remplacez
&a
par""<
.pour les anciens PHP, utilisez ces 70 octets:
PHP, 70 octets
la source
Brachylog , 23 octets
Essayez-le en ligne!
Prend l'entrée sous forme de liste via la variable d'entrée et génère une liste de
[key, value]
paires via la variable de sortie. Toute chaîne d'entrée qui n'est pas le préfixe d'une autre chaîne d'entrée sera générée en tant que préfixe d'elle-même deux fois, bien que l'en-tête sur TIO le masque en utilisantᵘ
pour obtenir la liste complète au lieu deᶠ
.la source
{}ᵘ
, sauf s'il existe un moyen plus court d'exclure quelque chose sous forme de préfixe ou de générer chaque paire de sortie nécessaire sans la règle supplémentaire∋gj
.Perl 5
-a
, 76 octetsEssayez-le en ligne!
la source
APL (Dyalog Classic) , 38 octets
remercie Erik l'Outgolfer de me rappeler d'utiliser un codage de caractères à un octet
Essayez-le en ligne!
la source
Python (127)
Je n'ai donc pas pu commenter @undergroundmonorail, mais je pensais qu'il serait préférable d'adopter une approche par dictionnaire? Je suis sûr qu'avec une certaine compréhension de la liste / du dictionnaire, cela pourrait aussi être considérablement réduit, mais je ne peux pas le faire fonctionner en sautant du dict.
L'impression sortira le dictionnaire, non ordonné.
EDIT: Ahh j'ai raté la voiture: voiture / voiture: critères tapis. Peut-être un contrôle de longueur?
la source
Groovy - 212 caractères
Golfé:
exemple de sortie:
Non golfé:
la source
JavaScript (Node.js) , 88 octets
Essayez-le en ligne!
la source
Zsh , 95 octets
Essayez-le en ligne!
La seule façon de "renvoyer" un tableau associatif dans Bash / Zsh est de le déclarer sans le
local
mot - clé, puis d'y accéder dans la portée parent. Cela permettrait d'économiser un octet. Cependant, les E / S via des variables sont généralement mal vues, nous imprimons donc la définition du tableau à la place.la source
Rubis , 84 octets
Je viens de remarquer qu'il existe déjà une solution Ruby existante, eh bien. Cela améliore fondamentalement l'ancienne solution en sélectionnant les préfixes de manière plus intelligente (éliminant la nécessité d'ajouter chaque mot en tant que "préfixe" à la fin) et en comptant les préfixes pour vérifier l'unicité avant de les ajouter au hachage, au lieu de remplacer la valeur par un mannequin s'il y a un doublon, puis effacer l'entrée.
Essayez-le en ligne!
la source