W absurdalnej sztuce Rosencrantz i Guildenstern nie żyją , dwaj główni bohaterowie Rosencrantz i Guildenstern (czy są?) Zawsze mieszają, która z nich jest kim - a czasem która z ich części ciała jest - z powodu postrzeganego braku indywidualna tożsamość. Czy nie byłoby absurdalne, gdyby nawet tasowali się wokół swoich nazwisk?
Twoim zadaniem jest napisanie funkcji, która przyjmuje ciąg o parzystej długości (i z założenia wielokrotność 4), która jest większa niż 7 znaków, podziel ją i potasuj.
Podział będzie następujący : ciąg znaków będzie miał format "abscd"
, przy czym s będzie działało jak znak separatora. Pierwsza sekcja i separator abs
będą pierwszą połową łańcucha, podczas gdy druga połowa będziecd
Długość a
będzie(string length / 4) - 1
Długość b
będzie(string length / 4)
Długość s
będzie1
Długość c
będzie(string length / 4) + 1
Długość d
będzie(string length / 4) - 1
To może być bardzo mylące, dlatego pokażę kilka przykładów
("a" + "bb" + "s" + "ccc" + "d").length //8
1 2 1 3 1
|-------4--------| |----4-----| <--- (4 is half of 8)
("rosen" + "crantz" + "&" + "guilden" + "stern").length //24
5 6 1 7 5
("foo" + "barr" + "?" + "barry" + "foo").length
3 4 1 5 3
Wreszcie:
Następnie tasujesz części, generując adscb
dawny. "rosencrantz&guildenstern" --> "rosenstern&guildencrantz"
"foobarr?barryfoo" --> "foofoo?barrybarr"
Rulez:
- Standardowe luki są zabronione
- Dopuszczalne odpowiedzi: funkcja, która pobiera dane wejściowe przez jeden ciąg wejściowy i zwraca jeden ciąg wyjściowy
- Jeśli ciąg wejściowy nie spełnia powyższych wymagań, kod MUSI się nie powieść (nie ma znaczenia, jaki
Exception
lubError
) - To jest
code-golf
tak, że wygrywa najkrótsza (ważna) odpowiedź (w każdym języku)! - Punkty bonusowe za linijkę :-) (Niezupełnie, tylko fajne punkty)
Odpowiedzi:
K (oK) ,
353433 bajtówWypróbuj online!
Bez sprawdzania poprawności danych wejściowych (dla nagrody NNG),
252423 bajtówWypróbuj online!
Szybko nauczyłem się trochę K i patrząc na listę czasowników pomyślałem, że może tu działać alternatywne podejście ( bez użycia cięcia). I działało idealnie.
Jak to działa
źródło
Perl 6 ,
6058 bajtów-2 bajty dzięki Jo King
Wypróbuj online!
Zgłasza „Długość obrotowej podlisty jest poza zakresem” w przypadku błędu.
Wyjaśnienie
źródło
J ,
3635 bajtówWypróbuj online!
-1 bajt przez
{.
+ długości ujemne i;.2
który zamiast tego odcina je jako znaczniki „kończące”.Oryginalna odpowiedź, 36 bajtów
Wypróbuj online!
ngn wspomniał o „cut” w komentarzu do wcześniejszej odpowiedzi K i sprawiło, że wypróbowałem J, który ma to samo „cut” (nie mam pojęcia, jak działa K).
Jak to działa
Pamiętaj, że ta funkcja automatycznie obsługuje nieprawidłowe dane wejściowe:
{.
wyrzuca,domain error
ponieważ argumentem długości muszą być liczby całkowite.5 A.
rzucaindex error
.length error
jest wyrzucane.źródło
Python 3 ,
10310210197888684 bajtówWypróbuj online!
W rzeczywistości nie jest to jedna linijka, ale
;
jest o jeden bajt mniej na linię niż podział linii i wcięcie.Zgłasza,
ZeroDivisionError
jeśli długość ciągu wejściowego jest mniejsza niż 8 lub nie jest całkowitą wielokrotnością liczby 4.Działa również w Python 2.
-4 bajty dzięki Jo King
-9 bajtów dzięki ovs
-2 bajty dzięki Jonathanowi Frechowi
-2 bajty dzięki Bubblerowi
źródło
//=
na skrajną parę stała się zbędna. Wielkie dzięki!-l+1
<->1-l
?Perl 6 , 78 bajtów
Wypróbuj online!
Anonimowy blok kodu, który pobiera ciąg i zwraca zmodyfikowany ciąg, jeśli jest prawidłowy, w przeciwnym razie zwraca podział przez błąd zero. Wiem, że mogę modyfikować tablicę bezpośrednio, więc mogłem zamienić dwie sekcje łańcucha, ale nie jestem w stanie tego rozgryźć.
źródło
K (ngn / k) ,
1201131039995 bajtówMiejmy nadzieję, że można go bardziej pograć w golfa, zawiera dodatkową funkcję do testowania, czy długość łańcucha jest podzielna przez cztery, wyprowadza błąd w odniesieniu do niezadeklarowanej zmiennej, jeśli dane wejściowe są nieprawidłowe
EDYCJA: Utracony stan na długości większej niż 7, w tym
EDYCJA: W połączeniu z jedną funkcją usunięto zbędne deklaracje zmiennych
Wypróbuj online!
źródło
indices_string
)?Siatkówka 0.8.2 , 58 lub 73 lub 83 lub 93 bajty
Wypróbuj online! Wyjaśnienie:
Przechwytywanie
a
w$1
, i uczynić go możliwie jak najkrótszy*?
.$#2
,$#3
A$#4
skończyć jako długośća
.Capture
b
in$4
. Te(?<-2>.)+
zrzuty aż do długościa
, podczas gdy drugi.
dodaje 1 do jego długości, w miarę potrzeb.Przechwytywanie
s
ic
w$6
. Ich łączna długość jest o 3 większa niż długośća
.Capture
d
in$7
. Jego długość jest nie większa niż długośća
.Zrobiliśmy
a
tak krótko, jak to możliwe, ale nadal chcemy osiągnąć koniec danych wejściowych.Wymiana
b
id
.Powyższy etap nie weryfikuje danych wejściowych. Ponieważ Retina nie ma błędów w czasie wykonywania, istnieje wiele opcji sprawdzania poprawności danych wejściowych:
Nie wyświetla nic, jeśli długość jest mniejsza niż 8 lub nie jest wielokrotnością 4. (+15 bajtów)
Wyprowadzane,
Error
jeśli długość jest mniejsza niż 8 lub nie jest wielokrotnością 4. (+25 bajtów)Zawiesza się, jeśli długość jest mniejsza niż 8 lub nie jest wielokrotnością 4. (+35 bajtów)
źródło
C (GCC) z
-Dx=memcpy
i-DL=(l-1)
,154158160 bajtówZwraca NULL, jeśli długości ciągu wejściowego nie można podzielić przez 4 lub mniej niż 8 znaków.
Dziękujemy Rogemowi i Jonathanowi Frechowi za sugestie.
EDYCJA: Przeniesiony preprocesor definiuje do linii poleceń i dynamicznie przydziela ciąg, aby ściśle odpowiadał układance.
Wypróbuj online!
źródło
t[80]
? Wydaje się, że nie ma górnej granicy dotyczącej długości wejściowej.malloc()
Zamiast tego zmieniłem rozwiązanie .NULL
dla niepoprawnych danych wyjściowych, używa wartości zwracanych zmemcpy()
, makra podobnego do funkcji do pomijania typów i tablic o zmiennej długości C99 do pomijaniamalloc()
.//
albo-w
?-w
to tylko wygoda do tłumienia ostrzeżeń (więc łatwiej jest znaleźć błędy). Zazwyczaj dodam argumenty wiersza poleceń po tym,//
aby TIO policzyło dla mnie bajty, a następnie odejmuję 1 od sumy, aby uwzględnić jeden dodatkowy znak potrzebny do tego.Galaretka , 28 bajtów
(Jeśli dozwolony jest pełny program, możemy usunąć końcowe
F
).Jeśli długość jest mniejsza niż 8 lub nie jest podzielna przez cztery, a
ValueError
podczas dzielenia liczb całkowitychinf
( liczby zmiennoprzecinkowe) jest zwiększane o4
- podział dajeNaN
(także liczbę zmiennoprzecinkową), która wtedy nie może zostać obsadzonymint
.Wypróbuj online!
W jaki sposób?
źródło
Galaretka , 25 bajtów
Wypróbuj online!
Ẏ
Można usunąć, aby ten w pełnym programie.źródło
Rubinowy , 64 bajty
Wypróbuj online!
źródło
JavaScript (ES6),
9789 bajtówZaoszczędzono 8 bajtów dzięki @ l4m2
Wypróbuj online!
źródło
JavaScript (Node.js) , 80 bajtów
Wypróbuj online!
JavaScript (Node.js) , 84 bajtów
Wypróbuj online!
JavaScript (Node.js) , 87 bajtów
Wypróbuj online!
Krótszy niż RegExp
źródło
Java 8, 135 bajtów
Zgłasza
ArithmeticException
(dzieli przez zero), jeśli ciąg wejściowy nie spełnia wymagań. Wypróbuj online tutaj .Nie golfowany:
źródło
l/=l>7&l%4<1?4:0;
zamiastl=l>7&l%4<1?l/4:l/0;
C (gcc) , 129 bajtów
Zwraca przez modyfikację. Połącz z:
Plik źródłowy:
Wypróbuj online!
Degolf
źródło