Napisz program, który pobiera 2 ciągi jako dane wejściowe i zwraca najdłuższy wspólny przedrostek. To jest golf golfowy , więc wygrywa odpowiedź z najmniejszą ilością bajtów.
Test Case 1:
"global" , "glossary"
"glo"
Test Case 2:
"department" , "depart"
"depart"
Test Case 3:
"glove", "dove"
""
"aca", "aba"
.global
iGLOSSARY
wróćglo
lub''
?Odpowiedzi:
Python 3, 54 bajty
Dzięki Python za posiadanie wbudowanej funkcji do tego zadania! :RE
Pobiera dane wejściowe jako dwa słowa oddzielone spacją, np
glossary global
.źródło
Haskell, 29 bajtów
Stosowanie:
Rekurencyjnie definiuje funkcję binarną
%
poprzez dopasowanie wzorca. Na dwóch ciągach znaków o równych pierwszych literach bierze te pierwsze litery i przygotowuje je do funkcji reszty ciągów. Na czymkolwiek innym daje pusty ciąg.źródło
Pyth,
87 bajtówDzięki @isaacg za 1 bajt off
Pobiera dane wejściowe cytowane i przecinki, jak
"abc", "acc"
. To kończy się na błędzie (ale pozostawia standardowe wyjście puste), gdy wynikiem jest pusty ciąg. Jeśli jest to niedopuszczalne, dodaj 2 bajty dla#e@F._MQq
Pakiet testowy
Wyjaśnienie
źródło
e|@F._M.z]k
.#...q
jest o jeden bajt mniej niż, będę edytować pełny kod, myślę, że jest to mylące"abc", "def"
i możesz użyćQ
zamiast.z
C ++,
10110099 bajtówOdczytuje dwa ciągi z
stdin
, drukuje znak w bieżącej pozycji z jednego z ciągów, podczas gdy znak w bieżącej pozycji jest równy znakowi w tej samej pozycji w drugim ciągu.Dzięki Zereges za oszczędność jednego bajtu.
źródło
for
oświadczenia ...int i
w globalnej przestrzeni (tak, że będzie 0 zainicjowany)Haskell, 38 bajtów
Przykład użycia:
( ((map fst.fst.span(uncurry(==))).).zip ) "global" "glossary"
->"glo"
.Spakuj oba ciągi wejściowe na listę par znaków. Zrób z niego dwie listy: pierwszą ze wszystkimi parami od początku, o ile oba znaki są równe, drugą ze wszystkimi pozostałymi. Upuść drugą listę i wyodrębnij wszystkie znaki z pierwszej listy.
źródło
CJam,
12119 bajtówOdczytuje ciągi znaków na dwóch oddzielnych liniach z zakończeniem linii w stylu uniksowym, tj
<string>\n<string>\n
.Dzięki @ MartinBüttner za -1 bajt i @ jimmy23013 za -2 bajty!
Wypróbuj online w interpretatorze CJam .
Jak to działa
źródło
l_q.-
.APL, 13
Jest to funkcja, która pobiera tablicę dwóch ciągów znaków i zwraca prefiks:
źródło
AppleScript, 215 bajtów
I tak bardzo się starałem ...; (
Chciałem zobaczyć, jak dobrze AppleScript może to zrobić, a człowiek nie jest zbudowany do porównywania ciągów.
źródło
tell app "System Events" to <something>
. Jest to interesujące zobaczyć, jak zajmuje się tego rodzaju rzeczy, choć. @ kirbyfan64sosrs , 14 bajtów
Prezentacje na żywo i przypadki testowe.
To jest całkiem proste. Po prostu pasuje do ... najdłuższego wspólnego przedrostka i usuwa resztę ciągu. Jeśli nie ma najdłuższego wspólnego przedrostka, po prostu wszystko usuwa.
źródło
sed, 18
Miałem na myśli coś znacznie dłuższego i bardziej skomplikowanego, więc podziękowania za ten pomysł należą się do @ kirbyfan64sos .
Obejmuje +1 za
-r
opcję sed.źródło
CJam,
12826Wypróbuj online.
(Mam pomysł na użycie. = Zamiast .- po spojrzeniu na odpowiedź Dennisa.)
Z wszystkimi przypadkami na krawędzi, dla początkującego CJama, takiego jak ja, trudno było mówić krótko. Mam nadzieję, że to działa przynajmniej we wszystkich przypadkach.
źródło
C #,
201147 bajtówWiem, że to nie jest zbyt konkurencyjne. Chciałem tylko zobaczyć, jak to będzie wyglądać.
EDYCJA: Dzięki Ash Burlakzenko, Berend i Dennis_E
źródło
using System.*
?.ForEach(x=>Console.Write(x))
można skrócić do.ForEach(Console.Write)
using System.Collections.Generic;
jest niepotrzebne. Ogol jeszcze jeden bajt usuwając spację zstring[] a
.Contains
jest niepotrzebne. 2-Możesz zaoszczędzić kilka bajtów, usuwającusing System;
i mówiącSystem.Console.Write;
3-Ten kod zwraca zły wynik („a”) dla danych wejściowych „aab”, „aaab” z powoduIndexOf
. Najkrótsza poprawka, jaką mogłem wymyślić, toa[0].Take(a[1].Length)
długość 147 bajtów: „używając System.Linq; klasa {static void Main (string [] a) {a [0] .Take (a [1] .Length) .TakeWhile ((c, i) => a [1] [i] == c) .ToList (). ForEach (System.Console.Write);}} "Common Lisp, 39
Pobiera dwa argumenty łańcuchowe, określa indeks i tam, gdzie się różnią, i zwraca podłańcuch od 0 do i .
źródło
Perl 5,
201918 bajtów19 bajtów plus 1 dla
-E
flagi zamiast-e
:To są kopiowane bezwstydnie z cyfrowego Trauma „s sed odpowiedź . Zakłada się, że dane wejściowe to kilka słów bez spacji (lub przed pierwszym) i jedna spacja między nimi.
Aktualizacja:
ThisSuitIsBlackNot Sugeruje użycie
-pe
w następujący sposób, aby zapisać bajt (dzięki!):A następnie Luk Storms zasugerował użycie
-nE
następującego sposobu, aby zapisać kolejny bajt (dzięki!):(Liczę
-E
jako jeden bajt zamiast standardowego-e
, ale-n
lub-p
jako dwa. Mam wrażenie, że tutaj jest SPO).źródło
-M5.010
razie potrzeby jest bezpłatny” . Za ten sam meta post,-pe
czyli-ne
1 dodatkowy bajt, a nie 2. W ten sposóbperl -nE 'say/^(.*).* \1/'
uzyskałby 16 bajtów.Python 3, 72
31 bajtów zaoszczędzonych dzięki FryAmTheEggman. 8 zapisanych dzięki DSM.
źródło
zip
? : Dinput()
s wzip
i zapisaća
ib
wiążące.Python 3, 47
Funkcja, która pobiera listę
w
dwóch słów i drukuje wspólny przedrostek przed zakończeniem z błędem.print
Funkcja Pythona 3 umożliwia drukowanie napisów równo z sobąprint(end=c)
(dzięki Sp3000 za zapisanie 3 bajtów przy tej krótszej składni). Powoduje to wielokrotne pobranie dwóch liter ze słów i wypisanie pierwszej z nich. Indeksowaniec[c!=d]
powoduje błądc!=d
przekroczenia granicy, który kończy działanie, gdy napotkane zostaną dwie nierówne litery.Pętla jawna dla for jest o jeden znak dłuższa niż dla zrozumienia listy:
źródło
print(end=c[c!=d])
?print
za opcjonalnością oznaczał, że można go wywołać tylko z argumentem końcowym i że może on zawierać ciąg znaków. To naprawdę przydatna sztuczka. Powinieneś zrobić napiwek.JavaScript ES6, 52 bajty
Stosowanie:
źródło
ada,aca
...f=
(a,b)=>[...a].map((e,i)=>e==b[i]?e:b='').join``
Siatkówka , 14 bajtów
Używa tego samego pomysłu, co kirbyfan64sos . Niestety, pomimo twierdzenia Martina, że ostatecznie tryb dopasowania będzie zawierał sposób drukowania grup przechwytywania, nie został jeszcze wdrożony. W przeciwnym razie
(.*).* \1
może być używany wraz z około 2 bajtami dla niektórych nieistniejących jeszcze opcji łańcucha konfiguracji.Każda linia przejdzie do własnego pliku, z dodanym 1 bajtem na dodatkowy plik. Alternatywnie uruchom w jednym pliku z
-s
flagą.źródło
\1
zapewnia, że oba słowa zaczynają się od tego samego prefiksu. Tak więc bez względu na to w jaki sposób zachłanny(.*)
jest\1
to samo.K, 24 bajty
Znajdź minimalną długość każdego łańcucha. (
(&/#:'x)
). Przytnij każdy ciąg do tej długości (#'x
). Następnie porównaj, posmaruj i zsumuj wynikową sekwencję:Na koniec weź tyle znaków z pierwszego z dostarczonych ciągów (
#*x
).W akcji:
źródło
PowerShell, 65 bajtów
Porównaj ciągi, zmniejszając pierwsze, dopóki nie będzie pasowało (drukuj i wyjdź) lub łańcuch nie ma wartości zerowej, a pętla się kończy.
źródło
Julia, 62 bajty
Nie golfowany:
Naprawiono problem (kosztem 14 bajtów) dzięki xnor!
źródło
C99, 73 bajty
Podobne do tej odpowiedzi , ale krótsze i zgodne ze specyfikacją (pobiera dane wejściowe ze standardowego wejścia).
źródło
#include<stdio.h>
, co jest niezbędne do kompilacji programu.main(int c,char**a){for(;*a[1]==*a[2]++;putchar(*a[1]++));}
(59 bajtów).MATLAB,
5040 bajtówDefiniuje funkcję, która przyjmuje 2 łańcuchy jako dane wejściowe, dane wyjściowe do okna poleceń
To rozwiązanie będzie działać dla dowolnego ciągu wyjściowego
jeśli nie podano dopasowania.
Można grać w golfa za pomocą skryptu zamiast funkcji (używając lokalnych zmiennych a, b) (-16 bajtów).
więc otrzymujemy 34 bajty
Styl funkcji (który wydaje się być stylem przyjętym) daje wynik
(Dzięki @Stewie Griffin)
źródło
@(a,b)a(1:find([diff(char(a,b)) 1],1)-1)
. =)Perl 6 , 28 bajtów
Wymyśliłem dwa, które pobierają swoje wartości ze STDIN, które są oparte na odpowiedzi Perla 5.
Pierwszy wymaga dokładnie jednej spacji między wejściami, podczas gdy drugi wymaga co najmniej jednej spacji między wejściami.
To jest nieco krótsze niż pierwsza rzecz, której spróbowałem, która pobiera wartości z wiersza poleceń.
lub nawet jego wersja lambda:
Chociaż jest to o wiele łatwiejsze do dostosowania, tak że akceptuje dowolną liczbę ciągów wejściowych, kosztem tylko jednego pociągnięcia.
źródło
Japt, 27 bajtów
Japt to skrócona wersja Ja vaScri pt . Interpretator
(Struny przejść do pola wprowadzania tak:
"global" "glossary"
)Ten kod jest dokładnie równoważny z następującym JS:
Nie wdrożyłem jeszcze anonimowych funkcji, po co to
$...$
jest: wszystko między znakami dolara pozostaje nietknięte w przejściu na JS. Po dodaniu funkcji wystarczy ten 21-bajtowy kod:A po wdrożeniu kilku dodatkowych funkcji idealnie będzie to 18 bajtów:
Sugestie mile widziane!
Okazuje się, że ten program ma tylko 15 bajtów we współczesnym Japt:
Wypróbuj online!
źródło
MATL ,
119 bajtówWypróbuj online!
(-2 bajty dzięki Giuseppe)
źródło
y
Pomysł jest dobry ładna, bym spróbował rzeczy jak początkowyiti
zamiast1Gw
, ale nie myślę o użyciuy
tego.Clojure / ClojureScript, 51
Całkiem proste. Niestety odstępy wokół destrukcji parametrów są konieczne (takie są
[a & b]
rzeczy). Nie najkrótszy, ale pobiłem kilka innych odpowiedzi w językach, które lubią chwalić się ich zwięzłością, więc opublikuję to.źródło
Python 2, 50 bajtów
Wkład
Dane wejściowe są traktowane jako dwa ciągi:
Wydajność
Wynikiem jest każdy znak, po którym następuje spacja; co, mam nadzieję, nie stanowi problemu. Jeśli tak, to zmienię swoją odpowiedź.
źródło
"global" , "glossary"
(dwa osobne ciągi). Ile innych odpowiedzi odpowiada tej literze? @ThomasKwaprint(exit()if a!=b else a,end='')
? Nie wiem, czy to zadziała, czy nie, ale możeTeaScript, 16 bajtów
20Każde wejście jest oddzielone spacją.
źródło
PHP, 52 bajty
Nie spektakularny, ale spełnia swoją rolę:
Bierze dwa argumenty wiersza poleceń:
źródło
while(($a=$argv)[1][$i]==$a[2][$i])echo$a[1][$i++];
- Kolejne rozwiązanie tylko dla PHP7 (najlepiej, że mogę wymyślić @ 50 bajtów)<?=substr(($a=$argv)[1],0,strspn($a[1]^$a[2],~ÿ));
- Upewnij się, że twój edytor jest w trybie ascii, ważne~ÿ
jest, aby nie został przekonwertowany na Unicode.