Escreva um programa que use 2 strings como entrada e retorne o prefixo comum mais longo. Isso é código-golfe , então a resposta com a menor quantidade de bytes vence.
Test Case 1:
"global" , "glossary"
"glo"
Test Case 2:
"department" , "depart"
"depart"
Test Case 3:
"glove", "dove"
""
"aca", "aba"
.global
e deveGLOSSARY
retornarglo
ou''
?Respostas:
Python 3, 54 bytes
Obrigado Python por ter uma função interna para esta tarefa! : D
Recebe a entrada como duas palavras separadas por um espaço como
glossary global
.fonte
Haskell, 29 bytes
Uso:
Define recursivamente a função binária
%
por correspondência de padrões. Em duas cadeias com primeiras letras iguais, pega essas primeiras letras e o anexa à função do restante das cadeias. Em qualquer outra coisa, fornece a string vazia.fonte
Pitão,
87 bytesObrigado @isaacg por 1 byte de desconto
Pega a entrada entre aspas e vírgula, como
"abc", "acc"
. Isso ocorre com um erro (mas deixa o stdout vazio) quando o resultado é a sequência vazia. Se isso for inaceitável, adicione 2 bytes para#e@F._MQq
Suíte de teste
Explicação
fonte
e|@F._M.z]k
.#...q
um byte menos do que isso, eu vou editar no código completo, eu acho que é confuso"abc", "def"
e você pode usarQ
em vez de.z
C ++,
10110099 bytesLê duas strings de
stdin
, imprime o caractere na posição atual a partir de uma das strings, enquanto o caractere na posição atual é igual ao caractere na mesma posição na outra string.Agradecemos a Zereges por salvar um byte.
fonte
for
declaração ... #int i
no espaço global (de modo que ele será 0 inicializado)Haskell, 38 bytes
Exemplo de uso:
( ((map fst.fst.span(uncurry(==))).).zip ) "global" "glossary"
->"glo"
.Compacte ambas as seqüências de entrada em uma lista de pares de caracteres. Faça duas listas: a primeira com todos os pares desde o início, desde que os dois caracteres sejam iguais, a segunda com todos os demais. Solte a segunda lista e extraia todos os caracteres da primeira lista.
fonte
CJam,
12119 bytesIsso lê as strings em duas linhas separadas com final de linha no estilo Unix, ou seja
<string>\n<string>\n
,.Obrigado a @ MartinBüttner por -1 byte e a @ jimmy23013 por -2 bytes!
Experimente online no intérprete CJam .
Como funciona
fonte
l_q.-
.APL, 13
Esta é uma função que pega uma matriz de duas seqüências e retorna o prefixo:
fonte
AppleScript, 215 bytes
E eu tentei tanto ...; (
Eu queria ver o quão bem o AppleScript poderia fazer isso, e o homem não é construído para comparações de strings.
fonte
tell app "System Events" to <something>
. Ele é interessante ver como ele lida com esse tipo de coisa, no entanto. @ kirbyfan64sosrs , 14 bytes
Demonstração ao vivo e casos de teste.
Isso é bem simples. Apenas corresponde ao ... prefixo comum mais longo e remove o restante da string. Se não houver um prefixo comum mais longo, apenas limpará tudo.
fonte
sed, 18
Eu tinha algo muito mais longo e mais complicado em mente, então o crédito por essa idéia é para @ kirbyfan64sos .
Inclui +1 para a
-r
opção sed.fonte
CJam,
12826Experimente online.
(Tenho idéia de usar. = Em vez de .- depois de olhar para a resposta de Dennis.)
Com todos os casos extremos, tornou-se difícil para um iniciante do CJam como eu mantê-lo curto. Felizmente, isso pelo menos funciona para todos os casos.
fonte
C #,
201147 bytesEu sei que não é terrivelmente competitivo. Eu só queria ver como seria.
EDIT: Obrigado Ash Burlakzenko, Berend e Dennis_E
fonte
using System.*
?.ForEach(x=>Console.Write(x))
poderia ser reduzido para.ForEach(Console.Write)
using System.Collections.Generic;
é desnecessário. Raspe mais um byte removendo o espaço destring[] a
.Contains
é desnecessário. 2-Você pode salvar alguns bytes removendousing System;
e dizendoSystem.Console.Write;
3-Este código retorna o resultado errado ("a") para a entrada "aab", "aaab", por causa deIndexOf
. A correção mais curta que eu pude pensar é usara[0].Take(a[1].Length)
This is 147 bytes 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 comum, 39
Pega dois argumentos de string, determina o índice i onde eles diferem e retorna uma substring de 0 a i .
fonte
Perl 5,
201918 bytes19 bytes, mais 1 para o
-E
sinalizador em vez de-e
:Isto é copiado descaradamente de Trauma Digital 's resposta sed . Ele pressupõe que a entrada seja um par de palavras sem espaços (ou antes da primeira) e com um espaço entre elas.
Atualizar:
ThisSuitIsBlackNot sugeriu o uso da
-pe
seguinte maneira, para salvar um byte (obrigado!):E então Luk Storms sugeriu o uso da
-nE
seguinte maneira para salvar outro byte (obrigado!):(Eu estou contando
-E
como um byte em vez do padrão-e
, mas-n
ou-p
como dois. Minha impressão é que isso é SOP por aqui.)fonte
-M5.010
, quando necessário, é gratuito" . Pela mesma meta postagem,-pe
ou-ne
haveria 1 byte adicional, não 2. Portanto,perl -nE 'say/^(.*).* \1/'
seria 16 bytes.Python 3, 72
31 bytes salvos graças ao FryAmTheEggman. 8 salvos graças ao DSM.
fonte
zip
? : Dinput()
s nozip
e salvar oa
eb
vinculativo.Python 3, 47
Uma função que pega uma lista
w
de duas palavras e imprime o prefixo comum antes de terminar com um erro.A
print
função do Python 3 permite imprimir seqüências de caracteres alinhadas umas com as outrasprint(end=c)
(obrigado ao Sp3000 por salvar 3 bytes com esta sintaxe mais curta). Isso pega repetidamente duas letras das palavras e imprime a primeira das letras. A indexaçãoc[c!=d]
gera um erro fora dos limites em quec!=d
, finalizando a execução quando duas letras desiguais são encontradas.Um loop for explícito é um caractere mais longo que a compreensão da lista:
fonte
print(end=c[c!=d])
?print
ser opcional significava que poderia ser chamado apenas com o argumento final e que poderia conter a string. Esse é um truque realmente útil em geral. Você deveria dar uma dica.Javascript ES6, 52 bytes
Uso:
fonte
ada,aca
...f=
(a,b)=>[...a].map((e,i)=>e==b[i]?e:b='').join``
Retina , 14 bytes
Usa a mesma idéia que kirbyfan64sos . Infelizmente, apesar da afirmação de Martin de que, eventualmente, o modo Match apresentará uma maneira de imprimir grupos de captura, ele ainda não foi implementado. Caso contrário,
(.*).* \1
poderia ser usado junto com 2 bytes ou mais para alguma opção de cadeia de configuração ainda não existente.Cada linha iria em seu próprio arquivo, com 1 byte adicionado por arquivo adicional. Como alternativa, execute em um único arquivo com o
-s
sinalizador.fonte
\1
garante que ambas as palavras comecem com o mesmo prefixo. Portanto, não importa quão ganancioso(.*)
seja,\1
é o mesmo.K, 24 bytes
Encontre o mínimo do comprimento de cada string. (
(&/#:'x)
) Apare cada corda com esse comprimento (#'x
). Em seguida, compare, espalhe e some a sequência resultante:Por fim, considere muitos caracteres da primeira das strings fornecidas (
#*x
).Em ação:
fonte
Powershell, 65 bytes
Compare as cadeias, diminuindo a primeira até corresponder (imprimir e sair) ou a cadeia é nula e o loop termina.
fonte
Julia, 62 bytes
Ungolfed:
Corrigido um problema (com um custo elevado de 14 bytes) graças ao xnor!
fonte
C99, 73 bytes
Semelhante a esta resposta , mas mais curto e atende às especificações (recebe entrada de stdin).
fonte
#include<stdio.h>
, o que é necessário para a compilação do programa.main(int c,char**a){for(;*a[1]==*a[2]++;putchar(*a[1]++));}
(59 bytes).MATLAB,
5040 bytesDefine uma função que aceita 2 seqüências de caracteres como entrada, sai na janela de comando
Esta solução funcionará para qualquer string, saídas
se nenhuma correspondência for dada.
Pode ser jogado golfe usando um script em vez de uma função (usando variáveis locais a, b) (-16 bytes).
obtendo 34 bytes
O estilo da função (que parece ser o estilo aceito) gera
(Obrigado @Stewie Griffin)
fonte
@(a,b)a(1:find([diff(char(a,b)) 1],1)-1)
. =)Perl 6 , 28 bytes
Eu vim com dois que levam seus valores de STDIN, que são baseados na resposta do Perl 5.
O primeiro requer exatamente um espaço entre as entradas, enquanto o outro requer pelo menos um caractere de espaço em branco entre as entradas.
Isso é um pouco menor do que a primeira coisa que tentei, que utiliza os valores da linha de comando.
ou mesmo a versão lambda:
Embora isso seja muito mais fácil de ajustar para aceitar qualquer número de strings de entrada, ao custo de apenas um toque.
fonte
Japonês, 27 bytes
Japt é uma versão abreviada do Ja vaScri pt .Intérprete
(As seqüências de caracteres entram na caixa de entrada da seguinte maneira:
"global" "glossary"
)Este código é exatamente equivalente ao seguinte JS:
Ainda não implementei funções anônimas, para que serve
$...$
: qualquer coisa entre os cifrões é deixada intocada na mudança para JS. Depois de adicionar funções, este código de 21 bytes será suficiente:E depois de implementar mais alguns recursos, o ideal é ter 18 bytes:
Sugestões são bem-vindas!
Portanto, esse programa tem apenas 15 bytes no Japt moderno:
Experimente online!
fonte
MATL ,
119 bytesExperimente online!
(-2 bytes graças a Giuseppe)
fonte
y
idéia é muito boa, eu tentei coisas como uma inicial emiti
vez de1Gw
, mas não pensei em usary
isso para isso.Clojure / ClojureScript, 51
Bem direto. Infelizmente, os espaços ao redor do parâmetro de desestruturação são necessários (esse é o problema
[a & b]
). Não é o mais curto, mas eu bati algumas outras respostas em idiomas que gostam de se gabar de sua discrepância, então eu a publicarei.fonte
Python 2, 50 bytes
Entrada
A entrada é tomada como duas cadeias:
Saída
A saída é cada caractere seguido por um espaço; o que, espero, não seja um problema. No entanto, se for, editarei minha resposta.
fonte
"global" , "glossary"
(duas seqüências de caracteres separadas) .. Quantas outras respostas seguem essa letra? @ThomasKwaprint(exit()if a!=b else a,end='')
? Eu não sei se isso vai funcionar ou não, mas pode serTeaScript, 16 bytes
20Separa cada entrada por um espaço.
fonte
PHP, 52 bytes
Não é espetacular, mas faz o trabalho:
Leva dois argumentos de linha de comando:
fonte
while(($a=$argv)[1][$i]==$a[2][$i])echo$a[1][$i++];
- Outra solução apenas para o PHP7 (e o melhor que eu poderia criar com @ 50 bytes)<?=substr(($a=$argv)[1],0,strspn($a[1]^$a[2],~ÿ));
- Verifique se o editor está no modo ascii, é importante~ÿ
que não seja convertido em unicode.