Pisząc mój esej dla Szekspira, zdałem sobie sprawę, że muszę skrócić odniesienia do cytatów, aby uzyskać łatwiejsze do opanowania długości. Wcześniej pisałem to:
(Act 1, Scene 2, Lines 345-346)
Ale teraz powiedziano mi, aby napisać je w ten sposób:
(I.ii.345-6)
Najwyraźniej potrzebuję trochę kodu do gry w golfa, aby trochę odwołać moje cytaty z Szekspira.
Zadanie
Napisz program lub funkcję, która po wprowadzeniu ciągu znaków zgodnego z szablonem 1 lub 2 wydrukuje lub zwróci ciąg znaków odpowiednio według szablonu 3 lub 4. Musisz tylko wspierać akty od 1 do 5 i sceny od 1 do 9.
Szablony
Szablon 1
(Act x, Scene y, Lines a-b)
Możesz założyć, że x
nigdy nie przekracza 5, y
nigdy nie przekracza 9 a
i b
zawsze są dodatnimi liczbami całkowitymi nieprzekraczającymi maksymalnej dodatniej standardowej wartości całkowitej twojego języka i a
zawsze są wyłącznie mniejsze niż b
.
Szablon 2
(Act x, Scene y, Line a)
Takie same warunki jak w szablonie 1, z wyjątkiem informacji o b
.
Szablon 3
(x.y.a-b)
Gdzie x
jest wielką cyfrą rzymską, y
jest małą cyfrą rzymską, a
i b
są liczbami, i b
jest skrócony tylko do cyfr mniejszych niż pierwsza różniąca się cyfra o równym znaczeniu a
.
Szablon 4
(x.y.a)
Takie same warunki jak w szablonie 3, z wyjątkiem informacji o b
.
Przypadki testowe
Niech f(s)
będzie funkcją zdefiniowaną w Zadaniu. ""
oznacza wartość ciągu.
>>> f("(Act 1, Scene 2, Lines 345-346)")
"(I.ii.345-6)"
>>> f("(Act 3, Scene 4, Lines 34-349)")
"(III.iv.34-349)"
>>> f("(Act 5, Scene 9, Lines 123-234)")
"(V.ix.123-234)"
>>> f("(Act 3, Scene 4, Line 72)")
"(III.iv.72)"
>>> f("(Act 2, Scene 3, Lines 123-133)")
"(II.iii.123-33)"
>>> f("(Act 4, Scene 8, Lines 124-133)")
"(IV.viii.124-33)"
Na potrzeby tego wyzwania muszą być obsługiwane następujące tłumaczenia cyfr arabskich na rzymskie:
1 i I
2 ii II
3 iii III
4 iv IV
5 v V
6 vi (you do not have to support past 5)
7 vii
8 viii
9 ix
(Act 1, Scene 2, Lines 345-3499)
Odpowiedzi:
Język programowania Szekspira (niekonkurencyjny)
Naprawdę podobało mi się to pytanie, a ponieważ zainteresowanie Szekspirem było pewne , oto jedno.
(Jest to ponad 6000 bajtów). Istnieje kilka sztuczek w tam, ale nie próbowałem do golfa to dużo, ponieważ: (1) I już przyczyniły się mój udział w golfa na innej odpowiedzi, oraz (2) zmienia wszystkie znaki na „Strona i „Krążek” lub wszystkie frazy „duży, duży, duży kot” wydają się zepsuć zabawę. Zamiast tego w części dotyczącej cyfr rzymskich użyłem znaków, które są Rzymianami itp. Użyłem znaków i instrukcji, aby zapisać trochę pisania. :-)
Program powinien być w większości prosty, ale jedną zmarszczką, o której warto wspomnieć, jest to, że kiedy to napisałem, założyłem, że odczyt liczby całkowitej będzie działał w następujący sposób
scanf
: (1) zużyje tylko tyle znaków z wejścia, ile odpowiada liczbie całkowitej, i (2) w przypadku niepowodzenia, pozostaw zmienną niezmienioną. (Użyłem tej drugiej właściwości do rozróżnienia między szablonem 1 i 2 w Akcie II, czytając do „Linii” i próbując odczytać liczbę całkowitą.) Niestety okazuje się, że (oryginalna implementacja) zawiera błąd język, w którym czytanie liczby całkowitej zużywa wszystko do końca linii i generuje błąd, jeśli się nie powiedzie, więc potrzebuje łatki,libspl.c
abyint_input
bardziej się zachowywaćscanf
.I dzięki temu działa:
Nieco wyższy pseudokod, nad którym pracowałem, aby pomóc każdemu, kto próbuje zrozumieć:
Powiązanie powyższego z końcowym kodem pozostawia się jako ćwiczenie. :-) Zauważ, że ShakespearePL ma arytmetykę i stosy i goto, ale nie ma wskaźników (tylko etykiety), więc implementacja „podprogramów” takich jak konwersja na Roman jest nieco… interesująca.
źródło
LaTeX,
513364259226215178159 bajtówDobre eseje należy zawsze pisać w LaTeX.
Używa to pakietu xstring, ponieważ nie ma wbudowanej zbyt dużej liczby operacji na łańcuchach. Po stronie dodatniej górny limit dla wbudowanego
\Roman
formatowania jest większy niż kiedykolwiek będziemy potrzebować (nawet dla sonetów)2^31-1
. Uwzględniłem\documentclass{ecv}
w liczeniu, ale żaden kod testowy:(Jeśli byłeś na tyle szalony, żeby z niego skorzystać, musiałbyś przynajmniej odhaczyć nazwy makr. Nadpisywanie makr jednoznakowych to zła praktyka)
Nie golfił i skomentował:
Zauważ, że w tej wersji komentarze są wymagane, w przeciwnym razie nowa linia jest interpretowana jako biała spacja i rozwija się do spacji.
źródło
~
nazwy makra zamiast\s
. Ale tak naprawdę wcale nie potrzebujesz\s
(\stripcomma
w wersji bez golfa): możesz po prostu,\def\t#1 #2, #3 #4, #5 #6
a TeX zajmie się usuwaniem przecinków. (Więc zamiast tego możesz użyć~
lewy\t
, oszczędzając 1 bajt.)~
jest trochę paskudna, ale podoba mi się tutaj. Oznaczało to, że musiałem zmienić klasę dokumentów (na jeden z trzech 3-literowych.cls
plików, które zainstalowałem)\@roman
i\@Roman
nie potrzebują nawiasów klamrowych wokół argumentu.xstring
pomysły były twoje :-) Gra w golfa była świetna!JavaScript (ES6),
210183178177171 bajtówZaoszczędzono 27 bajtów, rozwijając parametry odpoczynku (dzięki produktom ETH )
Zaoszczędzono 5 bajtów, nie dopasowując paren otwierających i modyfikując generację cyfr rzymskich
Zapisano 1 bajt, dostosowując końcowe wyrażenie trójskładnikowe
Zaoszczędzono 6 bajtów, łącząc dwie pasujące grupy
Przypadki testowe:
źródło
Act
każdy\D*
z nich na.*
?Galaretka ,
87 8685 bajtówWypróbuj online! lub zobacz zestaw testowy
W jaki sposób?
źródło
œr
,Ṗ,Ç
,Ṗ€V
,ṪÇ$
,W
jako ostatnie ogniwo w link pomocnik, ewentualnie innych też, ładny wysiłku! To nie jest zwykłe przesłanie 80-osobowej galaretki, zasługuje na szczególne uznanie wśród ludzi galaretek.R ,
94126112166 bajtówA teraz jest bardziej sformułowany niż wcześniej :(, wróć do dalszej gry w golfa. Regex za zmniejszenie bezwstydnie
skradzionegoodnośnika do strony pożyczonego od @FryAmTheEggman.Teraz naprawdę muszę trochę popracować, aby odzyskać bajty, ale teraz działa to w drugim przypadku.
Wypróbuj online! - Pamiętaj, że
el
nie działa w TIO i został zastąpiony przezunlist
źródło
Siatkówka ,
8988 bajtówWypróbuj online!
Zaoszczędzono 3 bajty dzięki Neilowi.
Usuwa niepotrzebne znaki przed zamianą dwóch pierwszych cyfr na bloki
i
znaków. Następnie dopasowuje fragmenty tychi
liter, tworząc odpowiednie cyfry rzymskie. Następnie używamy pierwszej cyfry rzymskiej. Na koniec dopasowujemy jak najwięcej liczb przed myślnikiem i po łączniku, tak aby liczba cyfr w liczbie była taka sama. Następnie usuwamy ten prefiks z drugiego numeru.źródło
iiiii
zv
,iiii
zeiv
iviv
zeix
wydaje się zaoszczędzić kilka bajtów.345-356
- spodziewałem się345-56
.\b
pod koniec ostatniej zamiany, aby uniknąć konieczności powtórzenia)
zamiany?\d
ale wydaje się, że działa, ponieważ nie ma innej granicy słów. Dzięki!PHP> = 7,1, 195 bajtów
Przypadki testowe
Rozszerzony
źródło
preg_match_all("#\d+#",$argn,$m);[$a,$s,$b,$e]=$m[0];
oszczędza dwa bajty.if($e){for(;$b[$i]==$e[$i];$i++);echo"-",substr($e,$i);}echo")";
powinien oszczędzić 46.(you do not have to support past 5)
oszczędza 15 bajtów.".$r[$s].$b"
zapisuje kolejne 5 bajtów; i[[$a,$s,$b,$e]]=$m;
jeszcze jeden. Niestety przypisania tablic nie działają (jeszcze).if($e&&$e-$b){for($x=str_pad($b,strlen($e),0,0);$x[$i]==$e[$i];$i++);echo"-",substr($e,$i);}
zapisuje 10 bajtów i może działać.&&$e-$b
jest konieczne w przypadkach testowych; więc oszczędza 17 bajtów, a nie 10. Btw. wciąż nie potrzebujesz rzymskiego od 6 do 9.;)for(;str_pad($b,strlen($e),0,0)[$i]==$e[$i];)$i++;
zfor(;$e&&~$c=$e[-++$k];)$c>$b[-$k]&&$i=-$k;
.Perl 5, 185 + 1 = 186 bajtów
Kara 1 bajt za wymaganą
-n
flagę.Może się nie powieść w niektórych przypadkach testowych, w których scena ma więcej niż 10 ^ 11 linii, ale sceny AFAIK bez Szekspira są dość długie;)
W czytelnej formie:
źródło
Rubinowy , 204 + 1 = 205 bajtów
Używa
-p
flagi.Wypróbuj online!
źródło
Python 2.7 298 bajtów
źródło
Perl, 99 bajtów
Uruchom z
perl -pe
. 98 bajtów (źródło) + 1 bajt (p
flaga) = 99.źródło
Python 2 ,
301259252221 bajtówOgromne -31 bajtów dzięki Chasowi Brownowi.
Więc to jest ... wyjątkowo długie ... Myślę, że mogę to pograć w golfa, ale od jakiegoś czasu dręczyłem sobie mózg.
Wypróbuj online!
Awaria
źródło
b,c,d,e,f=s.groups()
zamiasta,b,c,d,e,f=[s.group(n) for n in range(6)]
[0]+'i,ii,iii,iv,v,vi,vii,viii,ix'.split(',')
zamiast[s,'i','ii','iii','iv','v','vi','vii','viii','ix']
.[0]+'i ii iii iv v vi vii viii ix'.split()
zamiast[s,'i','ii','iii','iv','v','vi','vii','viii','ix']
.0
cytaty. Jedno ostatnie drobne Tweak widzę: używasz:s,r=XXX,YYY;b,c,d,e,f=s.groups();
można zaoszczędzić kolejne 4 bajty zamiast przez równoważnie mówiąc:b,c,d,e,f=XXX.groups();r=YYY;
. W rezultacie masz 81 bajtów mniej niż moje zgłoszenie! :)q / kdb +,
200187 bajtówRozwiązanie:
Przykłady:
Objaśnienie: (lekko nie golf)
Uwagi:
Technicznie może być o 2 bajty krótszy (nie ma takiej potrzeby
f:
), ale ułatwia pokazanie przykładów w ten sposób.Edycje:
string
z$:
,count
z#:
,til
z(!)
ifirst
z(*:)
, obsada indeksy R do strun, więc nie musimy działać szarego / sceny w intźródło