Étant donné les chaînes X et Y, déterminez si X est une sous- séquence de Y. La chaîne vide est considérée comme une sous-séquence de chaque chaîne. (Par exemple, ''
et 'anna'
sont des sous-séquences de 'banana'
.)
Contribution
- X, une chaîne alphanumérique sensible à la casse éventuellement vide
- Y, une chaîne alphanumérique sensible à la casse éventuellement vide
Sortie
- Vrai ou faux (ou équivalents), indiquant correctement si X est une sous-séquence de Y.
Exemples d'E / S
X Y output
'' 'z00' True
'z00' 'z00' True
'z00' '00z0' False
'aa' 'anna' True
'anna' 'banana' True
'Anna' 'banana' False
Critères
- Le programme le plus court gagne, comme déterminé par le nombre d'octets de code source.
Exemples de programmes
- Plusieurs programmes qui pourraient être adaptés figurent dans cette publication connexe .
anna
est une sous- séquence (mais pas une sous-chaîne) debanana
. La chaîne X est une sous-séquence de la chaîne Y juste si X peut être obtenu à partir de Y en supprimant zéro ou plusieurs des éléments de Y; par exemple, en supprimant leb
et le seconda
debanana
donneanna
.Réponses:
Perl 5 , 17 octets (+1?), Programme complet
Essayez-le en ligne!
Appelez avec le
p
drapeau à l'interpréteur perl, comme dansperl -pe 's//.*/g;$_=<>=~$_'
. Selon les règles de notation établies lorsque ce défi a été initialement publié , ce drapeau coûte un octet supplémentaire. Selon des règles plus récentes , AFAICT, il peut être gratuit.Dans les deux cas, les chaînes d'entrée doivent être fournies sur des lignes séparées par des retours à la ligne sur stdin. La sortie (vers stdout) sera
1
si la première chaîne d'entrée est une sous-chaîne de la seconde, ou rien du tout si ce n'est pas le cas.Notez que les deux lignes d'entrée doivent avoir une nouvelle ligne à la fin, sinon le programme ne fonctionnera pas correctement. Alternativement, vous pouvez ajouter l'
l
indicateur de ligne de commande à l'invocation pour que perl supprime les sauts de ligne; selon les règles de notation en vigueur, cela peut ou non coûter un octet supplémentaire. Notez que l'utilisation de cet indicateur ajoutera également une nouvelle ligne à la sortie.Version originale (extrait, 18 octets / caractères)
L'entrée est donnée dans les variables
$x
et le$y
résultat est la valeur de l'expression (dans un contexte scalaire). Notez que cela$x
est modifié dans le processus. (Oui, je sais que l'utilisation$_
au lieu de$x
me permettrait d'enregistrer quatre caractères, mais le faire dans un extrait de code qui me semble un peu trop ringard.)Comment ça marche?
La première partie
$x=~s//.*/g
,, insère la chaîne.*
entre chaque caractère dans$x
. La deuxième partie,$y=~$x
traite$x
comme une expression rationnelle et correspond$y
à elle. Dans les expressions rationnelles Perl,.*
correspond à zéro ou plusieurs caractères arbitraires, tandis que tous les caractères alphanumériques se correspondent facilement.la source
Ruby, 32 caractères
Cette solution renvoie
nil
six
n'est pas une sous-séquence dey
et un nombre dans le cas contraire (c'est-à-dire des équivalents rubis àfalse
ettrue
). Exemples:la source
y=~/#{[*x.chars]*".*"}/
(23 caractères). à votre santé!y=~/#{x.split("")*".*"}/
(21 caractères) :)y=~
pendant que jeHaskell,
5137Merci à Hammar pour cette amélioration substantielle. C'est maintenant une fonction infixe, mais il ne semble pas y avoir de raison qu'elle ne le soit pas.
Manifestation:
la source
s x y=x<=y
. En outre, vous pouvez en enregistrer quelques autres en en faisant un opérateur et en utilisant un@
-pattern au lieu de(f:l)
. Cela le réduit à 37 caractères:h@(f:l)%(g:m)=f==g&&l%m||h%m;x%y=x<=y
Python (48 caractères)
Même approche que la réponse Ruby d'Howard. Dommage sur le besoin de Python d'importer le paquet regex et son "verbose"
lambda
. :-)la source
Python, 59 caractères
J'ai pensé que ma réponse serait mieux exprimée en Python.
Edit: Ajout des suggestions de res.
la source
x="a"
ety="ab"
vous sortiriez de la boucle avecy=="b"
et reviendriezfalse
?x
ety
plus. Dans mes fonctionsy
doit être une sous-séquence dex
. Je pense que je ferais mieux de les changer pour éviter toute confusion.def s(x,y): for c in y: if x:x=x[c==x[0]:] return x==""
. Il ne s'affiche pas correctement dans un commentaire, mais je pense que vous pouvez voir ce que je veux dire. (De plus, un espace supplémentaire suffit pour augmenter le niveau de retrait.)''
et enregistrer plusieurs caractères en écrivantx=x[c==x[0:1]:]
GolfScript (22 caractères)
Suppose que l'entrée est considérée comme deux variables prédéfinies
X
etY
, bien que cela soit plutôt inhabituel dans GolfScript. Laisse1
pour vrai ou0
pour faux sur la pile.la source
C (52 caractères)
Cas de test
la source
s(char*x,char*y){x=!*x||*y&&s(x+(*x==*y),y+1);}
Burlesque (6 caractères)
6 caractères dans Burlesque:
R@\/~[
(en supposant que x et y sont sur la pile. Voir ici en action.)la source
C, 23:
résultat en * x
http://ideone.com/BpITZ
la source
PHP, 90 caractères
la source
if
déclaration et simplifier$x=substr($x,$y[$a++]==$x[0])
: ideone.com/Ch9vKScala 106:
la source
CoffeeScript
1121009589Ma première tentative de code golf ... j'espère que je n'ai pas honte à ma famille!
Edit : il s'avère que Coffeescript est plus indulgent que je ne le pensais avec les espaces blancs.
Merci à res et Peter Taylor pour quelques conseils pour le rendre un peu plus élégant
la source
z=(x,y)-> a=x.length return 1if a==0 b=y.indexOf x[0] return 0if b<0 z x[1..a],y[b+1..y.length]
. (Dans certains navigateurs, par exemple Chrome, vous pouvez voir le code de commentaire correctement affiché en cliquant avec le bouton droit, puis en inspectant l'élément.)a.length
ne sera jamais négatif, vous pouvez donc enregistrer un caractère de plus en le remplaçantif a==0
parif a<1
. Je ne sais pas comment fonctionne la tokenisation de CoffeeScript, mais s'il lexeif0
comme deux tokens, vous pouvez en enregistrer deux de plus en inversant les deux conditions (ieif1>a
).if1>a
n'est pas valide, maisif!a
est et est un caractère plus court! J'ai aussi réalisé que je pouvais raser un caractère supplémentaire conversionb+1
àb
et incrémenter sur la ligne précédente, ce qui rend également la mêmeif
astuce possible car il avait affaire à un 0 / situation de non-0.C #,
7011310790 caractèresla source
static bool S(string x,string y){if(x!=""&&y=="")return false;return x==""||S(y[0]==x[0]?x.Remove(0,1):x,y.Remove(0,1));}
x==""||y!=""&&S(...)
, mais il est toujours plus long que la version mise à jour de Linq. Bonne utilisation deAny
!Mathematica
19 1727LongestCommonSequence
renvoie la plus longue sous-séquence non contiguë de deux chaînes. (À ne pas confondre avecLongestCommonSubsequence
, qui renvoie la sous-séquence contiguë la plus longue.Ce qui suit vérifie si la sous-séquence contiguë la plus longue est la première des deux chaînes. (Vous devez donc entrer la chaîne la plus courte suivie de la plus grande.)
Exemples
Vrai Vrai Vrai Faux
Le test critique est le troisième, car "anna" est contenue non contiguë dans "banana".
la source
Python 3.8 (version préliminaire) , 42 octets
Essayez-le en ligne!
Python 3.8 (pré-version) , 48 octets
Essayez-le en ligne!
Python 2 , 48 octets
Essayez-le en ligne!
Copié de cette réponse de Lynn . Le
>0
peut être omis si la sortie vérité / falsey est correcte.Python 2 , 50 octets
Essayez-le en ligne!
Python 2 , 50 octets
Essayez-le en ligne!
la source
C -
74 7164Cela ne bat pas la solution de Peter Taylor, mais je pense que c'est assez amusant
(en plus, c'est un programme de travail complet, pas seulement une fonction)Et non golfé:
Pour le tester, vous pouvez faire quelque chose comme:
la source
!=0
dans une condition est un peu verbeux ... Le programme vs fonction est quelque chose que la question doit spécifier clairement, et ici ce n'est pas le cas, donc les réponses prennent différentes options.!='\0'
une mauvaise (bonne?) Habitude d'écrire du code non-golf, je l'ai laissé glisser dans mes deux dernières rondes de golf, je devrai être plus prudent à l'avenir. Quant au programme vs fonction, oui, vous avez absolument raison.Python,
66625958 caractèresUne sorte de solution amusante, certainement un problème soigné.
la source
Rubis
323028Cela retournera l'
MatchData
instance sia
est une sous-séquence deb
ounil
autrement.Ancienne version qui trouve une sous-chaîne au lieu d'une sous-séquence
Rubis 15
En utilisant une
String#[](str)
méthode qui retournestr
ifstr
est une sous-chaîne deself
et!!
pour retournerBoolean
si la valeur retournée peut être utilisable en tant que booléen (et n'a pas besoin d'êtretrue
oufalse
), elle ne peut être que de 13 caractères:Il retournera
nil
sia
n'est pas une sous-chaîne deb
.la source
SWI-Prolog, SICStus
La sous- liste de prédicats intégrée / 2 de SICStus vérifie si tous les éléments de la première liste apparaissent également dans la deuxième liste. Ce prédicat est également disponible dans SWI-Prolog via une bibliothèque de compatibilité, qui peut être chargée par la requête
[library(dialect/sicstus/lists)].
.Exemple d'exécution:
Le nombre d'octets peut être techniquement égal à 0, car tout ce que nous faisons ici est d'interroger, tout comme la façon dont nous exécutons un programme et lui fournissons une entrée.
la source
PHP, 41 octets
imprime 1 pour vrai et rien pour faux
Si seules les insertions du mot 1 au mot 2 sont effectuées, le compte est nul pour les cas réels
levenshtein
Essayez-le en ligne!
PHP, 57 octets
imprime 1 pour vrai et 0 pour faux
Crée une expression régulière
Essayez-le en ligne!
la source
.*
n'est pas nécessaire. -2 octets: ne pas attribuer$argv
à$a
. +24 octets: besoinarray_map(preg_quote())
de caractères spéciaux (utilisez des parenthèses comme délimiteurs pour éviter le deuxièmepreg_quote
paramètre.)preg_match
ne se plaindra pas d'une expression régulière vide tant que les délimiteurs sont là. Cela correspondra à tout. Mais preg_quote est seulement +22 octets, et non +24:array_map(preg_quote,str_split(...))
..*
.Brachylog , 2 octets
Essayez-le en ligne!
Comme avec cette réponse,
⊆
est un prédicat intégré qui déclare une relation entre les variables d'entrée et de sortie, etᵈ
est un méta-prédicat qui le modifie pour déclarer cette même relation entre les premier et deuxième éléments de la variable d'entrée à la place (et unifier la variable de sortie avec le deuxième élément mais comme c'est un problème de décision qui ne finit pas par avoir d'importance ici).X⊆Y
est une affirmation que X est une sous-séquence de Y, donc c'est le cas[X,Y]⊆ᵈ
.Ce prédicat (qui bien sûr sort par le succès ou l'échec qui s'imprime
true.
oufalse.
lorsqu'il est exécuté en tant que programme) prend l'entrée comme une liste de deux chaînes. Si l'entrée est un peu plus flexible ...Brachylog , 1 octet
Essayez-le en ligne!
Prend la chaîne X comme variable d'entrée et la chaîne Y comme variable de sortie. Sorties par succès ou échec, comme précédemment. S'il est exécuté en tant que programme complet, X est fourni comme entrée et Y est fourni comme premier argument de ligne de commande.
la source
CoffeeScript 73
Voici une réponse alternative à CoffeeScript, en utilisant des expressions rationnelles au lieu de la récursivité:
Si la botte de foin correspond à une expression rationnelle très gourmande construite à partir de l'aiguille, elle sera remplacée par une chaîne vide. Si la botte de foin est plus courte qu'elle n'a commencé, l'aiguille était une sous-séquence.
Renvoie false lorsque
x
ety
sont deux chaînes vides. Pensez que nous avons besoin d'un philosophe pour nous dire si une chaîne vide est une sous-séquence d'elle-même!(Publié comme une réponse distincte de ma précédente car elle semble suffisamment différente pour la justifier).
la source
PowerShell, 38
Bien sûr, une telle solution basée sur l'expression rationnelle ou la correspondance de modèles présente de graves problèmes de performances avec des chaînes plus longues. Mais comme la brièveté est le critère ...
la source
Une sorte d'anti-solution générant toutes les sous-séquences de Y:
Python 93
la source
APL (31)
La gestion des chaînes fait un peu défaut dans APL.
usage:
la source
Python 132
Similaire à Daniero. Ce n'était pas la solution la plus simple, mais c'était amusant à essayer. Je suis nouveau sur Python, donc je suis sûr que je pourrais le raccourcir si j'en savais un peu plus.
la source
Python - 72
la source
Python (
7552)Solution récursive simple. Golf pour la première fois, donc tous les conseils pour le réduire sont très appréciés :)
Testé avec les éléments suivants:
Merci à @lirtosiast pour quelques astuces booléennes intelligentes.
la source
s=lambda a,b:a==''or b>''and s(a[a[0]==b[0]:],b[1:])
PHP,
756564 octetsprend l'entrée des arguments de la ligne de commande; affiche
1
pour vrai, chaîne vide pour faux. Courez avec-r
.explication:
strpos
revientfalse
si l'aiguille$c
n'est pas dans la botte de foin$argv[2]
(après la position$p
),provoquant la rupture de la boucle.
strpos
revient égalementfalse
pour une aiguille vide, rompant la boucle à la fin de$argv[1]
.$argv[1]
est une sous-séquence de$argv[2]
,$c
sera vide lorsque la boucle se cassera.strpos
doit@
supprimer l'Empty needle
avertissement.la source
+$p
au lieu de cela$p+1
après il n'y a pas besoin de souligner+1
est nécessaire pour avancer dans la chaîne de meule de foin; et le trait de soulignement évite l'$p=-1
initialisation. Mais ... je peux éviterfalse!==
.Swift, 27
la source