Najdłuższy wspólny prefiks 2 ciągów


30

Napisz program, który pobiera 2 ciągi jako dane wejściowe i zwraca najdłuższy wspólny przedrostek. To jest , 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"
""

1
Innym dobrym przypadkiem testowym jest "aca", "aba".
Morgan Thrapp

2
Czy chcesz mieć kompletne programy, które wprowadzają dane ze STDIN i drukują do STDOUT, czy też funkcje są w porządku?
xnor

2
Czy możemy założyć, że dane wejściowe nie będą zawierać nowych linii? Jakie znaki będą miały dane wejściowe?
Downgoat,

5
Uwaga ogólna: osoby korzystające z wyrażeń regularnych nie powinny kopiować odpowiedzi wyrażeń regularnych innych osób bez ich samodzielnego przetestowania; nie działa to we wszystkich silnikach wyrażeń regularnych. W szczególności daje różne (oba nieprawidłowe) odpowiedzi w nvi i vim.
Random832,

1
Wszystkie podane przykłady pisane są małymi literami, ale czy musimy się martwić o rozróżnianie wielkości liter? Na przykład powinieneś globali GLOSSARYwróć glolub ''?
AdmBorkBork,

Odpowiedzi:


22

Python 3, 54 bajty

Dzięki Python za posiadanie wbudowanej funkcji do tego zadania! :RE

import os;print(os.path.commonprefix(input().split()))

Pobiera dane wejściowe jako dwa słowa oddzielone spacją, np glossary global.


21

Haskell, 29 bajtów

(c:x)%(d:y)|c==d=c:x%y;_%_=""

Stosowanie:

>> "global"%"glossary"
"glo"

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.


11

Pyth, 8 7 bajtów

e@F._MQ

Dzię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

e@F._MQ        : implicit Q = eval(input)
   ._MQ        : Map the prefix operator onto both inputs
 @F            : Fold the setwise intersection operator over those lists
e              : Take the last such element, the prefixes are always made from shortest
               : to longest, so this always gives the longest matching prefix

Aby wynik pusty ciąg bez błędu: e|@F._M.z]k.
kirbyfan64sos

@ kirbyfan64sos Wierzę, że rzecz, którą wkładam w otaczanie go #...qjest o jeden bajt mniej niż, będę edytować pełny kod, myślę, że jest to mylące
FryAmTheEggman

1
Wprowadź dane w formularzu "abc", "def"i możesz użyć Qzamiast.z
isaacg

10

C ++, 101 100 99 bajtów

#include<iostream>
int i;main(){std::string s,t;std::cin>>s>>t;for(;s[i]==t[i];std::cout<<s[i++]);}

Odczytuje 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.


4
To piękne i przerażające użycie foroświadczenia ...
Joshpbarron

Pętla nie zakończyłaby się, gdyby łańcuchy były równe.
Jon Trauntvein

2
Nie będzie działać w przypadku ciągów znaków zawierających białe spacje. Możesz zaoszczędzić jeden bajt, robiąc int iw globalnej przestrzeni (tak, że będzie 0 zainicjowany)
Zereges

@JonTrauntvein Myślę, że ten przypadek to UB (?). Jednak działa dla mnie ™. (gcc-5.1)
sweerpotato,

9

Haskell, 38 bajtów

((map fst.fst.span(uncurry(==))).).zip

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.


9

CJam, 12 11 9 bajtów

l_q.-{}#<

Odczytuje 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

l_         e# Read a line (w/o trailing LF) from STDIN and push a copy.
  q        e# Read another line from STDIN (with trailing LF).
           e# The trailing linefeed makes sure that the lines are not equal.
   .-      e# Perform vectorized character subtraction. This yields 0 for equal
           e# characters, a non-zero value for two different characters, and the
           e# characters themselves (truthy) for the tail of the longer string.
     {}#   e# Find the index of the first truthy element.
        <  e# Keep that many characters from the first string.

Cholera, nie mogę uwierzyć, że moja pierwsza odpowiedź była tak blisko!
geokavel

1
Możesz oszukiwać, zakładając końcową linię i użycie l_q.-.
jimmy23013

@ jimmy23013 To standard dla danych wejściowych w systemach operacyjnych typu Unix, więc dlaczego nie? Dzięki!
Dennis

8

APL, 13

{⊃↓K/⍨=⌿K←↑⍵}

Jest to funkcja, która pobiera tablicę dwóch ciągów znaków i zwraca prefiks:

      {⊃↓K/⍨=⌿K←↑⍵}'glossary' 'global'
glo
      {⊃↓K/⍨=⌿K←↑⍵}'department' 'depart'
depart

Czy naprawdę można powiedzieć, że alfabet APL jest alfabetem znaków w bajtach? A może jest to standardowa praktyka?
Filipq

9
@Filipq Odpowiedzi tutaj wykorzystują kodowanie najbardziej naturalne dla języka. APL ma własną stronę kodową, na której każdy znak jest pojedynczym bajtem.
Alex A.,

7

AppleScript, 215 bajtów

I tak bardzo się starałem ...; (

ustaw x na (wyświetl okno dialogowe „domyślna odpowiedź” ”)
ustaw tekst na „wyświetl okno dialogowe” „domyślna odpowiedź” „) wrócił
ustaw n na 1
ustaw o na „”
powtórz, gdy element x n = element a n
ustaw o na pozycję o & x n
ustaw n na n + 1
koniec
o

Chciałem zobaczyć, jak dobrze AppleScript może to zrobić, a człowiek nie jest zbudowany do porównywania ciągów.


12
AppleScript nie został stworzony do niczego .
kirbyfan64sos

Jedyną rzeczą, której używam do tego oprócz okropnych golfów, jest tell app "System Events" to <something>. Jest to interesujące zobaczyć, jak zajmuje się tego rodzaju rzeczy, choć. @ kirbyfan64sos
Addison Crump



6

CJam, 12 8 26

r:AAr:B.=0#_W={;;ABe<}{<}?

Wypró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.


6

C #, 201 147 bajtów

using System.Linq;class a{static void Main(string[]a){a[0].Take(a[1].Length).TakeWhile((t,i)=>a[1][i]==t).ToList().ForEach(System.Console.Write);}}

Wiem, ż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


2
Uzyskiwanie odpowiedzi w języku C # poniżej 250 bajtów jest konkurencyjne. Nie możesz po prostu using System.*?
klaszcz

1
.ForEach(x=>Console.Write(x))można skrócić do.ForEach(Console.Write)
Ash Burlaczenko

1
using System.Collections.Generic;jest niepotrzebne. Ogol jeszcze jeden bajt usuwając spację z string[] a.
Berend

2
1-The Containsjest niepotrzebne. 2-Możesz zaoszczędzić kilka bajtów, usuwając using System;i mówiąc System.Console.Write;3-Ten kod zwraca zły wynik („a”) dla danych wejściowych „aab”, „aaab” z powodu IndexOf. Najkrótsza poprawka, jaką mogłem wymyślić, to a[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);}} "
Dennis_E

Dzięki za komentarze, kiedy mam przerwę, przyjrzę się im wszystkim, szczególnie komentarzowi Dennis_E.
Jakotheshadows,

5

Common Lisp, 39

(lambda(a b)(subseq a 0(mismatch a b)))

Pobiera dwa argumenty łańcuchowe, określa indeks i tam, gdzie się różnią, i zwraca podłańcuch od 0 do i .


5

Perl 5, 20 19 18 bajtów

19 bajtów plus 1 dla -Eflagi zamiast -e:

say<>=~/^(.*).* \1/

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 -pew następujący sposób, aby zapisać bajt (dzięki!):

($_)=/^(.*).* \1/

A następnie Luk Storms zasugerował użycie -nEnastępującego sposobu, aby zapisać kolejny bajt (dzięki!):

say/^(.*).* \1/

(Liczę -Ejako jeden bajt zamiast standardowego -e, ale -nlub -pjako dwa. Mam wrażenie, że tutaj jest SPO).


1
„w -M5.010razie potrzeby jest bezpłatny” . Za ten sam meta post, -peczyli -ne1 dodatkowy bajt, a nie 2. W ten sposób perl -nE 'say/^(.*).* \1/'uzyskałby 16 bajtów.
ThisSuitIsBlackNot

4

Python 3, 72

31 bajtów zaoszczędzonych dzięki FryAmTheEggman. 8 zapisanych dzięki DSM.

r=''
for x,y in zip(input(),input()):
 if x==y:r+=x
 else:break
print(r)

Czym byliby programiści Python zip? : D
Beta Decay

7
@BetaDecay Nasza mucha będzie otwarta cały czas.
Morgan Thrapp

Możesz umieścić input()s w zipi zapisać ai bwiążące.
DSM,

@DSM Ooo, dobra uwaga. Dzięki!
Morgan Thrapp,

4

Python 3, 47

def f(w):[print(end=c[c!=d])for c,d in zip(*w)]

Funkcja, która pobiera listę wdwóch słów i drukuje wspólny przedrostek przed zakończeniem z błędem.

printFunkcja 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. Indeksowanie c[c!=d]powoduje błąd c!=dprzekroczenia 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:

def f(w):
 for c,d in zip(*w):print(end=c[c!=d])

Łał! Nawet nie pomyślałem o użyciu funkcji! Niezłe. +1
Zach Gates,

Widziałem to teraz, ale co powiesz na print(end=c[c!=d])?
Sp3000,

1
@ Sp3000 Wow, nigdy nie połączyłem się z tym, że główny argument printza 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.
xnor

3

JavaScript ES6, 52 bajty

f=(a,b)=>[...a].filter((e,i)=>e==b[i]?1:b='').join``

Stosowanie:

>> f("global","glossary")
"glo"

Nie działa z ada,aca...
flawr

Ups, naprawione. Zapomniałem zabić filtrowania, gdy łańcuchy już nie pasują.
Dendrobium

1
Nie musisz nazywać tej funkcji, więc możesz pominąćf=
Ypnypn

1
możesz zrobić to mniej za pomocą mapy(a,b)=>[...a].map((e,i)=>e==b[i]?e:b='').join``
Shaun H

2

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 (.*).* \1może być używany wraz z około 2 bajtami dla niektórych nieistniejących jeszcze opcji łańcucha konfiguracji.

(.*).* \1.*
$1

Każda linia przejdzie do własnego pliku, z dodanym 1 bajtem na dodatkowy plik. Alternatywnie uruchom w jednym pliku z -sflagą.


Odpowiednik wyrażenia regularnego nie pasuje w vimie ze względu na zachłanność (a wyrażenie niezbyt chciwe będzie pasować do najkrótszego podłańcucha, tj. Pustego), czy na pewno działa?
Random832,

@ Random832 Spróbuj użyć tego testera zastępowania wyrażeń regularnych z zaznaczoną opcją .NET. Ustaw operację na „zamień” i umieść wzory w odpowiednich polach. Nie jest to niezgodne, jeśli powinno być. Jak to możliwe, że nie z powodu chciwości? To jedyny powód, dla którego działa. \1zapewnia, ż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 \1to samo.
mbomb007,

W vimie w ogóle nie pasuje - myślę, że szuka dłuższego ciągu dla pierwszego (. *), A następnie nie dopasowuje go do \ 1, a następnie nieprawidłowo powraca do krótszych ciągów.
Random832,

@ Random832 Następnie musisz znaleźć coś innego do przetestowania wyrażeń regularnych.
mbomb007

2

K, 24 bajty

{(+/&\=/(&/#:'x)#'x)#*x}

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ę:

  =/("globaa";"glossa")
1 1 1 0 0 1
  &\=/("globaa";"glossa")
1 1 1 0 0 0
  +/&\=/("globaa";"glossa")
3

Na koniec weź tyle znaków z pierwszego z dostarczonych ciągów ( #*x).

W akcji:

 f: {(+/&\=/(&/#:'x)#'x)#*x};
 f'(("global";"glossary")
    ("department";"depart")
    ("glove";"dove")
    ("aaa";"aaaaa")
    ("identical";"identical")
    ("aca";"aba"))
("glo"
 "depart"
 ()
 "aaa"
 "identical"
 ,"a")

2

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.

param($a,$b)while($a){if($b-like"$a*"){$a;exit}$a=$a-replace".$"}

2

Julia, 62 bajty

f(a,b)=(c="";for(i,j)=zip(a,b) i!=j?break:(c*=string(i))end;c)

Nie golfowany:

function f(a::AbstractString, b::AbstractString)
    # Initialize an output string
    c = ""

    # Iterate over the pairs of characters in a and b,
    # truncated to the shorter of the two lengths
    for (i, j) in zip(a, b)
        if i == j
            # If they match, append to the output string
            c *= string(i)
        else
            # Otherwise stop everything!
            break
        end
    end

    return c
end

Naprawiono problem (kosztem 14 bajtów) dzięki xnor!


2

C99, 73 bajty

main(int c,char *a[]){for(char *x=a[1],*y=a[2];*x==*y++;putchar(*x++));}

Podobne do tej odpowiedzi , ale krótsze i zgodne ze specyfikacją (pobiera dane wejściowe ze standardowego wejścia).


Spec nie mówi, że dane wejściowe muszą pochodzić ze standardowego wejścia. Jest to w rzeczywistości dłuższe niż druga odpowiedź, jeśli dodasz #include<stdio.h>, co jest niezbędne do kompilacji programu.
musarithmia,

@AndrewCashner - Nie musi być ustawiony na standardowe wejście, ale musi pobierać dane wejściowe. Druga odpowiedź jest zakodowana na stałe. Ponadto gcc narzeka na temat domniemanego użycia, ale kompiluje się dobrze bez uwzględnienia.
Comintern,

Znacznie krótszy bez tymczasowych: main(int c,char**a){for(;*a[1]==*a[2]++;putchar(*a[1]++));}(59 bajtów).
Toby Speight

2

MATLAB, 50 40 bajtów

Definiuje funkcję, która przyjmuje 2 łańcuchy jako dane wejściowe, dane wyjściowe do okna poleceń

function t(a,b);a(1:find([diff(char(a,b)) 1],1)-1)

To rozwiązanie będzie działać dla dowolnego ciągu wyjściowego

ans =

   Empty string: 1-by-0

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

a(1:find([diff(char(a,b)) 1],1)-1)

Styl funkcji (który wydaje się być stylem przyjętym) daje wynik

@(a,b)a(1:find([diff(char(a,b)) 1],1)-1)

(Dzięki @Stewie Griffin)


40 bajtów: @(a,b)a(1:find([diff(char(a,b)) 1],1)-1). =)
Stewie Griffin

2

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.

lines~~/(.*).*' '$0/;say ~$0
lines~~/:s(.*).* $0/;say ~$0

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ń.

say [~] map ->($a,$b){$a eq$b&&$a||last},[Z] @*ARGS».comb # 58 bytes

lub nawet jego wersja lambda:

{[~] map ->($a,$b){$a eq$b&&$a||last},[Z] @_».comb} # 52 bytes

Chociaż jest to o wiele łatwiejsze do dostosowania, tak że akceptuje dowolną liczbę ciągów wejściowych, kosztem tylko jednego pociągnięcia.

{[~] map ->@b {([eq] @b)&&@b[0]||last},[Z] @_».comb} # 53 bytes
#          ┗━┛ ┗━━━━━━━┛  ┗━━━┛
my &common-prefix = {[~] map ->@b {([eq] @b)&&@b[0]||last},[Z] @_».comb}

say common-prefix <department depart>; # "depart"
say common-prefix; # ""
say common-prefix <department depart depot deprecated dependant>; # "dep"

# This code does not work directly with a single argument, so you have
# to give it an itemized List or Array, containing a single element.

say common-prefix $('department',); # "department"

# another option would be to replace `@_` with `(@_,)`

2

Japt, 27 bajtów

Japt to skrócona wersja Ja vaScri pt . Interpretator

Um$(X,Y)=>$A&&X==VgY ?X:A=P

(Struny przejść do pola wprowadzania tak: "global" "glossary")

Ten kod jest dokładnie równoważny z następującym JS:

A=10;(U,V)=>U.split``.map((X,Y)=>A&&X==V[Y]?X:A="").join``

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:

UmXY{A&&X==VgY ?X:A=P

A po wdrożeniu kilku dodatkowych funkcji idealnie będzie to 18 bajtów:

UmXY{AxX=VgY ?X:AP

Sugestie mile widziane!


Okazuje się, że ten program ma tylko 15 bajtów we współczesnym Japt:

¡A©X¥VgY ?X:A=P

Wypróbuj online!


2

MATL , 11 9 bajtów

y!=XdYpf)

Wypróbuj online!

(-2 bajty dzięki Giuseppe)

 y  % implicitly input the two strings, then duplicate the
    %  first one into the stack again
    %  stack: ['department' 'deported' 'department']
 !  % transpose the last string into a column vector
 =  % broadcast equality check - gives back a matrix comparing
    %  every letter in first input with the letters in the second
 Xd % diagonal of the matrix - comparison result of each letter with
    %  only corresponding letter in the other string
    %  stack: ['department' [1; 1; 1; 0; 1; 1; 0; 0;]]
 Yp % cumulative product (so only initial sequence of 1s remains
    %  1s, others become 0)
    %  stack: ['department' [1; 1; 1; 0; 0; 0; 0; 0;]]
 f  %  find the indices of the 1s
 )  % index at those elements so we get those letters out
    % (implicit) convert to string and display

Dzięki! yPomysł jest dobry ładna, bym spróbował rzeczy jak początkowy itizamiast 1Gw, ale nie myślę o użyciu ytego.
Sundar - Przywróć Monikę

1

Clojure / ClojureScript, 51

(defn f[[a & b][c & d]](if(= a c)(str a(f b d))""))

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.


1

Python 2, 50 bajtów

for a,b in zip(*input()):print(1/0if a!=b else a),

Wkład

Dane wejściowe są traktowane jako dwa ciągi:

"global", "glossary"

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ź.

g l o 

Jestem prawie pewien, że to jest nieprawidłowe; specyfikacja wyraźnie podaje format wyjściowy jako ciąg bez spacji.
lirtosiast

No tak, ale dane wejściowe podano również w formacie "global" , "glossary"(dwa osobne ciągi). Ile innych odpowiedzi odpowiada tej literze? @ThomasKwa
Zach Gates

„trwa dwa ciągi” to język używany przez OP; zwykle, gdy coś takiego jest wspomniane bez żadnych kwalifikatorów, odnosi się do jednego z naszych domyślnych We / Wy , co oznacza, że ​​możemy pobrać jeden ciąg z wiersza poleceń i jeden ze STDIN, lub tablicę dwóch ciągów, lub cokolwiek innego po nich zasady.
lirtosiast

Myślę, że traktujesz moją odpowiedź zbyt poważnie. To tylko zabawne przesłanie i moja najlepsza próba pokonania wbudowanego. Jeśli OP nie lubi formatu wyjściowego, niech tak będzie; Usunę moją odpowiedź. @ThomasKwa
Zach Gates

Jak o print(exit()if a!=b else a,end='')? Nie wiem, czy to zadziała, czy nie, ale może
Beta Decay

1

TeaScript, 16 bajtów 20

xf»l¦y[i]?1:b=0)

Każde wejście jest oddzielone spacją.


1

PHP, 52 bajty

Nie spektakularny, ale spełnia swoją rolę:

$a=$argv;while($a[1][$i]==$a[2][$i])echo$a[1][$i++];

Bierze dwa argumenty wiersza poleceń:

php prefix.php department depart

PHP7 pozwala zaoszczędzić kolejny bajt 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.
Leigh
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.