Contribution
Une chaîne alphanumérique s
.
Sortie
La chaîne la plus courte qui apparaît exactement une fois en tant que sous-chaîne (contiguë) dans s
. Les occurrences qui se chevauchent sont comptées comme distinctes. S'il y a plusieurs candidats de la même longueur, vous devez tous les afficher dans l'ordre d'apparition. Dans ce défi, la chaîne vide se produit n + 1
fois dans une chaîne de longueur n
.
Exemple
Considérez la chaîne
"asdfasdfd"
La chaîne vide y apparaît 10 fois, elle n'est donc pas candidate à une occurrence unique. Chacune des lettres "a"
, "s"
, "d"
et "f"
se produit au moins deux fois, donc ils ne sont pas candidats non plus . Les sous "fa"
- chaînes et "fd"
n'apparaissent qu'une seule fois et dans cet ordre, tandis que toutes les autres sous-chaînes de longueur 2 se produisent deux fois. Ainsi, la sortie correcte est
["fa","fd"]
Règles
Les fonctions et les programmes complets sont autorisés, mais les failles standard ne le sont pas. Le formatage exact de la sortie est flexible, dans des limites raisonnables. En particulier, la production d'aucune sortie pour la chaîne vide est autorisée, mais le lancement d'une erreur ne l'est pas. Le nombre d'octets le plus bas gagne.
Cas de test
"" -> [""]
"abcaa" -> ["b","c"]
"rererere" -> ["ererer"]
"asdfasdfd" -> ["fa","fd"]
"ffffhhhhfffffhhhhhfffhhh" -> ["hffff","fffff","hhhhh","hfffh"]
"asdfdfasddfdfaddsasadsasadsddsddfdsasdf" -> ["fas","fad","add","fds"]
Classement
Voici le classement par langue que j'ai promis.
Pour vous assurer que votre réponse s'affiche, veuillez commencer votre réponse avec un titre, en utilisant le modèle Markdown suivant:
# Language Name, N bytes
où N
est la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les barrant. Par exemple:
# Ruby, <s>104</s> <s>101</s> 96 bytes
<script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>site = 'meta.codegolf',postID = 5314,isAnswer = true,QUESTION_ID = 45056;jQuery(function(){var u='https://api.stackexchange.com/2.2/';if(isAnswer)u+='answers/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJeRCD';else u+='questions/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJO6t)';jQuery.get(u,function(b){function d(s){return jQuery('<textarea>').html(s).text()};function r(l){return new RegExp('<pre class="snippet-code-'+l+'\\b[^>]*><code>([\\s\\S]*?)<\\/code><\/pre>')};b=b.items[0].body;var j=r('js').exec(b),c=r('css').exec(b),h=r('html').exec(b);if(c!==null)jQuery('head').append(jQuery('<style>').text(d(c[1])));if (h!==null)jQuery('body').append(d(h[1]));if(j!==null)jQuery('body').append(jQuery('<script>').text(d(j[1])))})})</script>
Réponses:
Pyth,
2726 octetsEssayez-le ici.
Notez qu'en raison d'un bogue dans le compilateur en ligne, le cas de chaîne vide ne fonctionne correctement que sur la version en ligne de commande, qui peut être trouvée ici.
Vous pouvez également corriger le bogue en donnant une nouvelle ligne comme entrée pour le compilateur en ligne.
Explication:
la source
z
aucune entrée n'échoue en ligne, c'est donc définitivement un bug dans l'interpréteur.Python 3,
124123111 11196 octetsRecherche des chaînes telles que la première occurrence de gauche est la même que la première occurrence de droite. Le
+1
dans lerange
est destiné à accueillir le boîtier de chaîne vide.Maintenant, si seulement Python avait un
.count()
qui comptait les correspondances qui se chevauchaient , cela aurait été un peu plus court.la source
Mathematica,
959479 octetsStringCases
récupère toutes les sous-chaînes possibles, filtreTally
etCases
filtre celles qui apparaissent plus d'une fois etMinimalBy
trouve celles qui sont les plus courtes.la source
&
à la fin du code?GolfScript, 44 octets
Prend les entrées sous forme de chaîne sur stdin et les sorties dans une syntaxe à double tableau: par exemple
[["b"] ["c"]]
. Démo en ligneDissection
Ceci est organisé de telle sorte qu'aucun cas spécial n'est requis pour la chaîne vide (que j'ai inclus comme cas de test dans la démo en ligne liée ci-dessus).
la source
CJam,
52 4340 octetsL'entrée est la chaîne sans guillemets
Explication :
Exemple:
Sortie
Essayez-le en ligne ici
la source
Scala, 120 octets
J'ai commencé avec 140 qui s'inscrit au moins déjà dans un tweet.
la source
(_)
comme identité au lieu del=>l
?list.groupBy(_)
c'est la même chose quex => list.groupBy(x)
. Je ne sais pas pourquoi ils l'ont implémenté comme ça.JavaScript (ES6), 109
110Modifiez la recherche au lieu de indexOf, car la chaîne d'entrée est alphanumérique. Merci @IsmaelMiguel
Fonction récursive, recherche de sous-chaînes commençant par la longueur 1 et remontant.
Non golfé et expliqué
Test dans la console FireFox / FireBug
Sortie
la source
.search
au lieu de.indexOf
et vous économisez 2 octets.s.indexOf(a)+1
). Même s'il est vrai que cela ne fonctionnera pas avec ces caractères, vous n'avez pas à vous inquiéter! Citant l'OP: "Input: An alphanumeric string s.
"Java, 168
176 233Voici un exemple de boucle imbriquée assez basique.
Ou un peu plus lisible:
la source
+++
pour montrer si c'est+ ++
ou++ +
aiderait ... Et si vous voulez économiser quelques octets de plus, il pourrait y avoir un moyen de le faire en initialisantq=1
, en remplaçantq++
parq=t
et en remplaçantl++<t&q<1
par quelque chose commet>l+=q
. Nécessite probablement de modifier un ou deux autres décalages pour le faire fonctionner.+++
. J'ai essayé de le peaufiner (surtoutq
, ce qui semble un peu inutile), mais je n'ai encore rien trouvé de solide.+++
résout toujours à++ +
.Haskell,
169162155153151 151138120115Pour l'utiliser:
Qui donne:
Btw. Je déteste la dernière ligne de mon code (répétition deh y
). Quelqu'un suggère de s'en débarrasser?la source
g y=q(minimum.(map l)$y)$y
(les parenthèses sont-ellesmap l
vraiment nécessaires?) Et ensuitef=g.concat.q 1.group.sort.concatMap inits.tails
?>>=
au lieu deconcatMap
, c'est à diref x=p$concat$q 1$group$sort$(tails x>>=inits)
enregistre 2 octets. Pourquoi l'Data.Ord
import?q
sont inutiles, car vous pouvez écrirefilter$(==)k.l
, tout comme le dernier$
et les espaces avant ley
s dansp
. Vous pouvez également supprimer les points-virgules après les importations (Data.Ord
semble en effet inutile).$
suivi d'un non-espace. Il se rasera de quelques octets, mais est-ce dans la spécification de langue?J,
61584442403837 octetsVoici une version divisée en composants individuels de la solution:
x #/. y
calcule pour chaque élément distinctx
la fréquence à laquelle se produit dansy
. Si nous utilisons cela commey #/. y
, nous obtenons le pour chaque élément distinct dansy
son décompte. Par exemple,a #/. a
pour lesa =. 1 2 2 3 4 4
rendements1 2 1 2
.1 = y
vérifie quels éléments dey
sont égaux1
. Par exemple, les1 = a #/. a
rendements1 0 1 0
.u~
est le réflexe d'un verbe monadiqueu
. C'est,u~ y
est le même quey u y
. Ainsi,#/.~ y
est le même que#/.~ y
. Appliqué à un verbe dyadique,u~
est le passif deu
. Autrement dit,x u~ y
est le même quey u x
. Ceux-ci sont utilisés dans de nombreux autres endroits que je ne mentionne pas explicitement.~. y
est le nœud dey
, un vecteur dont les doublons ont été supprimés. Par exemple, les~. a
rendements1 2 3 4
.x # y
( copier ) sélectionne parmiy
les éléments aux indices oùx
contient a1
.(1 = y #/. y) # (~. y)
crée un vecteur dont les élémentsy
n'apparaissent qu'une seule fois. En notation tacite, ce verbe s'écrit~. #~ 1 = #/.~
; appelons cette phraseunqs
pour le reste de l'explication.x ]\ y
crée un tableaux
par1 + y - x
de tous les infixes du vecteury
de longueurx
. Par exemple,3 ]\ 'asdfasdfd
rendements# y
est le décompte dey
, qui est, le nombre d'élémentsy
.u\ y
s'appliqueu
à chaque préfixe dey
. Incidemment,#\ y
crée un vecteur d'entiers de1
à#y
.< y
mety
dans une boîte. Cela est nécessaire car les tableaux ne peuvent pas être irréguliers et nous calculons un tableau de suffixes de différentes longueurs; un tableau encadré compte comme un scalaire.Ainsi,
(i. # y) <@:unqs@(]\) y
génère un vecteur de#y
tableaux encadrés de la longueur k (pour tous les 0 ≤ k <#y
) infixes de y qui se produisent exactement une fois. La forme tacite de ce verbe esti.@# <@unqs@(]\) ]
oui.@# <@(~. #~ 1 = #/.~)@(]\) ]
si nous n'utilisons pas leunqs
nom. Appelons cette phraseallsbsq
pour le reste de cette explication. Par exemple,allsbsq 'asdfasdfd'
donne:(#@> y) # y
prend du vecteur de tableaux en boîtey
ceux qui ne sont pas vides.{. y
prend le premier élément du vecteury
.> y
supprime la boîte dey
.> {. (#@> y) # y
donne le premier tableau non vide non mis en boîte à partir du vecteur de tableaux mis en boîtey
. Cette phrase est écrite>@{.@(#~ #@>)
en notation tacite.Enfin,
[: >@{.@(#~ #@>) allsbsq
assemble la phrase précédente avecallsbsq
pour créer une solution au problème que nous avons. Voici la phrase complète avec des espaces:la source
Haskell, 135 octets
la source
PHP,
171152134125http://3v4l.org/RaWTN
la source
$j=0
. A venir, vous avezsubstr($s,$j++,$i)
. Sans définir$j
, vous pouvez réécrire celasubstr($s,0+$j++,$i)
et vous enregistrez 2 octets. Pourquoi donc? Eh bien, la première fois, ce$j
seranull
. Et vous passerez effectivementnull
àsubstr
, ce qui, je pense, ne fonctionnera pas bien. L'utilisation0+$j++
convertira le fichiernull
en0
. Si vous voyez que ce n'est pas nécessaire, allez-y sans et retirez simplement la$j=0
pièce.$j
n'est donc pas effacé et réinitialisé pour chaque itération de lawhile()
boucle. Ainsi, même si elle est nulle (et donc convertie0
par un$j++
appel) la première fois, lors des futures itérations de la boucle externe, elle reste à la valeur qu'elle était auparavant. Ce n'est pas tant l'initialisation que la réinitialisation. Merci pour cette suggestion :-)function f($s){$l=strlen($s);while(!$a&&++$i<$l)for($j=0;$j<$l;)($b=substr($s,$j++,$i))&(strpos($s,$b)==strrpos($s,$b)&&($a[]=$b));return$a;}
Changements: Supprimé TOUS vos||1
, utilisé le bitwise&
(AND
) au lieu d'&&
un endroit, déplacé la$j<$l&&[...]
partie en dehors defor
(économiser 2 octets) et supprimé certaines parenthèses inutiles.function f($s){$l=strlen($s);while(!$a&&++$i<$l)for($j=0;$j<$l;)strpos($s,$b=substr($s,$j++,$i))==strrpos($s,$b)&&($a[]=$b);return$a;}
Modifications apportées au code précédent: déplacé le$b=substr($s,$j++,$i)
dans lestrpos($s,$b)
fairestrpos($s,$b=substr($s,$j++,$i))
, supprimé les parenthèses plus inutiles et supprimé les inutiles&
.substr($s,$j++,$i)
retourne""
quand$j
atteint la longueur de la chaîne, etfalse
par la suite, de sorte que l'affectation peut également servir de rupture conditionnelle de boucle. Ensuite, il ne reste plus qu'une seule utilisation$l
, ce qui peut également être consolidé.Groovy (regex Java sur implémentation Oracle), 124
Testé sur Groovy 2.4 + Oracle JRE 1.7. L'expression régulière devrait fonctionner pour Java 6 à Java 8, car le bogue qui permet au code ci-dessus de fonctionner n'est pas corrigé. Pas sûr pour la version précédente, car il y a un bogue dans Java 5 qui a été corrigé dans Java 6.
L'expression régulière trouve la chaîne la plus courte qui n'a pas de sous-chaîne en double ailleurs, à chaque position de la chaîne d'entrée. Le code extérieur prend en charge le filtrage.
(?=...)
.(.*?)
recherche à partir de la sous-chaîne la plus courte(?=(.*))
capture le reste de la chaîne pour marquer la position actuelle.(?<=^(?!.*\1(?!\2$)).*)
est une émulation de look-back de longueur variable, qui tire parti du bogue d'implémentation qui permet(?<=.*)
de passer le contrôle de longueur.(?!.*\1(?!\2$))
vérifie simplement que vous ne pouvez pas trouver la même sous-chaîne ailleurs. Le(?!\2$)
rejette la position d'origine où la sous-chaîne est mise en correspondance.La limite de la construction de contour externe ne s'applique pas à la construction de contour imbriquée. Par conséquent, l'anticipation négative imbriquée
(?!.*\1(?!\2$))
vérifie en fait la chaîne entière, et pas seulement jusqu'à la limite droite de l'observation.la source
Rebol, 136 octets
Non golfé:
Exemple d'utilisation:
NB. Je suppose que le cœur du code est le fonctionnement de la
find
pièce. J'espère que cela vous aidera à expliquer ...la source
Haskell, 119
la source
q = length
quelque part et utiliserq
, rase quelques octetsBrachylog , 10 octets
Essayez-le en ligne!
Bien que
ᵍ
ne trie pas naturellement en fonction de la valeur par laquelle il est groupé, au lieu de classer les groupes par la première occurrence de chaque valeur, les premières occurrences de chaque longueur sont décroissantes. Je ne suis pas sûr à 100% que le filtrage d'unicité ne puisse pas gâcher cela, mais je n'ai pas encore trouvé de cas de test qui échoue encore.la source
05AB1E , 10 octets
N'affiche rien pour une chaîne vide.
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
Cela profite du fait que 05AB1E n'a
1
que la valeur véridique, et tout le reste comme falsey. La sous-chaîne unique la plus courte est toujours garantie de se produire exactement une fois pour toutes les chaînes d'entrée possibles. (Pour une chaîne d'entrée contenant uniquement les mêmes caractères (c.-à-d.aaaaa
), Les chaînes d'entrée elles-mêmes en tant que sous-chaîne ne se produisent qu'une seule fois, donc le résultat est["aaaaa"]
. Pour une chaîne d'entrée avec un motif répétitif (c.-à-d."abcabc"
), Il existe encore des sous-chaînes uniques qui ne se produire une fois (["abca","abcab","abcabc","bca","bcab","bcabc","ca","cab","cabc"]
), donc cela se traduira par["ca"]
.)la source
Python 2, 150
la source
""
, mais vous n'imprimez rien.Perl 5
-a
,11487 octetsEssayez-le en ligne!
Ancienne méthode: 114 octets
la source