Étant donné (sur STDIN, en tant qu'arguments de ligne de commande ou arguments de fonction) deux chaînes distinctes non vides, recherchez et renvoyez la sous-chaîne la plus courte de la première chaîne qui n'est pas une sous-chaîne de la seconde. Si une telle sous-chaîne n'existe pas, vous pouvez renvoyer la chaîne vide, renvoyer toute chaîne qui n'est pas une sous-chaîne de la chaîne d'origine ou lever une exception. Si vous revenez d'une fonction, vous pouvez également retourner null (ou non défini, Aucun, etc.) dans ce cas. Si plusieurs de ces sous-chaînes sont liées pour la plus courte, vous pouvez renvoyer l'une d'entre elles.
Les chaînes peuvent être constituées de n'importe quel caractère ascii imprimable.
L'entrée donnée sur STDIN sera donnée avec une chaîne sur chaque ligne. À votre demande, une seule ligne vide peut être ajoutée à la fin de la saisie.
C'est le golf de code, donc le programme valide le plus court gagne.
QUELQUES CAS D'ESSAI
CONTRIBUTION:
STRING ONE
STRING TWO
PRODUCTION:
E
CONTRIBUTION:
A&&C
A&$C
SORTIES VALIDES:
&&
&C
CONTRIBUTION:
(Deux chaînes de 80 lettres générées aléatoirement)
QIJYXPYWIWESWBRFWUHEERVQFJROYIXNKPKVDDFFZBUNBRZVUEYKLURBJCZJYMINCZNQEYKRADRYSWMH
HAXUDFLYFSLABUCXUWNHPSGQUXMQUIQYRWVIXGNKJGYUTWMLLPRIZDRLFXWKXOBOOEFESKNCUIFHNLFE
TOUTES LES SORTIES VALIDES:
AD
BJ
BR
CZ
DD
EE
ER
EY
EY
FF
FJ
FW
FZ
HE
IJ
IN
IW
JC
JR
JY
KL
KP
KR
KV
LU
MH
MI
NB
NQ
OY
PK
PY
QE
QF
QI
RA
RB
RF
RO
RV
RY
RZ
SW
UE
UH
UN
UR
VD
VQ
VU
WB
WE
WI
WU
XN
XP
YI
YK
YK
YM
YS
YW
YX
ZB
ZJ
ZN
ZV
Réponses:
Brachylog , 23 octets
Fonctionne sur l'ancien transpilateur Java. Attend les deux chaînes d'une liste en entrée, unifie la sortie avec la sous-chaîne. Si aucune sous-chaîne n'est trouvée, renvoie false.
Malheureusement, je n'ai pas encore codé le sous-ensemble intégré dans le nouveau transpilateur Prolog.
Explication
la source
Python,
11911591Cas de test:
Travailler à le raccourcir, mais c'est mon instinct cérébral. Pas encore vraiment un golfeur.
Merci à @ user81655 et @NonlinearFruit pour les octets supplémentaires.
Modifier :
Dang. J'ai essayé ce code:
Je pensais que c'était plus court de quelques octets. Il s'avère que c'était 1 octet de plus que ce que j'avais avant l'édition.
la source
(r=range)(1,len(a)+1)
alors utiliserr
?range
àr
dans la ligne ci-dessus, cela ajoute en fait un octet. Bonne idée cependant. Il existe probablement un moyen plus court pour parcourir les sous-chaînes.range(1,len(a))
etrange(len(a)-1)
devrait fonctionner non? Je pense également que l'utilisation d'un caractère de tabulation pour le retrait de deux espaces permettrait d'économiser un octet.range(1,len(a))
, le 4ème cast de test échoue car il n'essaiera pas la chaîne complète; cela ira seulement à la longueur de la chaîne - 1. Et avecrange(len(a)-1)
, le 1er cas de test ne retourne pas'cd'
au lieu de juste'd'
. Mais il y a peut-être quelque chose là-dedans.range(1,len(a)+1)
etrange(len(a))
.Python,
8786 octetsS'il existe, cela renverra la plus à gauche de toutes les sous-chaînes uniques les plus courtes.
S'il n'y a pas de sous-chaîne unique, une IndexError est déclenchée .
Testez-le sur Ideone .
la source
enumerate
commencerj
ài+1
.j
abord, ensuitei
.'ab'
pour entrée'abc','aaa'
.Python, 82 octets
Utilisation:
f('A&&C', 'A&$C')
-> retourne'&&'
Déclenche ValueError s'il n'y a pas de sous-chaîne appropriée.
Explication:
g=lambda u:{u}|g(u[1:])|g(u[:-1])if u else{''}
crée récursivement un ensemble de sous-chaînes deu
f=lambda s,t:min(g(s)-g(t),key=len)
prend la sous-chaîne la plus courte de la différence d'ensemblela source
JavaScript (ES6), 79 octets
Si le retour
false
est acceptable, enregistrez 2 octets en utilisant&&s
au lieu de?s:''
.la source
Pyth, 11 octets
Essayez-le en ligne!
la source
JavaScript (Firefox), 80 octets
Le test ne fonctionne que dans Firefox. Renvoie
undefined
s'il n'y a pas de sous-chaîne.la source
b.includes
place?includes
.SyntaxError: unexpected token 'for'
Rétine , 37 octets
La sortie est vide si aucune sous-chaîne valide n'est trouvée dans
A
.Essayez-le en ligne!(Légèrement modifié pour exécuter plusieurs cas de test à la fois. Le format d'entrée est en fait séparé par saut de ligne, mais les suites de tests sont plus faciles à écrire avec un cas de test par ligne. Le cadre de test transforme l'espace en saut de ligne avant le début du code réel.)
Explication
Pour chaque position de départ possible
A
, faites correspondre la sous-chaîne la plus courte qui n'apparaît pas dansB
. C'est&
pour les correspondances qui se chevauchent, de sorte que nous essayons en fait chaque position de départ, même si une correspondance est plus longue qu'un caractère. Les\G
assure que nous ne sautez pas de positions - cette façon , nous avons notamment l' arrêt au saut de ligne, de sorte que nous ne recevons pas les matchs supplémentaires deB
lui - même. La raison pour laquelle cela ne gâche pas les choses est en fait assez subtile: car s'il y a une position de départ dansA
laquelle nous ne pouvons pas trouver de sous-chaîne valide, c'est également un échec qui entraînera l'\G
arrêt de la vérification de toute autre position. Cependant, si (à partir de la position de départ actuelle) toutes les sous-chaînes apparaissent dansB
, il en sera de même pour toutes les sous-chaînes qui commencent plus à droite de la position actuelle, donc leur suppression n'est pas un problème (et améliore en fait les performances).En raison de
M!
configuration, tous ces matchs seront renvoyés de la scène, joints à des sauts de ligne.Cela trie les lignes du résultat précédent par longueur. Cela se fait en faisant correspondre la ligne avec
.+
.$
Active ensuite une forme de "tri par", de telle sorte que la correspondance soit remplacée par$.&
pour déterminer l'ordre de tri. Le$.&
lui-même remplace le match par sa longueur. Enfin, l'#
option indique à Retina de trier numériquement (sinon, elle traiterait les nombres résultants comme des chaînes et les trierait lexicographiquement).Enfin, nous ne gardons que la première ligne, en utilisant une étape grep avec une expression rationnelle vide (qui correspond toujours) et une limite de
1
.la source
Perl,
8785Il s'agit d'une fonction anonyme qui renvoie la première (par position) des sous-chaînes les plus courtes
$_[0]
qui ne se produisent pas dans$_[1]
, ouundef
si aucune sous-chaîne n'existe.Programme de test avec des chaînes tirées de la réponse de @ iAmMortos, testé avec Perl 5.22.1:
la source
Haskell, 72 octets
Exemple d'utilisation:
"abcd" # "dabc"
->"cd"
.Une implémentation simple: créez toutes les sous-chaînes de
a
et conservez celles qui n'apparaissent pas dansb
.argmin
retourne un élément d'une liste qui minimise la fonction donnée un 2ème argument ici:length
.la source
argmin
! Cela semble extrêmement utile.Pyth -
96 octetsEssayez-le en ligne ici .
la source
C #, 152 octets
la source
Rubis, 70 octets
Collecte toutes les sous-chaînes d'une certaine longueur de la première chaîne, et s'il y en a une qui n'est pas dans la deuxième chaîne, renvoyez-la.
la source
Burlesque - 26 octets
En ce moment, le moyen le plus court que je peux trouver est:
la source
Japt , 14 octets
Essayez-le en ligne!
Renvoie
undefined
s'il n'y a pas de sous-chaîne valide . Ceci est différent du renvoi de la chaîne "non définie" , bien que la différence ne soit visible qu'en raison de l'indicateur -Q.Explication:
la source
Japt
-h
, 11 octetsEssayez-le
la source