Odszyfruj neurotyczne żaby
Teraz, gdy Puzzling.SE w końcu złamał mój obsesyjny na punkcie płazów szyfr , napiszmy program lub funkcję, aby go odszyfrować!
(Jeśli chcesz spojrzeć na układankę, zanim zostanie zepsuta, kliknij teraz powyższy link.)
Jak działa szyfr
W Neurotic Frogs O ught Aby Rel x w M ud Wanny ( „Neurotic Żaby” w skrócie), każda litera jest szyfrowana w postaci jednego lub dwóch słów:
- Długość słowa bez kursywy oznacza literę.
neurotic
=> 8 liter =>H
frogs
=> 5 liter =>E
perpendicular
=> 13 liter =M
- Słowo zawierające kursywę modyfikuje następujące słowo, dodając 10, jeśli kursywą było nieparzyste lub 20, jeśli kursywą było parzyste. Dowolne lub wszystkie słowa mogą być pisane kursywą. Po kursie zawsze występuje słowo bez kursywy.
*o*ught to
=> nieparzyste, 2 => 12 =>L
lo*u*nging calms
=> parzysty, 5 => 25 =>Y
Każde słowo tekstu jawnego odpowiada zdaniu tekstu zaszyfrowanego, a każde zdanie tekstu jawnego odpowiada akapitowi tekstu zaszyfrowanego.
Format wejściowy
Twój program lub funkcja powinna wprowadzić komunikat w Neurotic Frogs, sformatowany w Markdown. Dane wejściowe będą składały się wyłącznie z drukowalnego ASCII i nowego wiersza.
- Słowa to ciągi znaków pasujące do wyrażenia regularnego
[A-Za-z0-9']
.- Liczby i litery liczą się do długości słowa.
QB64
reprezentujeD
. - UWAGA: Apostrofy nie liczą się do długości słowa.
Isn't
reprezentujeD
nieE
.
- Liczby i litery liczą się do długości słowa.
- Litery kursywą są zawinięte w parę gwiazdek (
*letters*
).- Jedna lub więcej kolejnych liter może być pisanych kursywą, aż do całego słowa (
masseus*es*
,*all*
); wiele nie następujących po sobie liter w słowie może być również kursywą (g*e*n*e*rates
). - Kursywa nigdy nie obejmuje wielu słów, nigdy nie zawiera interpunkcji i nigdy nie zawiera apostrofów.
- Niesparowane gwiazdki i wiele sąsiadujących gwiazdek nigdy nie wystąpią.
- Jedna lub więcej kolejnych liter może być pisanych kursywą, aż do całego słowa (
- Interpunkcyjny jest którykolwiek z następujących znaków:
.,?!:;-()"
.- Słowa w zdaniu są oddzielone jednym lub kilkoma znakami interpunkcyjnymi i / lub pojedynczym odstępem. Przykłady:
*all* welcomed
,toad*s*, newts
,Ever*y*one--frogs
,cap... bliss
,they're (I
- Zdania kończą się jedną lub kilkoma znakami interpunkcyjnymi i są oddzielone podwójną spacją:
Th*e* Montgomery A*m*phibian Salon! Come luxuriate today!
- Akapity są oddzielone pojedynczym znakiem nowej linii. (Ostatnie zdanie akapitu wciąż ma jeden lub więcej znaków interpunkcyjnych na końcu).
- Słowa w zdaniu są oddzielone jednym lub kilkoma znakami interpunkcyjnymi i / lub pojedynczym odstępem. Przykłady:
Inne znaki nie pojawią się na wejściu i nie muszą być obsługiwane.
Twój kod może, według własnego uznania, oczekiwać, że dane wejściowe będą miały pojedynczy znak nowej linii.
Format wyjściowy
Rezultatem odszyfrowania danych wejściowych będzie jedno lub więcej zdań. Litery tekstu jawnego mogą być dowolną kombinacją wielkich i małych liter. Słowa w zdaniu muszą być oddzielone pojedynczymi spacjami. Zdania muszą kończyć się kropką ( .
) i być oddzielone pojedynczym odstępem. Możesz podać końcowe spacje po ostatnim zdaniu. Twój wynik będzie w jednym wierszu, ale możesz wygenerować końcowy znak nowej linii.
Różne szczegóły
Twój kod może wykorzystywać dowolną standardową metodę wejścia i wyjścia. Musi otrzymywać dane wejściowe w postaci ciągu wielowierszowego, a nie listy lub innej struktury danych, i musi generować ciąg.
Najkrótszy kod w bajtach wygrywa!
Przypadki testowe
-->
Neurotic Frogs *O*ught To Rel*a*x In *M*ud Baths!
<--
HELLO.
-->
Business standards all*o*w only *adult* amphibians.
<--
HINT.
-->
Rejoice, *a*ll frogs an*d* toads also! Montgomery Sal*o*n opens up! Ha*pp*y throng fill*s* street ecstatically!
<--
GOOD JOB PPL.
-->
I like 3.1415926535897.
IM*O*, it's a *b*la*st*, yeah!
<--
ADAM. MAN.
-->
*I*, happily, *th*anks 2 u *e*ditin*g* specific wor*ding*--clarifying a *bit*--betterment :D!
<--
QUARTATA.
-->
Perpendicular l*ou*nging calms. *A* frog, a m*u*d cap... bliss! Wallowing g*e*n*e*rates happiness. Amphibian sp*a* isn't expensive--seventy d*o*llars--cheap! That'*s* not *a* large e*x*pens*e* from an*y* discerning fr*o*g's money, unlik*e* Super 8.
Ever*y*one--frogs, toad*s*, newts, *a*nd salamanders! G*e*t a wonderful shiat*s*u, or recei*v*e an other kind. Masseus*es* are her*e* today! Invite a fianc*e*e, supervisor, roommate, niece: *all* welcomed!
Y*o*u simply ne*v*er believed these p*o*ssibilitie*s*; they're (I *swear*) absolute truth! Th*e* Montgomery A*m*phibian Salon! Come luxuriate today!
<--
MY NAME IS INIGO MONTOYA. YOU KILLED MY FATHER. PREPARE TO DIE.
źródło
Odpowiedzi:
Perl, 72 bajty
Licząc shebang jako jeden, dane wejściowe są pobierane ze standardowego wejścia.
Przykładowe użycie
źródło
JavaScript (ES6),
172169157150 bajtówZaoszczędź 10 bajtów dzięki @Neil
Prawdopodobnie można go jeszcze ulepszyć. Wyjścia są pisane małymi literami.
źródło
i=0
dotoString
.x=>x.replace(/([\w*']+)[^\w\n*' ]* ?( ?)/g,(_,y,z)=>/\*/.test(y,l=y.replace(/'/g ,"").length)?(i=l%2||2,""):l+i*10+9).toString(36,i=0)+z,i=0).replace(/\n|$/g,". ")
.replace
i używanie tylko.match
zapisanych kolejnych 12 bajtów.Python 2,
238221218214207205 bajtówUżywa wielu wyrażeń regularnych do przetwarzania. Przekształcamy podwójną spację w
~
i używamy jej do przetwarzania.~
i\n
są traktowane specjalnie.Największy przyrost postaci wynika z przetwarzania wstępnego danych wejściowych w
for
linii; na pewno można dalej grać w golfa.Ideone to! (wszystkie przypadki testowe)
Zaoszczędzono 7 bajtów dzięki DLosc!
źródło
Pip ,
6564 bajtówWynik to 62 bajty kodu + 2 dla
-rs
flag.Wypróbuj online!
Wyjaśnienie
-r
Flag czyta wszystkie linie stdin i przechowuje ich listę wg
.-s
Flaga ustawia format wyjściowy do listy rozdzielonych spacjami.Najprostszym sposobem na odczytanie tego kodu jest z zewnątrz w:
źródło
Python 2.7,
390342341339335 bajtów:Pobiera dane wejściowe w formacie:
F('''Multi or Single-lined String''')
Można grać w golfa o wiele więcej, co zrobię, gdy tylko będę miał okazję.
Zamień na wszystkie przypadki testowe!
Wyjaśnienie:
Wykorzystuje ogromną moc wbudowanych wyrażeń regularnych Pythona do odszyfrowania danych wejściowych. Jest to podstawowy proces, przez który przechodzi funkcja dla każdego wejścia:
Po pierwsze, wszystkie
--
są zastępowane pojedynczą spacją, a każdy apostrof jest usuwany. Następnie wszystkie słowa zawierające składniki pochylone i słowo po nim są dopasowywane w jednym ciągu i zastępowane10 + len(second word)
liczbą kolejnycha
s, jeśli długość pierwszego słowa wynosiodd
, a20 + len(second word)
kolejnea
s w przeciwnym razie. Wykorzystuje to następujące wyrażenie regularne:[^\w\s*]*\w*\*\w+\*.*?(?=\s) \w+
Na przykład, jeśli mamy zdanie
Perpendicular l*ou*nging calms.
,l*ou*nging calms
zostanie zastąpioneaaaaaaaaaaaaaaaaaaaaaaaaa
lub 25a
s, ponieważl*ou*nging
ma parzystą liczbę znaków icalms
ma 520+5=25
..Teraz nowo zmodyfikowane dane wejściowe są dzielone przy każdym znaku interpunkcyjnym, po którym następuje znak nowej linii (
\n
), aby uzyskać akapity, następnie każdy akapit jest dzielony przy każdej interpunkcji, a następnie 2 spacje, aby uzyskać zdania, a na koniec każde zdanie jest dzielone na słowa wzdłuż wszelkie znaki interpunkcyjne, w tym spacja. Następnie dla każdego słowa (w tym serii kolejnycha
s) dodajemy do łańcuchaW
literę odpowiadającą punktowi kodu Unicode64
(punkt kodu Unicode znaku przedtemA
, czyli@
)len(word)
. Następnie dodajemy pojedynczą spację doW
wyczerpania wszystkich słów zdania, a po wyczerpaniu wszystkich zdań w akapicie dodajemy znak.
spacji.Na koniec, po przejściu całego wejścia,
W
jest wyprowadzanystdout
jako odszyfrowany komunikat.źródło
re
, użyjsub
zamiaststr.replace
. Bardziej ogólna sugestia golfowa: prawdopodobnie bardziej efektywne jest traktowanie wszystkiego, co nie jest słowem lub*
interpunkcją. Oszczędza na dużych, ogromnych klasach postaci.PHP, 196 bajtów
Gdybym mógł założyć, że w środku słowa 194 bajtów jest tylko jedna apostrofa
źródło
%0A
jako funkcjarawurlencode("\n")
. Wolę w tym przypadku formularz z<?
. Jeden błąd należy do$_GET[s]
niego działa, ale jest poprawny$_GET["s"]
i lepiej jest zadeklarować i zainicjować zmienną$p=0;
przed pętlą. Teraz moje pytanie do ciebie brzmi: czy mogę założyć, że w jednym Słowie jest tylko jeden Apostrof w środku Słowa?<?php
pracy.<?
w rzeczywistości. Używam krótkiego tagu tylko w moim poście tutaj. Teraz wiem, że można go zamknąć na pustej stronie.PHP,
231226228 bajtówna początek
Zapisz do pliku, rund
php <scriptpath> <text>
. Unikaj znaków nowej linii w tekście, aby działał w skorupkach.źródło
$argv[1]
, ale nie wiem, jak to podejście zadziała, gdy dane wejściowe zawierają znaki nowej linii. Próbowałem"Neurotic Frogs *O*ught To Re*a*x In *M*ud Baths!"
jako argument wiersza polecenia i dostałemIFHCHCFF.
na wyjście (jak równieżUndefined variable: d
ostrzeżenie).<?
, zapisanie go w pliku i wywołanie go za pomocąphp <filename> <string>
. Być może będę musiał dodać 2 do liczby bajtów.<?
, możesz także zakończyć?>.
, dla zysku netto dla 1. FWIW, dostajęIFHCMFF.
dla pierwszego przypadku testowego (używając PHP 5.5.21 64-bit, VC14). Używanie$argn
z-F
może być również opcją.php <filename> <string>
to możliwe, kiedy<string>
może zawierać znaki nowej linii.