От этого мира.

36

Я просто обожаю этот простой шифр, так весело читать не совсем понятные человеку слова и заполнять пробелы ...

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.

Правила очень просты:

  • Принять некоторый текст в качестве ввода (символы ASCII, прописные / строчные буквы и знаки препинания).
  • Для каждого гласного поверните его к следующему гласному или назад к началу.
    • а => е
    • е => я
    • я => о
    • о => ты
    • и => а
  • Прописные гласные остаются заглавными, строчные - строчными.
  • Вывести текст после этих преобразований.
  • Не нужно поддерживать акценты.
  • Все остальные символы должны остаться без изменений.
  • Попробуйте сделать это в наименьшем количестве байтов.
  • Любой старый язык, который вам нравится.

Тестовые случаи

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.

Вне:

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.

В:

The quick brown fox jumps over the lazy dog.

Вне:

Thi qaock bruwn fux jamps uvir thi lezy dug.

В:

Home is where the heart is.

Вне:

Humi os whiri thi hiert os.

В:

Boaty McBoatface

Вне:

Buety McBuetfeci

В:

AEIOUaeiou

Вне:

EIOUAeioua

В:

Programming Puzzles And Code Golf

Вне:

Prugremmong Pazzlis End Cudi Gulf
AJFaraday
источник
20
Aka The Great Vowel Shift
Angs
4
Хм. Старый английский?
iammax
10
Все еще легче читать, чем Беовульф.
Сметано
4
Похоже, киви-переводчик для меня.
Магу
1
Мне нравится, как «зло», когда шифры для «ивол», эффективно произносится так же.
Энрико Борба

Ответы:

22

MS-SQL, 51 байт

Работает на SQL 2017 или выше:

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

Новая функция TRANSLATE выполняет замену отдельных персонажей, поэтому идеально подходит для этой задачи.

Ввод осуществляется с уже существующей таблицей т на колонку с VARCHAR V , в соответствии с нашими правилами ввода - вывода .

В этом случае таблица должна быть создана с использованием сортировки с учетом регистра , либо путем запуска на чувствительном к регистру сервере, либо с использованием COLLATEключевого слова (не учитывается в общем количестве символов):

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

РЕДАКТИРОВАТЬ : SSMS может обрезать длинную цитату выше при возврате результата в окне «результаты в текст», это настройка клиента, а не ошибка в моей программе .

Чтобы исправить, перейдите Tools > Options > Query Results > SQL Server > Results to Textи увеличьте «Максимальное количество символов, отображаемых в каждом столбце».

BradC
источник
1
Я искренне шокирован тем, что SQL даже близко к этому конкурентоспособен. Кроме того, это крутая функция! Спасибо за сообщение :)
Фонд Monica's судебный процесс
@NicHartley Да, кажется, они добавляют пару полезных функций в каждой версии. Вы также можете использовать его REPLACEдля некоторых приемов: например, REPLACE(TRANSLATE(v,'1234567890','xxxxxxxxxx'),'x','')исключить все цифры из строки. Все еще долго, но намного короче 10 вложенных REPLACEс.
BradC
14

Haskell , 52 байта

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

Попробуйте онлайн!

Линн спасла мне два байта, указав, что !!0она короче head.

объяснение

Если вы никогда не кодировали на Haskell, это, вероятно, будет похоже на кучу бреда. Итак, сначала давайте раскроем это, а затем разберем это:

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

Сначала у нас есть функция !, которая принимает строку sи символ c. Наше первое совпадение с шаблоном принимает входные данные, если строка не пустая. Если строка не пустая, мы сравниваем ее первый символ с c. Если его первый символ не равен, cмы бросаем его и вызываем !снова с остатком строки иc . Если оно равно, мы возвращаем второй символ в строке.

Наше следующее сопоставление с образцом перехватывает строку во всех других случаях, то есть, если строка пуста. В этом случае мы просто вернемся c.

В общем, эта функция принимает символ cи строку sи возвращает символ после первого появления cin s. Если мы передадим это вместе с aeiouaAEIOUAним, мы выполним наш шифр с одним символом. Чтобы сделать всю нашу функцию, мы должны отобразить это через строку.

Мастер пшеницы
источник
12

Сетчатка ,10 9 8 байт

T`uo`vVA

Попробуйте онлайн!

Сохранено 1 байт благодаря Нейлу! И еще один байт благодаря Мартину!

Новая версия сетчатки имеет классы гласных, что делает результат немного короче. Транслитерация также использует «другой» класс. Таким образом, toкласс выглядит как "aeiouAEIOUA", аfrom класс выглядит как «uaeiouAEIOUA»

Это не вызывает никаких проблем, так как второе uсопоставление Aникогда не будет выполнено, поскольку оно uуже сопоставлено a.

FryAmTheEggman
источник
9 байт: T`_o`uvUV.
Нил
Это удивительно короткий ответ!
AJFaraday
@ Нил умный, спасибо! Я думал, что вставка _из набора будет относиться к нему буквально, но похоже, что он этого не делает.
FryAmTheEggman
3
Вы можете сбрить еще одного, но, к сожалению, я не могу связать Stax: tio.run/##HYnBDoIwEAXv/…
Martin Ender,
@MartinEnder Спасибо! Это умная установка, смешивание между ними. Я еще не пробовал Yмного, поэтому завтра попробую.
FryAmTheEggman
9

Perl 5 + -p, 24 23 байта

y;AEIOUaeiou;EIOUAeioua

Попробуйте онлайн

-1 байт благодаря @DomHastings

Науэль Фуйе
источник
1
Мы больше не считаем -p+1, вместо этого мы считаем, что этот ответ находится в «Perl 5+ -p».
Эрик Outgolfer
1
Это также работает в sed
Kritixi Lithos
1
Если вы используете ;в качестве разделителя, вы можете сохранить байт!
Дом Гастингс
обновлено, @ Cowsquack больше нет
Науэль Фуийе
6

Python 3, 62 байта

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

Составьте таблицу перевода (словарь) с помощью strстатического str.maketransметода. Переведите соответствующие символы в их символы назначения.

mypetlion
источник
Где это выполняет ввод / вывод?
reinierpost
@reinierpost Это функция. Ввод осуществляется через xпараметр. В python лямбда-функции не требуют оператора return.
Mypetlion
6

C 85 76 67 65 64 байта

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

Порт Кевина Круйссена Java ответ . Попробуйте это онлайн здесь .

Спасибо Кевину Круйссену за игру в гольф 9 байтов, Кристофу за игру в гольф 11 байтов и потолку за игру в гольф 1 байт.

Безголовая версия:

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
источник
1
Кажется, это не стандартное расширение от GCC. Я знал это по php и просто попробовал.
Кристоф
1
@Christoph Мне нравится твое использование рекурсии, но я не уверен, что мы можем вывести трейлинг \0. Кроме того, это не работает при компиляции с помощью clang: tio.run/##S9ZNzknMS///…
OOBalance
1
@Christoph: Мне было любопытно, где было неопределенное поведение, поэтому я отладил версию Clang, после того, как еще немного ее разгадал. const char *res = strchr("AEIOU...", 0)возвращает указатель на терминатор в строковом литерале. putchar(res[1])читает после конца строкового литерала. С gcc, по-видимому, он находит другой нулевой байт, и это работает, но с clang он получает 73 'I'(вероятно, из mainстрокового литерала "Это было ...", но я не проверял asm). Так putcharчто не возвращает 0, и мы в конечном итоге segfault, когда *c++читает не отображенную страницу.
Питер Кордес
2
@PeterCordes yeah I found out about it here after having a suspicion. Anyway here another 2 bytes saved f(char*c){for(;*c;)putchar(1[strchr("AEIOUAaeioua",*c++)?:c-2]);}. That's all for now I guess.
Christoph
1
@Rogem Because of the commutative property of addition, a[b]==*(a+b)==*(b+a)==b[a]. Therefore 1[...]==(...)[1]
ceilingcat
5

Python 2, 79 68 67 bytes

-1 byte thanks to @ArnoldPalmer

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

Try it online!

Dead Possum
источник
67 bytes. Also, sorry if you got flooded with notifications, I haven't posted a comment in a while and forgot how to do it.
Arnold Palmer
@ArnoldPalmer Thanks! It's ok, I was away and they all missed me :D
Dead Possum
5

JavaScript (ES6), 60 bytes

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

Try it online!

Arnauld
источник
s=>s.replace(/./g,c=>'auoieaAUOIEA'.match(".(?=${c})")||c)
tsh
Error: only. => unlya
l4m2
4

Pyth, 17 bytes

em=.rQdrB"aeiou"1

Try it here

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.

источник
4

Japt 2.0, 25 21 bytes

I had fun golfing this one with Shaggy.

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

Run it here.

Oliver
источник
1
23 bytes
Shaggy
1
@Shaggy That doesn't work with capital vowels.
Oliver
1
In that case ... 22 bytes.
Shaggy
1
@Shaggy This is fun...21 bytes
Oliver
1
Nice! I think that's the first time I've seen S.p(f) used.
Shaggy
4

Java 10, 97 87 bytes

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

-10 bytes after being inspired by @Arnauld's JavaScript answer (his 60-bytes version).

Try it online.

Explanation:

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
источник
4

05AB1E, 14 13 11 bytes

žMDÀ‡žMuDÀ‡

Try it online!

Kaldo
источник
1
You can save two bytes by simply taking the input as a multi-line string, so there is no need for the | and »: Try it online: 11 bytes.
Kevin Cruijssen
@KevinCruijssen Thanks ! Isn't that something that was fixed in a recent 05AB1E release ?
Kaldo
No idea tbh. Only started 05AB1E since about the start of this year. You could ask @Adnan in the 05AB1E chat when the feature was added if you want to know.
Kevin Cruijssen
3

APL+WIN, 55 bytes

Prompts for input string:

i←(10≥n←'AEIOUaeiou'⍳s)/⍳⍴s←⎕⋄s[i]←'EIOUAeioua'[n~11]⋄s
Graham
источник
3

Mumps, 38 bytes

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

Mumps doesn't normally add a carriage return, as I didn't see a requirement to separate input from output it does look a bit weird on first run. For example, the output for the last test case looks like this:

Programming Puzzles And Code GolfPrugremmong Pazzlis End Cudi Gulf

If you did want to add a carriage return, add two bytes thusly:

R T W !,$TR(T,"AEIOUaeiou","EIOUAeioua")
zmerch
источник
3

Vim + tpope/vim-abolish, 30 bytes

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

Alternate solution, also 30 bytes:

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

According to meta, vim answers can use plugins with no byte penalty. This is not a vim answer, but a vim + abolish answer.


Abolish is an extremely useful plugin. This section of the README nicely describes how this command (the Subvert command) works.

DJMcMayhem
источник
3

CJam, 29 19 bytes

q"aeioua"_eu+_1m<er

Try it online!

-10 bytes thanks to @Peter Taylor

Explanation:

q                       # take all input
 "aeioua"               # push vowel pairs
         _eu            # duplicate, uppercase
            +_          # concatenate, duplicate again
              1m<       # rotate left by 1
                 er     # transliterate
vazt
источник
Although the question isn't specific about the input, I think you should probably use q rather than l to take input. The first test case appears to be multi-line. Also you can shorten "eioua" to _1m<. In fact, you can go further and golf this to q"aeioua"_eu+_1m<er
Peter Taylor
3

AutoHotkey, 24 bytes

AuotHotkey automatically replaces letters in a case sensitive manner.

a::e
e::i
i::o
o::u
u::a
nelsontruran
источник
2

PHP, 90 Bytes

Try it online

Code

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

Explanation

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 Bytes if ran with php -r using $argv

<?=strtr($argv,array_combine(str_split(UuAaEeIiOo),str_split(AaEeIiOoUu)));
Francisco Hahn
источник
2

str, 18 bytes

[aeiouaAEIOUA]#D#U

Try it online!

Explanation

                       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
источник
2

PHP, 38 bytes

Quite simple, not very creative, uses strtr to replace the vowels:

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

Run with echo '<input>' | php -nF <filename> or Try it online.

Davіd
источник
Does this not assume that the input is assigned to the predefined variable argn? If so then that's not valid; you'd need to pass the string as an argument and use $argv1] instead.
Shaggy
2
@Shaggy No, if you run it with the -F flag, then it works with input on the command line. From the PHP docs on options: -F --process-file PHP file to execute for every input line. Added in PHP 5. The Try it online variable defining is just because some people don't have PHP installed locally, and I couldn't get the -F flag working in TIO.
Davіd
1
Thanks, @David - that's my "something new" for PHP today :)
Shaggy
2

q/kdb+, 36 33 bytes

Solution:

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

Examples:

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"

Explanation:

Figure out index of vowels, add one to push along to the next and index in. Still think this approach can be significantly improved...

{(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

Bonus:

My old **36 byte(()) solution which I think is quite cool, but need to golf down the lists to make it competetive:

ssr/[;"uoiea%UOIEA%";"%uoiea%UOIEA"]
streetster
источник
2

Charcoal, 35 bytes

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

Try it online!

Naive method.

Explanation:

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)
ASCII-only
источник
2

PHP, 76 bytes.

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

Check it out!

This was the shortest I was able to do this in 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 says Reinstate Monica
источник