Ot wes thi bist uf tomis

36

Uwielbiam ten prosty szyfr, fajnie jest czytać nie do końca czytelne słowa i wypełniać luki ...

Ot wes thi bist uf tomis, ot wes thi wurst uf tomis, 
ot wes thi egi uf wosdum, ot wes thi egi uf fuuloshniss, 
ot wes thi ipuch uf biloif, ot wes thi ipuch uf oncridaloty, 
ot wes thi siesun uf loght, ot wes thi siesun uf derkniss, 
ot wes thi sprong uf hupi, ot wes thi wontir uf dispeor, 
wi hed ivirythong bifuri as, wi hed nuthong bifuri as, 
wi wiri ell guong dorict tu hievin, wi wiri ell guong dorict thi uthir wey – 
on shurt, thi piroud wes su fer loki thi prisint piroud, 
thet sumi uf ots nuosoist eathurotois onsostid un ots biong riciovid, 
fur guud ur fur ivol, on thi sapirletovi digrii uf cumperosun unly.

Zasady są bardzo proste:

  • Zaakceptuj część tekstu jako dane wejściowe (znaki ascii, wielkie / małe litery i znaki interpunkcyjne).
  • Dla każdej samogłoski obróć ją do następnej samogłoski lub z powrotem na początek.
    • a => e
    • e => i
    • i => o
    • o => u
    • u => a
  • Wielkie litery samogłosek pozostają dużymi literami, małe litery pozostają małymi literami.
  • Po tych konwersjach wyślij tekst.
  • Nie trzeba wspierać akcentów.
  • Wszystkie pozostałe postacie powinny pozostać niezmienione.
  • Spróbuj to zrobić przy najmniejszej liczbie bajtów.
  • Dowolny stary język, który lubisz.

Przypadki testowe

It was the best of times, it was the worst of times,
it was the age of wisdom, it was the age of foolishness,
it was the epoch of belief, it was the epoch of incredulity,
it was the season of light, it was the season of darkness,
it was the spring of hope, it was the winter of despair,
we had everything before us, we had nothing before us,
we were all going direct to heaven, we were all going direct the other way –
in short, the period was so far like the present period,
that some of its noisiest authorities insisted on its being received,
for good or for evil, in the superlative degree of comparison only.

Na zewnątrz:

Ot wes thi bist uf tomis, ot wes thi wurst uf tomis, 
ot wes thi egi uf wosdum, ot wes thi egi uf fuuloshniss, 
ot wes thi ipuch uf biloif, ot wes thi ipuch uf oncridaloty, 
ot wes thi siesun uf loght, ot wes thi siesun uf derkniss, 
ot wes thi sprong uf hupi, ot wes thi wontir uf dispeor, 
wi hed ivirythong bifuri as, wi hed nuthong bifuri as, 
wi wiri ell guong dorict tu hievin, wi wiri ell guong dorict thi uthir wey – 
on shurt, thi piroud wes su fer loki thi prisint piroud, 
thet sumi uf ots nuosoist eathurotois onsostid un ots biong riciovid, 
fur guud ur fur ivol, on thi sapirletovi digrii uf cumperosun unly.

W:

The quick brown fox jumps over the lazy dog.

Na zewnątrz:

Thi qaock bruwn fux jamps uvir thi lezy dug.

W:

Home is where the heart is.

Na zewnątrz:

Humi os whiri thi hiert os.

W:

Boaty McBoatface

Na zewnątrz:

Buety McBuetfeci

W:

AEIOUaeiou

Na zewnątrz:

EIOUAeioua

W:

Programming Puzzles And Code Golf

Na zewnątrz:

Prugremmong Pazzlis End Cudi Gulf
AJFaraday
źródło
20
Aka The Great Vowel Shift
Angs
4
Hmm Olde English?
iammax
10
Wciąż łatwiejszy do odczytania niż Beowulf.
Smeato,
4
Dla mnie wygląda jak tłumacz kiwi.
Magoo
1
Podoba mi się, jak „zło”, gdy szyfry do „ivola”, są skutecznie wymawiane w ten sam sposób.
Enrico Borba

Odpowiedzi:

11

Stax , 7 bajtów

öΦΣòC└∞

Uruchom i debuguj

Wypróbuj online!

Objaśnienie (rozpakowane)

Vv:tVV:t
Vv:t           #Push aeiou and ring translate it to input
    VV:t       #Push AEIOU and ring translate it to input

Być może uda się zaoszczędzić więcej, będę próbował.

Wielo
źródło
22

MS-SQL, 51 bajtów

Działa na SQL 2017 lub nowszym:

SELECT TRANSLATE(v,'AEIOUaeiou','EIOUAeioua')FROM t

Nowa funkcja TRANSLATEzastępuje indywidualne znaki, dlatego idealnie nadaje się do tego wyzwania.

Dane wejściowe pochodzą z wcześniej istniejącej tabeli t z kolumną varchar v , zgodnie z naszymi regułami IO .

W takim przypadku tabela musi zostać utworzona przy użyciu sortowania z rozróżnianiem wielkości liter , albo na serwerze z rozróżnianiem wielkości liter, albo przy użyciu COLLATEsłowa kluczowego (nie liczone do całkowitej liczby znaków):

CREATE TABLE t(v varchar(max) COLLATE Latin1_General_CS_AS)

EDYCJA : SSMS może odciąć długi cytat powyżej, zwracając wynik w oknie „wyników na tekst”, jest to ustawienie klienta, a nie błąd w moim programie .

Aby to naprawić, przejdź do Tools > Options > Query Results > SQL Server > Results to Texti zwiększ „Maksymalna liczba znaków wyświetlanych w każdej kolumnie”.

BradC
źródło
1
Jestem naprawdę zszokowany, że SQL jest nawet prawie konkurencyjny. To także fajna funkcja! Dzięki, że nam powiedziałeś :)
Sprawa Moniki w dniu
@NicHartley Tak, wydają się dodawać kilka przydatnych funkcji w każdej wersji. Możesz zagnieździć go również przy REPLACEniektórych lewach: na przykład, REPLACE(TRANSLATE(v,'1234567890','xxxxxxxxxx'),'x','')aby wyeliminować wszystkie cyfry z łańcucha. Wciąż długie, ale znacznie krótsze niż 10 zagnieżdżonych REPLACEs.
BradC
14

Haskell , 52 bajty

(a:b)!c|a/=c=b!c|1>0=b!!0
a!b=b
map("aeiouaAEIOUA"!)

Wypróbuj online!

Lynn oszczędził mi dwa bajty, wskazując, że !!0jest krótszy niż head.

Wyjaśnienie

Jeśli nigdy nie kodowałeś w Haskell, prawdopodobnie będzie to wyglądać jak kupa szarpaniny. Najpierw odłóżmy go, a następnie podzielmy:

(a:b)!c
 |   a/=c   = b!c
 |otherwise = b!!0
a!b=b
map("aeiouaAEIOUA"!)

Najpierw mamy funkcję !, która pobiera ciąg znaków si znak c. Nasz pierwszy chwyt przy dopasowaniu wzorca przyjmuje dane wejściowe, jeśli ciąg nie jest pusty. Jeśli ciąg nie jest pusty, porównujemy jego pierwszy znak c. Jeśli jego pierwszy znak nie jest równy c, podrzucamy go i wzywamy !ponownie resztą ciągu ic . Jeśli jest równy, zwracamy drugi znak w ciągu.

Nasze następne dopasowanie wzorca łapie łańcuch we wszystkich innych przypadkach, to znaczy, jeśli łańcuch jest pusty. W tym przypadku właśnie wracamy c.

W sumie ta funkcja pobiera znak ci ciąg znaków si zwraca znak po pierwszym wystąpieniu cin s. Jeśli aeiouaAEIOUAto przekażemy, wykonamy nasz szyfr na jednym znaku. Aby wykonać całą naszą funkcję, powinniśmy zamapować to na łańcuch.

Kreator pszenicy
źródło
12

Siatkówka ,10 9 8 bajtów

T`uo`vVA

Wypróbuj online!

Zaoszczędzono 1 bajt dzięki Neilowi! I kolejny bajt dzięki Martinowi!

Nowa wersja siatkówki ma klasy samogłosek, co sprawia, że ​​wynik jest nieco krótszy. Transliteracja korzysta również z klasy „other”. Więc toklasa wygląda jak „aeiouAEIOUA”, podczas gdy fromklasa wygląda jak „uaeiouAEIOUA”

Nie powoduje to żadnych problemów, ponieważ drugie umapowanie Anigdy nie zostanie wykonane, ponieważ uzostało już mapowane a.

FryAmTheEggman
źródło
9 bajtów: T`_o`uvUV.
Neil
To niezwykle krótka odpowiedź!
AJFaraday
@Neil sprytny, dzięki! Myślałem, że umieszczenie _w zestawie potraktowałoby to dosłownie, ale wygląda na to, że tak nie jest.
FryAmTheEggman
3
Możesz się jeszcze ogolić, ale nie mogę niestety związać Staxa
Martin Ender
@MartinEnder Thanks! To sprytna konfiguracja, łącząca oba te elementy. Nie próbowałem Yjeszcze dużo, więc dam temu szansę jutro.
FryAmTheEggman
9

Perl 5 + -p, 24 23 bajtów

y;AEIOUaeiou;EIOUAeioua

Wypróbuj online

-1 bajt dzięki @DomHastings

Nahuel Fouilleul
źródło
1
Nie liczymy -pjuż jako +1, zamiast tego uważamy, że ta odpowiedź znajduje się w „Perl 5 + -p”.
Erik the Outgolfer
1
Działa to również w sed
Kritixi Lithos
1
Jeśli użyjesz ;jako separatora, możesz zapisać bajt!
Dom Hastings,
zaktualizowane, @Cowsquack już nie
Nahuel Fouilleul
6

Python 3, 62 bajty

lambda x:x.translate(str.maketrans('aeiouAEIOU','eiouaEIOUA'))

Stwórz tabelę tłumaczeń (słownik) metodą strstatyczną str.maketrans. Przetłumacz odpowiednie znaki na ich znaki docelowe.

mypetlion
źródło
Gdzie to działa we / wy?
reinierpost
@reinierpost To funkcja. Wejście odbywa się za pomocą xparametru. W Pythonie funkcje lambda nie wymagają instrukcji return.
mypetlion
6

C, 85 76 67 65 64 bajtów

f(char*c){for(;*c;)putchar(1[index("AEIOUAaeioua",*c++)?:c-2]);}

Odpowiedź Javy z portu Kevina Cruijssena . Wypróbuj online tutaj .

Podziękowania dla Kevina Cruijssena za grę w golfa za 9 bajtów, za Christopha za grę w golfa za 11 bajtów i za grę sufitową za grę w golfa za 1 bajt.

Wersja bez golfa:

f(char* c) { // function taking a char array as parameter and implicitly returning an unused int
    for(; *c ;) // loop over the input
        putchar(1 [index("AEIOUAaeioua", * c++) ?: c-2]); // find the first pointer to the current char in the vowels string, NULL if not present; if it's not NULL, print the next vowel, otherwise just print the char
}
OOBalance
źródło
1
Wydaje się, że nie jest standardowym rozszerzeniem gcc. Znałem to z php i po prostu spróbowałem.
Christoph
1
@Christoph Podoba mi się to, że używasz rekurencji, ale nie jestem pewien, czy możemy wyprowadzić trailing \0. Nie działa to również po kompilacji z clang: tio.run/##S9ZNzknMS///…
OOBalance 25.04.2018
1
@Christoph: Byłem ciekawy, gdzie jest niezdefiniowane zachowanie, więc po debugowaniu wersji clang zdebugowałem wersję clang. const char *res = strchr("AEIOU...", 0)zwraca wskaźnik do terminatora w literale ciągu. putchar(res[1])czyta poza koniec literału łańcucha. Z gcc najwyraźniej zdarza się znaleźć kolejny bajt zerowy i działa, ale z clang dostaje 73 'I'(prawdopodobnie z maindosłownego ciągu „To było ...”, ale nie sprawdziłem asm). Więc putcharnie zwraca 0, i ostatecznie segregujemy, gdy *c++odczytuje niezapisaną stronę.
Peter Cordes,
2
@PeterCordes tak, dowiedziałem się o tym tutaj po podejrzeniu. W każdym razie tutaj zapisano kolejne 2 bajty f(char*c){for(;*c;)putchar(1[strchr("AEIOUAaeioua",*c++)?:c-2]);}. To chyba wszystko na razie.
Christoph
1
@Rogem Ze względu na właściwości przemiennej dodawania a[b]==*(a+b)==*(b+a)==b[a]. Dlatego1[...]==(...)[1]
pułapkat
5

Python 2 , 79 68 67 bajtów

-1 bajt dzięki @ArnoldPalmer

V='uaeiouAEIOUA'
print''.join((V[1:]+c)[V.find(c)]for c in input())

Wypróbuj online!

Dead Possum
źródło
67 bajtów . Ponadto przepraszam, jeśli zalałeś się powiadomieniami, od jakiegoś czasu nie opublikowałem komentarza i zapomniałem, jak to zrobić.
Arnold Palmer
@ArnoldPalmer Dzięki! W porządku, mnie nie było i wszyscy za mną tęsknili: D
Dead Possum
5

JavaScript (ES6), 60 bajtów

s=>s.replace(/./g,c=>(S='aeiouaAEIOUA'+c+c)[S.indexOf(c)+1])

Wypróbuj online!

Arnauld
źródło
s=>s.replace(/./g,c=>'auoieaAUOIEA'.match(".(?=${c})")||c)
tsh
Błąd: only.=>unlya
l4m2
4

Pyth, 17 bajtów

em=.rQdrB"aeiou"1

Wypróbuj tutaj

em=.rQdrB"aeiou"1
 m                  For each string...
       rB"aeiou"1   ... in ['aeiou', 'AEIOU']...
  =.rQd             ... cyclically rotate the characters in the input.
e                   Take the last.
Mnemoniczny
źródło
4

Japt 2.0, 25 21 bajtów

Bawiłem się w golfa z Shaggy.

r\v@=`aeia`pu)g1+UbX

Uruchom tutaj.

Oliver
źródło
1
23 bajty
Kudłaty
1
@Shaggy That nie działa z wielkimi samogłoskami.
Oliver,
1
W takim przypadku ... 22 bajty .
Kudłaty
1
@Shaggy To jest fajne ... 21 bajtów
Oliver,
1
Miły! Myślę, że to pierwszy raz, kiedy widziałem S.p(f).
Kudłaty
4

Java 10, 97 87 bajtów

s->{for(var c:s){var t="AEIOUAaeioua"+c+c;System.out.print(t.charAt(t.indexOf(c)+1));}}

-10 bajtów po zainspirowaniu odpowiedzią JavaScript @Arnauld (jego 60- bajtowa wersja) .

Wypróbuj online.

Wyjaśnienie:

s->{                         // Method with character-array parameter and no return-type
  for(var c:s){              //  Loop over the input characters
    var t="AEIOUAaeioua"     //  Temp-String containing the order of vowels 
                             //  (including additional 'A' and 'a'),
          +c+c;              //  appended with two times the current character
    System.out.print(        //  Print:
      t.charAt(              //   The character in String `t` at index:
         t.indexOf(c)+1));}} //    The (first) index of the current character in `t` + 1
Kevin Cruijssen
źródło
4

05AB1E , 14 13 11 bajtów

žMDÀ‡žMuDÀ‡

Wypróbuj online!

Kaldo
źródło
1
Możesz zapisać dwa bajty, po prostu biorąc dane wejściowe jako ciąg wielu wierszy, więc nie ma potrzeby |i »: Wypróbuj online: 11 bajtów .
Kevin Cruijssen
@KevinCruijssen Thanks! Czy nie jest to coś, co zostało naprawione w najnowszej wersji 05AB1E?
Kaldo
Nie mam pojęcia. Rozpoczęłam 05AB1E od początku tego roku. Możesz zapytać @Adnan na czacie 05AB1E, kiedy funkcja została dodana, jeśli chcesz wiedzieć.
Kevin Cruijssen
3

APL + WIN, 55 bajtów

Monity o ciąg wejściowy:

i←(10≥n←'AEIOUaeiou'⍳s)/⍳⍴s←⎕⋄s[i]←'EIOUAeioua'[n~11]⋄s
Graham
źródło
3

Świnka, 38 bajtów

R T W $TR(T,"AEIOUaeiou","EIOUAeioua")

Mumps zwykle nie dodaje znaku powrotu karetki, ponieważ nie widziałem wymogu oddzielania danych wejściowych od wyjściowych, wygląda to trochę dziwnie przy pierwszym uruchomieniu. Na przykład dane wyjściowe dla ostatniego przypadku testowego wyglądają następująco:

Programming Puzzles And Code GolfPrugremmong Pazzlis End Cudi Gulf

Jeśli chcesz dodać znak powrotu karetki, dodaj dwa bajty:

R T W !,$TR(T,"AEIOUaeiou","EIOUAeioua")
zmerch
źródło
3

Vim + tpope / vim-abolish , 30 bajtów

:%S/{a,e,i,o,u}/{e,i,o,u,a}/g<cr>

Alternatywne rozwiązanie, również 30 bajtów:

Oe,i,o,u<esc>|D:%s/{a,<C-r>"}/{<C-r>",a}/g

Według meta odpowiedzi vim mogą używać wtyczek bez kary bajtowej. To nie jest odpowiedź vima, ale vim + odpowiedź zniesiona .


Abolish to niezwykle przydatna wtyczka. Ta sekcja README ładnie opisuje działanie tego polecenia ( Subvertpolecenia).

DJMcMayhem
źródło
3

CJam , 29 19 bajtów

q"aeioua"_eu+_1m<er

Wypróbuj online!

-10 bajtów dzięki @Peter Taylor

Wyjaśnienie:

q                       # take all input
 "aeioua"               # push vowel pairs
         _eu            # duplicate, uppercase
            +_          # concatenate, duplicate again
              1m<       # rotate left by 1
                 er     # transliterate
Vazt
źródło
Chociaż pytanie nie jest szczegółowe na temat danych wejściowych, myślę, że powinieneś qraczej użyć , niż lwziąć dane wejściowe. Pierwszy przypadek testowy wydaje się być wieloliniowy. Możesz także skrócić "eioua"do _1m<. W rzeczywistości możesz pójść dalej i q"aeioua"_eu+_1m<er
Peter Taylor
3

AutoHotkey , 24 bajty

AuotHotkey automatycznie zastępuje litery z uwzględnieniem wielkości liter.

a::e
e::i
i::o
o::u
u::a
nelsontruran
źródło
2

PHP, 90 bajtów

Wypróbuj online

Kod

function f($s){echo strtr($s,array_combine(str_split(UuAaEeIiOo),str_split(AaEeIiOoUu)));}

Wyjaśnienie

function f($s){
 echo strtr(
       $s,                          #The string to operate
       array_combine(               #combining arrays
            str_split(UuAaEeIiOo),  #splitting this strings
            str_split(AaEeIiOoUu))
              # With array combine php creates an array like
              # ["U"=>"A", "a"=>"e"....and so on]
              # strtr can replace strings in a string, using an array with 
              # the values to replace and with what replace each value.
 );
}

75 bajtów, jeśli uruchomiono przy php -rużyciu$argv

<?=strtr($argv,array_combine(str_split(UuAaEeIiOo),str_split(AaEeIiOoUu)));
Francisco Hahn
źródło
2

str , 18 bajtów

[aeiouaAEIOUA]#D#U

Wypróbuj online!

Wyjaśnienie

                       implicit: over each character of the input:
[aeiouaAEIOUA]#D#U
[            ]         push this string
              #D       set this to the operation domain
                #U     set the charcter to the next character in the domain
Conor O'Brien
źródło
2

PHP, 38 bajtów

Całkiem proste, mało kreatywne, używa strtrdo zastąpienia samogłosek:

<?=strtr($argn,aeiouAEIOU,eiouaEIOUA);

Uruchom z echo '<input>' | php -nF <filename>lub Wypróbuj online .

Davіd
źródło
Czy to nie zakłada, że ​​dane wejściowe są przypisane do predefiniowanej zmiennej argn? Jeśli tak, to nie jest poprawne; musisz przekazać ciąg jako argument i użyć $argv1]zamiast tego.
Kudłaty
2
@Shaggy Nie, jeśli uruchomisz go z -Fflagą, to działa z wejściem w linii poleceń. Z dokumentacji PHP na temat opcji : -F --process-file PHP file to execute for every input line. Added in PHP 5.Definiowanie zmiennych Wypróbuj online jest po prostu dlatego, że niektórzy ludzie nie mają zainstalowanego PHP lokalnie, a ja nie mogłem uruchomić -Fflagi w TIO.
Davіd
1
Dzięki, @David - to dziś moje „coś nowego” dla PHP :)
Kudłaty
2

q / kdb +, 36 33 bajtów

Rozwiązanie:

{(v,2#x)1+(v:"aeiouaAEIOUA")?x}@'

Przykłady:

q){(v,2#x)1+(v:"aeiouaAEIOUA")?x}@'"AEIOUaeiou"
"EIOUAeioua
q){(v,2#x)1+(v:"aeiouaAEIOUA")?x}@'"Programming Puzzles And Code Golf"
"Prugremmong Pazzlis End Cudi Gulf"

Wyjaśnienie:

Oblicz indeks samogłosek, dodaj jeden, aby przejść do następnego i zindeksuj. Nadal myślę, że to podejście można znacznie poprawić ...

{(v,2#x)1+(v:"aeiouaAEIOUA")?x}@' / the solution
{                             }@' / apply lambda to each character of input
                            ?x    / look up x in...
          (                )      / do together
             "aeiouaAEIOUA"       / lookup list
           v:                     / save as v
        1+                        / add one
 (     )                          / do together
    2#x                           / take 2 copies of x
  v,                              / prepend v

Premia:

Moje stare ** 36 bajtowe (()) rozwiązanie, które moim zdaniem jest całkiem fajne, ale muszę zagrać w golfa na liście, aby było konkurencyjne:

ssr/[;"uoiea%UOIEA%";"%uoiea%UOIEA"]
streetster
źródło
2

Węgiel drzewny , 35 bajtów

UT≔AUOIEAauoieaσF¹¹⊞υ➙§σ⊕ι§σι▷SR⟦Sυ

Wypróbuj online!

Metoda naiwna.

Wyjaśnienie:

UT                                         Set trim option to on, so output won't be a rectangle
    ≔AUOIEAauoieaσ                          Assign "AUIOEAauioea" to s
                   F¹¹                      For i (ι) from 0 to 10
                       ⊞υ                   Push to u (initially empty list)
                          ➙                 Rule of:
                            §σ⊕ι            S[i + 1]
                                 §σι         to S[i]. This is so a->A gets overwriteen by a->e
                                    ▷SR⟦Sυ  Replace input as string using u (now a list of rules)
Tylko ASCII
źródło
2

PHP , 76 bajtów.

$s=strtr($s,array_combine(str_split("aeiouAEIOU"),str_split("eiouaEIOUA")));

Sprawdź to!

To był najkrótszy czas jaki mogłem to zrobić w PHP.

$s = //overwrite $s variable ($s should be a defined string or input)
    strtr(  //strtr replaces key => value pairs from arrays in a string
        $s, //the string we are converting
        array_combine( //create an array with key value pairs, key should be original vowel letter and value should be it's replacement
            str_split("aeiouAEIOU") //turn vowels (lower and upper) into an array
            ,str_split("eiouaEIOUA") //turn vowel replacements into an array
        )
    );
Grumpy mówi Przywróć Monikę
źródło