Wyzwanie polega na napisaniu programu lub funkcji, która, gdy otrzyma dwa ciągi o równej długości, zamienia każdy inny znak i wyświetla / zwraca otrzymane ciągi w dowolnej kolejności.
Przykłady
"Hello," "world!" --> "Hollo!" "werld,"
"code" "golf" --> "codf" "gole"
"happy" "angry" --> "hnpry" "aagpy"
"qwerty" "dvorak" --> "qvertk" "dworay"
"1, 2, 3" "a, b, c" --> "1, b, 3" "a, 2, c"
"3.141592653589" "2.718281828459" --> "3.111291623489" "2.748582858559"
"DJMcMayhem" "trichoplax" --> "DrMcMoylex" "tJichapham"
"Doorknob" "Downgoat" --> "Doonkoot" "Dowrgnab"
"Halloween" "Challenge" --> "Hhlloeegn" "Caallwnee"
Zasady
- Ciągi będą zawierać tylko znaki ASCII (32-126).
- Ciągi będą zawsze tej samej długości i nigdy nie będą puste.
- Możesz zaakceptować dane wejściowe w dowolnym odpowiednim formacie: oddzielne parametry, elementy w tablicy, oddzielone jedną lub kilkoma znakami nowej linii, nawet połączone. Jedynym ograniczeniem jest to, że jeden ciąg musi w pełni się przed innymi (np
a1\nb2\nc3
za"abc", "123"
to nieważne). - Dane wyjściowe mogą być w dowolnej kolejności (tzn. Możesz rozpocząć zamianę od pierwszego lub drugiego znaku) i w dowolnym prawidłowym formacie wymienionym powyżej. (Tablica 2-elementowa, oddzielona znakiem nowego wiersza, połączona itp.)
Punktacja
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach dla każdego języka.
DrMcMoylex
. : DOdpowiedzi:
Haskell, 37 bajtów
Zipuje dwa ciągi, na przemian zamieniając znaki, a następnie rozpina je.
37-bajtowa rekurencyjna alternatywa:
źródło
Python, 42 bajty z golfem we / wy
Zamienia każdą inną postać z dwóch list. Pobiera na wejściu dwie listy znaków i wysyła je poprzez ich modyfikację .
daje
źródło
Vim,
18, 17 bajtówWypróbuj online!
Używa interpretera V ze względu na kompatybilność wsteczną. Dane wejściowe są w tym formacie:
Wyjaśnienie:
źródło
x
zamiast,yl
a następnie jusP
zamiast drugiejvP
:lqqxjvPkPll@qq@q
[save]
przycisk? Tak czy inaczej, to nie działa dla mnie . Prawdziwym powodem jest to, że kiedy jesteśx
ostatnim znakiem w linii, przesuwa on kursor w lewo, zaburzając miejsce zamiany.Haskell, 41 bajtów
Zwraca parę z ciągami znaków. Przykład użycia:
( (unzip.).(#) ) "Hello," "world!"
->("Hollo!","werld,")
.Proste podejście rekurencyjne: weź pierwszy znak każdego ciągu jako parę i dołącz wywołanie rekurencyjne z zamienionymi (resztą) ciągami.
unzip
tworzy parę list z listy par.źródło
05AB1E ,
1110 bajtówWypróbuj online!
Wyjaśnienie
input =
["code", "golf"]
użyty jako przykład.źródło
Perl, 48 bajtów
Liczba bajtów zawiera 47 bajtów kodu i
-p
flagi.Uruchom z
-p
i-E
flag. Oczekuj każdego łańcucha w innym wierszu:Objaśnienia :
-p
: przechwytuj dane wejściowe$_
i drukuje je na końcu. (aby pobrać i wydrukować pierwszy ciąg)<>
: uzyskaj wiersz danych wejściowych. (aby uzyskać drugi ciąg).=~
: Zastosować regex<>
:s%%%geer
, gdzie dziękir
zwracana jest zmodyfikowany ciąg (a następnie drukowane dziękisay
).Wyrażenie regularne:
.\K(.)
znajduje dwa znaki i zastępuje drugi wynikiem oceny tego kodu"s/.{$-[0]}\\K(.)/$1/;\$1"
:Pierwsza część
s/.{$-[0]}\\K(.)/$1/
stosuje wyrażenie regularne do$_
:.{$-[0]}
pomija pierwsze znaki, aby dostać się do tego samego punktu, co wyrażenie regularne (ponieważ$-[0]
zawiera indeks pierwszej grupy przechwytywania, czyli w takim przypadku indeks znaków do zastąpienia), a następnie przechwytujemy znak za pomocą(.)
i zamień go na znak regex zewnętrzny ($1
). A potem dodajemy,$1
więc wynikiem"s/.{$-[0]}\\K(.)/$1/;\$1"
jest postać, którą złapaliśmy w wewnętrznym wyrażeniu regularnym.Być może zauważyłeś, że
$1
odnoszą się one do znaku, który chcemy zastąpić w obu ciągach (czyli dwóch różnych znakach), dlatego gramy z/ee
modyfikatorem wyrażenia regularnego, który ocenia prawą stronę wyrażenia dwa razy: pierwszy zastąpi tylko to,$1
co jest poprzedzone przez\
.źródło
Python, 55 bajtów
Krajanie na plastry!
58 bajtów:
64 bajty:
Rekurencyjnie gromadzi znaki dwóch ciągów do
s
it
, i wysyła ich parę na końcu. Zmiana odbywa się poprzez przełączanie ciągów wejściowych każdego połączenia rekurencyjnego. Wyjście łańcucha rozdzielanego spacjami miało tę samą długość:To wąsko pokonało inną strategię rekurencyjną polegającą na naprzemiennym pobieraniu znaków z każdego ciągu, przy czym każdy z dwóch możliwych ciągów był pierwszy. (65 bajtów)
źródło
MATL ,
111098 bajtówDzięki produktom ETH za 1 bajt off!
Wejście znajduje się tablica 2D zawierające dwa ciągi, takich jak:
['Halloween'; 'Challenge']
. Łańcuchy wyjściowe są w odwrotnej kolejności.Wypróbuj online!
Wyjaśnienie
Stara wersja: 9 bajtów
Wyjaśnienie
źródło
Galaretka , 5 bajtów
Dane wejściowe są osobnymi argumentami, dane wyjściowe są konkatenowane.
Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
Jak to działa
źródło
Galaretka ,
986 bajtówDzięki Dennis za oszczędność 2 bajtów!
Używa kodowania Jelly .
Wypróbuj online!
źródło
ṙ"J$
zamiastĖṙ@/€
. Oddzielenie łańcucha nie jest również wymagane, więc możesz upuścićY
.V , 12 bajtów
Wypróbuj online!
Nic ciekawego, tylko bezpośredni port mojej odpowiedzi vima, abym mógł konkurować z (ale nie pokonałem) 05AB1E.
źródło
Pyke, 9 bajtów
Wypróbuj tutaj!
źródło
JavaScript (ES6), 51
54Edytuj 3 bajty zapisane thx @Neil
Funkcja z tablicą wejścia / wyjścia
Jeszcze mi się podoba, ale jest 55 (2 ciągi wejściowe, tablica wyjściowa)
Test
źródło
replace
oszczędza 3 bajty:p=>p.map((w,i)=>w.replace(/./g,(c,j)=>a[i+j&1][j]))
.Pyth, 8 bajtów
Wypróbuj online: demonstracja
Transponuje słowa, odwraca czasy bieżących indeksów każdej pary liter, transponuje ponownie.
źródło
JavaScript (ES6), 55 bajtów
Chciałem zrobić coś sprytnego, używając wyrażenia regularnego do zamiany alternatywnych znaków, ale ostatecznie zajęło to
6757 bajtów:źródło
f=([a,...A],[b,...B])=>a?[a+f(B,A)[0],b+f(A,B)[0]]:[""]
taką samą długość.map
, to ogoliłem 10 bajtów z mojej odpowiedzi wyrażenia regularnego . Ale wciąż za długo.Perl, 40 bajtów
Obejmuje +1 dla
-n
Podaj ciągi jako linie na STDIN
interlace.pl
źródło
Java,
132103100 bajtówPodziękowania dla Kevina Cruijssena za zasugerowanie zwrotu tablicy (między innymi ulepszeniami) i oszczędność 29 bajtów! Również Olivier Grégoire za 3 bajty!
Nazywany tak:
Wydajność:
Hollo,werld!
Wykorzystuje fakt, że dane wejściowe można zasadniczo sformatować w jakikolwiek sposób (w tym przypadku tablicę ciągów znaków oddzielonych przecinkiem), a także dość łagodne reguły wyjściowe.
źródło
char[]c(char[]s,int l){for(int o=l,t;o-->0;)if(l%2>0){t=s[l];s[l]=s[l+o+1];s[l+o+1]=(char)t;}return s;}
( 103 bajty ) z wyjściem zwracanym zamiast drukowanym bezpośrednio. Przykładowe dane wejścioweSystem.out.println(c("Hello,world!".toCharArray(), 5));
:; Przykład Wydajność:Hollo,werld!
.Hollo!werld,
i nieHollo,werld!
(interpunkcja jest niepoprawna). Wierzę, że można to naprawić za pomocą wartości wejściowej 6 zamiast 5.t
sięchar
, dlaczego nie można zadeklarować to w pętli for bezpośrednio jakochar
? Zaoszczędziłbyś na tym kilka bajtów.C, 124 bajty
Zadzwoń z:
Długość łańcucha jest ograniczona do 98 znaków.
źródło
Oktawa ,
6461 bajtówAnonimowa funkcja, która wprowadza tablicę znaków 2D z każdym ciągiem w wierszu i generuje dane wyjściowe w tym samym formacie.
Wypróbuj w Ideone .
źródło
Rakieta 208 bajtów
Nie golfowany:
Testowanie:
Wydajność:
Powyżej jest wersja rekurencyjna.
Wersja iteracyjna:
Nie golfowany:
źródło
PowerShell v2 +, 82 bajty
Wciąż gra w golfa ...Nie. Nie wydaje się, że gra w golfa w dół bez użycia wyrażenia regularnego jak inne odpowiedzi (boo na algorytmach kopiowania).Więc bierzemy
$a
i$b
jako łańcuchy, ustawiamy indeks$i
na0
, rzutujemy$a
jakochar
-array i wysyłamy go przez pętlę|%{...}
. W każdej iteracji łączymy łańcuch znaków$c
i$d
indeksujemy w tablicy select-select (tzn. Tak, że zmienia się tam iz powrotem). Następnie wychodzimy$c
i czekamy$d
, a wyjście przez domniemaneWrite-Output
dzieje się po zakończeniu programu.źródło
Lithp , 120 znaków (+3 dla flagi -v1)
Podział linii na 2 dla czytelności:
Wymaga
-v1
flagi,run.js
ponieważ niektóre funkcje nie są jeszcze częścią standardowej biblioteki.Przykładowe użycie:
Tego rodzaju podkreśla, że nie spędziłem wystarczająco dużo czasu na standardowej bibliotece. Konieczność
js-bridge/1
dwukrotnego użycia i długiej formy wyrażenia regularnego, a także wywołanie mapy za pomocąinvoke/*
wszystkich tych elementów przyczynia się do tego, że jest to znacznie dłużej, niż trzeba.Czas na więcej pracy nad moją standardową biblioteką.
źródło
PHP, 79 bajtów
Poprzednia wersja PHP, 82 bajtów
źródło
for(...)echo$a[1+$i%2][$i];echo" $y";
(-2)for(;$i<=strlen(($a=$argv)[1]);$y.=$a[2-$i%2][$i++])echo$a[1+$i%2][$i]??" $y";
to kolejne -2, choć wymaga php 7Notice: String offset cast occurred in Command line code on line 1
C,
5452 bajtówZakłada, że wyjście
c
ma już pożądaną długość.Stosowanie:
}
Jeśli nalegasz na utworzenie wyniku, oto 91-bajtowe rozwiązanie:
Stosowanie:
źródło
C, 150 bajtów
Użyłem typowych pominięć plików nagłówkowych oraz
main()
typu zwrotu i instrukcji return. Wyświetla ostrzeżenie, ale kompiluje się bez problemu. Użyłem także sztuczki specyficznej dla GCC, która pozwala na deklaracje tablicowe z wyrażeniami zmiennymi.Program oczekuje ciągów z linii poleceń i jako taki, program powinien być uruchamiany z
./a.out string1 string2
.Lub bardziej czytelnie,
źródło
Mathematica, 51 bajtów
Pobiera dane wejściowe jako tablicę dwóch tablic znaków, z danymi wyjściowymi w tym samym formacie. Funkcja po prostu konstruuje nową tablicę za pomocą operacji (mod 2).
źródło
QBasic 4.5, 172 bajty
Ojej, ten staje się bolesny z powodu starego QBasica ...
Ciekawostka: używanie
DEFSTR
zaoszczędzonych bajtów więcej niż kosztuje, ponieważ teraz mogłem użyćA
zamiasta$
.źródło
QBIC , 112 bajtów
QBIC może usprawnić wiele elementów kotłowych QBasic, ale główny
MID$
silnik nadal musi zostać wykonany w QBasic, ponieważ QBIC nie ma funkcji podciągania. Mimo to oszczędza mi 60 bajtów.źródło
MIND$
=>MIN$
w tekście.Java, 68 bajtów
Niegolfowany i testowany
źródło
APL, 12
Objaśnienie: {...} definiuje funkcję, ⍵ jest właściwym argumentem. Ujęcie (↑) tworzy macierz z dwóch ciągów, a następnie obraca każdą kolumnę (⊖) n razy, gdzie n jest częścią w nawiasie (⍳⍴⊃⍵). Jest to zdefiniowane jako jota długości pierwszego argumentu. (Np .: długość = 5 ==> 1 2 3 4 5). Tak więc pierwsza kolumna jest obracana raz, druga dwa razy (powrót do pierwotnych pozycji), trzecia kolumna trzy razy itp.
Wypróbuj na tryapl.org
źródło