Écrivez un programme qui prend 2 chaînes en entrée et retourne le préfixe commun le plus long. Il s'agit de code-golf , donc la réponse avec le plus petit nombre d'octets l'emporte.
Test Case 1:
"global" , "glossary"
"glo"
Test Case 2:
"department" , "depart"
"depart"
Test Case 3:
"glove", "dove"
""
"aca", "aba"
.global
etGLOSSARY
retournerglo
ou''
?Réponses:
Python 3, 54 octets
Merci Python d'avoir une fonction intégrée pour cette tâche! :RÉ
Prend la saisie sous la forme de deux mots séparés par un espace tel que
glossary global
.la source
Haskell, 29 octets
Usage:
Définit récursivement la fonction binaire
%
par correspondance de modèle. Sur deux chaînes avec des premières lettres égales, prend ces premières lettres et les ajoute à la fonction du reste des chaînes. Sur toute autre chose, donne la chaîne vide.la source
Pyth,
87 octetsMerci @isaacg pour 1 octet de moins
Prend les entrées entre guillemets et séparées par des virgules, comme
"abc", "acc"
. Cela se termine sur une erreur (mais laisse stdout vide) lorsque le résultat est la chaîne vide. Si cela est inacceptable, ajoutez 2 octets pour#e@F._MQq
Suite de tests
Explication
la source
e|@F._M.z]k
.#...q
est d'un octet de moins que cela, je vais éditer dans le code complet, je suppose que c'est déroutant"abc", "def"
et vous pouvez utiliserQ
au lieu de.z
C ++,
10110099 octetsLit deux chaînes de
stdin
, imprime le caractère à la position actuelle de l'une des chaînes tandis que le caractère à la position actuelle est égal au caractère à la même position dans l'autre chaîne.Merci à Zereges d' avoir enregistré un octet.
la source
for
déclaration ...int i
dans l'espace global (pour qu'il soit 0 initialisé)Haskell, 38 octets
Exemple d'utilisation:
( ((map fst.fst.span(uncurry(==))).).zip ) "global" "glossary"
->"glo"
.Compressez les deux chaînes d'entrée dans une liste de paires de caractères. Faites-en deux listes: la première avec toutes les paires depuis le début tant que les deux caractères sont égaux, la seconde avec tous les autres. Supprimez la deuxième liste et extrayez tous les caractères de la première liste.
la source
CJam,
12119 octetsCela lit les chaînes sur deux lignes distinctes avec une fin de ligne de style Unix, c'est-à-dire,
<string>\n<string>\n
.Merci à @ MartinBüttner pour -1 octet et à @ jimmy23013 pour -2 octets!
Essayez-le en ligne dans l' interpréteur CJam .
Comment ça marche
la source
l_q.-
.APL, 13
Il s'agit d'une fonction qui prend un tableau de deux chaînes et renvoie le préfixe:
la source
AppleScript, 215 octets
Et j'ai tellement essayé ...; (
Je voulais voir dans quelle mesure AppleScript pouvait réussir cela, et l' homme n'est-il pas conçu pour des comparaisons de chaînes.
la source
tell app "System Events" to <something>
. Cependant, il est intéressant de voir comment il traite ce genre de choses. @ kirbyfan64sosrs , 14 octets
Démonstration en direct et cas de test.
C'est assez simple. Il correspond simplement au ... préfixe commun le plus long et supprime le reste de la chaîne. S'il n'y a pas de préfixe commun le plus long, il efface simplement tout.
la source
sed, 18
J'avais quelque chose de beaucoup plus long et de plus compliqué à l'esprit, donc le mérite de cette idée revient à @ kirbyfan64sos .
Comprend +1 pour l'
-r
option de sed.la source
CJam,
12826Essayez-le en ligne.
(J'ai eu l'idée d'utiliser. = Au lieu de .- après avoir regardé la réponse de Dennis.)
Avec tous les cas de bord, il est devenu difficile pour un débutant CJam comme moi de rester bref. Espérons que cela fonctionne au moins pour tous les cas.
la source
C #,
201147 octetsJe sais que ce n'est pas terriblement compétitif. Je voulais juste voir à quoi ça ressemblerait.
EDIT: Merci Ash Burlakzenko, Berend et Dennis_E
la source
using System.*
?.ForEach(x=>Console.Write(x))
pourrait être raccourci à.ForEach(Console.Write)
using System.Collections.Generic;
est inutile. Raser un octet de plus en supprimant l'espace destring[] a
.Contains
n'est pas nécessaire. 2-Vous pouvez enregistrer quelques octets en supprimantusing System;
et en disantSystem.Console.Write;
3-Ce code renvoie le mauvais résultat ("a") pour l'entrée "aab", "aaab", à cause deIndexOf
. Le correctif le plus court auquel je pourrais penser est d'utilisera[0].Take(a[1].Length)
Il fait 147 octets de long: "using System.Linq; class a {static void Main (string [] a) {a [0] .Take (a [1] .Length) .TakeWhile ((c, i) => a [1] [i] == c) .ToList (). ForEach (System.Console.Write);}} "Lisp commun, 39
Prend deux arguments de chaîne, détermine l'index i où ils diffèrent et renvoie une sous-chaîne de 0 à i .
la source
Perl 5,
201918 octets19 octets, plus 1 pour le
-E
drapeau au lieu de-e
:Ceci est copié sans vergogne du numérique Trauma de réponse sed . Il suppose que l'entrée est un couple de mots sans espaces (ou avant le premier) et avec un espace entre eux.
Mise à jour:
ThisSuitIsBlackNot a suggéré d'utiliser
-pe
comme suit, pour enregistrer un octet (merci!):Et puis Luk Storms a suggéré d'utiliser
-nE
comme suit pour enregistrer un autre octet (merci!):(Je compte
-E
comme un octet au lieu de la norme-e
, mais-n
ou-p
comme deux. Mon impression est que ce SOP est ici.)la source
-M5.010
, si nécessaire, est gratuit" . Par le même message de méta,-pe
ou-ne
serait 1 octet supplémentaire, pas 2. Doncperl -nE 'say/^(.*).* \1/'
, marquerait 16 octets.Python 3, 72
31 octets économisés grâce à FryAmTheEggman. 8 sauvés grâce à DSM.
la source
zip
? : Dinput()
s dans lezip
et enregistrer lea
et lab
liaison.Python 3, 47
Une fonction qui prend une liste
w
de deux mots et imprime le préfixe commun avant de se terminer par une erreur.La
print
fonction de Python 3 vous permet d'imprimer les chaînes les unes contre les autresprint(end=c)
(grâce au Sp3000 pour avoir économisé 3 octets avec cette syntaxe plus courte). Cela prend à plusieurs reprises deux lettres des mots et imprime la première des lettres. L'indexationc[c!=d]
donne une erreur hors limites oùc!=d
, mettant fin à l'exécution lorsque deux lettres inégales sont rencontrées.Une boucle for explicite est un caractère plus long que la compréhension de la liste:
la source
print(end=c[c!=d])
?print
être facultatif signifiait qu'il pouvait être appelé avec uniquement l'argument de fin, et qui pouvait contenir la chaîne. C'est une astuce vraiment utile en général. Vous devriez faire un pourboire.Javascript ES6, 52 octets
Usage:
la source
ada,aca
...f=
(a,b)=>[...a].map((e,i)=>e==b[i]?e:b='').join``
Rétine , 14 octets
Uses the same idea as kirbyfan64sos. Unfortunately, despite Martin's claim that eventually Match mode will feature a way to print capturing groups, it hasn't been implemented yet. Otherwise,
(.*).* \1
could be used along with 2 bytes or so for some not-yet-existing configuration string option.Each line would go in its own file, with 1 byte added per additional file. Alternatively, run in a single file with the
-s
flag.la source
\1
ensures that both words start with the same prefix. So no matter how greedy(.*)
is,\1
is the same.K, 24 bytes
Find the minimum of the length of each string. (
(&/#:'x)
). Trim each string to that length (#'x
). Then compare, smear and sum the resulting sequence:Finally, take that many characters from the first of the strings provided (
#*x
).In action:
la source
Powershell, 65 bytes
Compare the strings, shrinking the first until it either matches (print and exit) or the string is null and the loop terminates.
la source
Julia, 62 bytes
Ungolfed:
Fixed an issue (at the hefty cost of 14 bytes) thanks to xnor!
la source
C99, 73 bytes
Similar to this answer, but shorter and meets spec (takes input from stdin).
la source
#include<stdio.h>
, which is necessary for the program to compile.main(int c,char**a){for(;*a[1]==*a[2]++;putchar(*a[1]++));}
(59 bytes).MATLAB,
5040 bytesDefines a function that accepts 2 strings as input, outputs to command window
This solution will work for any string, outputs
if no match is given.
Can be golfed by using a script instead of a function (using local variables a, b) (-16 bytes).
so getting 34 Bytes
The function style (which seems to be the accepted style), yields
(Thanks @Stewie Griffin)
la source
@(a,b)a(1:find([diff(char(a,b)) 1],1)-1)
. =)Perl 6, 28 bytes
I came up with two that take their values from STDIN which are based on the Perl 5 answer.
The first requires exactly one space between the inputs, while the other requires at least one whitespace character between the inputs.
That is quite a bit shorter than the first thing I tried which takes the values from the command line.
or even the lambda version of it:
Though this is much easier to adjust so that it accepts any number of input strings, at the cost of only one stroke.
la source
Japt, 27 bytes
Japt is a shortened version of JavaScript. Interpreter
(The strings go into the Input box like so:
"global" "glossary"
)This code is exactly equivalent to the following JS:
I have not yet implemented anonymous functions, which is what the
$...$
is for: anything between the dollar signs is left untouched in the switch to JS. After I add functions, this 21-byte code will suffice:And after I implement a few more features, it will ideally be 18 bytes:
Suggestions welcome!
So it turns out that this program is only 15 bytes in modern Japt:
Try it online!
la source
MATL,
119 bytesTry it online!
(-2 bytes thanks to Giuseppe)
la source
y
idea is pretty good, I'd tried things like an initialiti
instead of the1Gw
, but didn't think of using they
for that.Clojure/ClojureScript, 51
Pretty straightforward. Unfortunately the spaces around the parameter destructuring are necessary (that's the
[a & b]
stuff). Not the shortest but I beat some other answers in languages that like to brag about their terseness so I'll post it.la source
Python 2, 50 bytes
Input
The input is taken as two strings:
Output
The output is each character followed by a space; which, hopefully, isn't a problem. However, if it is, I'll edit my answer.
la source
"global" , "glossary"
(two separate strings).. How many other answers follow that to the letter? @ThomasKwaprint(exit()if a!=b else a,end='')
? I don't know if that'll work or not, but it mightTeaScript, 16 bytes
20Takes each input separated by a space.
la source
PHP, 52 bytes
Not spectacular but does the job:
Takes two command line arguments:
la source
while(($a=$argv)[1][$i]==$a[2][$i])echo$a[1][$i++];
- Another PHP7 only solution (and best I could come up with @ 50 bytes)<?=substr(($a=$argv)[1],0,strspn($a[1]^$a[2],~ÿ));
- Make sure your editor is in ascii mode, it's important the~ÿ
does not get converted to unicode.