Ot wes thi bist uf tomis


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, великі та малі літери та пунктуація).
  • Для кожного голосного поверніть його до наступного голосного або поверніться до початку.
    • a => e
    • e => i
    • i => о
    • o => u
    • u => a
  • Голосні великі літери залишаються в верхньому регістрі, а голосні в нижньому регістрі - в нижньому регістрі.
  • Виведіть текст після цих перетворень.
  • Не потрібно підтримувати акценти.
  • Усі інші символи повинні залишатися незмінними.
  • Спробуйте це зробити в найменшій кількості байтів.
  • Будь-яка стара мова, яка вам подобається.

Випробування

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


4
Хм. Олдська англійська?
iammax

10
Ще легше читати, ніж Беовульф.
Смеато

4
Мені схоже на ківі-перекладач.
Магуо

1
Мені подобається, як "зло", коли шифри на "ivol", ефективно вимовляється так само.
Енріко Борба

Відповіді:



22

MS-SQL, 51 байт

Працює в SQL 2017 або вище:

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

Нова функція TRANSLATEвиконує індивідуальну заміну символів, тому ідеально підходить для цього завдання.

Введення здійснюється через попередньо існуючу таблицю t із стовпчиком varchar v , згідно наших правил IO .

У цьому випадку таблицю потрібно створити, використовуючи порівняльне з регістром порівняння , або за допомогою запущеного на регістр серверу, або за допомогою COLLATEключового слова (не зараховується до загальної кількості символів):

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

EDIT : SSMS може відрізати довгу цитату вище, коли повертає результат у вікні "результати в текст", це налаштування клієнта, а не помилка в моїй програмі .

Щоб виправити, перейдіть до Tools > Options > Query Results > SQL Server > Results to Textта збільште "Максимальна кількість символів, що відображаються в кожному стовпці".


1
Я щиро шокований тим, що SQL навіть близький до конкуренції за це. Крім того, це класна функція! Дякуємо за те, що нам розповіли :)
Позов

@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і повертає символ після першого появи cв s. Якщо ми передамо це разом, aeiouaAEIOUAвін виконає наш шифр на одному символі. Щоб зробити всю нашу функцію, нам слід було б відобразити це через рядок.


12

Сітківка ,10 9 8 байт

T`uo`vVA

Спробуйте в Інтернеті!

Збережено 1 байт завдяки Нілу! І ще один байт дякую Мартіну!

У новій версії сітківки є класи голосних, що робить результат трохи коротшим. Транслітерація також використовує клас "інший". Таким чином, toклас виглядає як "aeiouAEIOUA", тоді як fromклас виглядає як "uaeiouAEIOUA"

Це не спричиняє жодних проблем, оскільки друге uвідображення Aніколи не буде зроблено, оскільки uвже було зроблено a.


9 байт: T`_o`uvUV.
Ніл

Це надзвичайно коротка відповідь!
AJFaraday

@Neil розумний, дякую! Я думав, що введення _в набір буде вважати це буквально, але, схоже, це не робить.
FryAmTheEggman

3
Ви можете поголити ще одного, але я, здається, не можу пов'язати Стакса
Мартін Ендер

@MartinEnder Дякую! Це розумна настройка, яка поєднується між ними. Я ще не намагався використовувати Yбагато, тому завтра спробую.
FryAmTheEggman

9

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

y;AEIOUaeiou;EIOUAeioua

Спробуйте в Інтернеті

-1 байт завдяки @DomHastings


1
Ми більше не вважаємо -p+1, натомість вважаємо, що ця відповідь є в "Perl 5 + -p".
Ерік Аутгольфер

1
Це також працює в sed
Kritixi Lithos

1
Якщо ви використовуєте ;як роздільник, ви можете зберегти байт!
Дом Гастінгс

оновлено, @Cowsquack більше не
Nahuel Fouilleul

6

Python 3, 62 байти

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

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


Де це виконує введення-виведення?
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
}

1
Здається, це не стандартне розширення від gcc. Я знав це з php і просто спробував.
Крістоф

1
@Christoph Мені подобається, що ти використовуєш рекурсію, але я не впевнений, що ми можемо отримати результат \0. Також це не спрацьовує при компіляції з clang
OOBalance

1
@Christoph: Мені було цікаво, де не визначена поведінка, тож я налагодив версію clang, після того, як я ще дещо відкинув її. const char *res = strchr("AEIOU...", 0)повертає вказівник на термінатор у літеральному рядку. putchar(res[1])читає повз кінець рядкового літералу. З gcc, мабуть, трапляється знайти ще один нульовий байт, і він працює, але з clang він отримує 73 'I'(ймовірно, з main's string literal "Це було ...", але я не перевіряв ASM). Таким putcharчином, не повертається 0, і ми зрештою сегментуємося під час *c++читання сторінки, що не має карти
Пітер Кордес

2
@PeterCordes Так, я дізнався про це тут після підозри. У будь-якому випадку тут збережено ще 2 байти f(char*c){for(;*c;)putchar(1[strchr("AEIOUAaeioua",*c++)?:c-2]);}. Це все, напевне, думаю.
Крістоф

1
@Rogem З комутативного властивості того, a[b]==*(a+b)==*(b+a)==b[a]. Тому1[...]==(...)[1]
стельовий кот



5

Python 2 , 79 68 67 байт

-1 байт завдяки @ArnoldPalmer

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

Спробуйте в Інтернеті!


67 байт . Крім того, вибачте, якщо вас заполонили повідомлення, я деякий час не публікував коментар і забув, як це зробити.
Арнольд Палмер

@ArnoldPalmer Дякую! Це нормально, я був у відсутності, і всі вони сумували за мною: D
Dead Possum




4

Japt 2.0, 25 21 байт

Мені було весело грати в гольф цього Шаггі.

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

Виконати його тут.



1
@Shaggy Це не працює з великими голосними.
Олівер

1
У цьому випадку ... 22 байти .
Кудлатий

1
@Shaggy Це весело ... 21 байт
Олівер

1
Приємно! Я думаю, що це вперше я бачив, як S.p(f)користувався.
Кудлатий

4

Java 10, 97 87 байт

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

-10 байт після натхнення на відповідь JavaScript @Arnauld (його 60- байтна версія) .

Спробуйте в Інтернеті.

Пояснення:

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

4

05AB1E , 14 13 11 байт

žMDÀ‡žMuDÀ‡

Спробуйте в Інтернеті!


1
Ви можете зберегти два байти, просто взявши вхід як багаторядковий рядок, так що немає необхідності в |і »: Спробуйте в Інтернеті: 11 байт .
Кевін Кройссен

@KevinCruijssen Дякую! Це не те, що було виправлено в нещодавньому випуску 05AB1E?
Калдо

Немає ідеї tbh. Тільки розпочато 05AB1E з початку цього року. Ви можете запитати @Adnan в чаті 05AB1E, коли додано цю функцію, якщо ви хочете знати.
Kevin Cruijssen


3

APL + WIN, 55 байт

Підказки для введення рядка:

i←(10≥n←'AEIOUaeiou'⍳s)/⍳⍴s←⎕⋄s[i]←'EIOUAeioua'[n~11]⋄s

3

Свинка, 38 байт

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

Свинка зазвичай не додає повернення каретки, тому що я не бачив вимоги відокремлювати вхід від виходу, але це виглядає трохи дивно під час першого запуску. Наприклад, результат для останнього тестового випадку виглядає так:

Programming Puzzles And Code GolfPrugremmong Pazzlis End Cudi Gulf

Якщо ви хочете додати декларацію про перевезення, додайте таким чином два байти:

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

3

Vim + tpope / vim-Скасувати , 30 байт

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

Альтернативне рішення, також 30 байт:

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

Відповідно до мета , vim відповіді можуть використовувати плагіни без байтового штрафу. Це не відповідь vim, а vim + скасування відповіді.


Abolish - надзвичайно корисний плагін. У цьому розділі README добре описано, як працює ця команда ( Subvertкоманда).


3

CJam , 29 19 байт

q"aeioua"_eu+_1m<er

Спробуйте в Інтернеті!

-10 байт завдяки @Peter Taylor

Пояснення:

q                       # take all input
 "aeioua"               # push vowel pairs
         _eu            # duplicate, uppercase
            +_          # concatenate, duplicate again
              1m<       # rotate left by 1
                 er     # transliterate

Хоча питання не конкретно стосовно введення, я думаю, ви, мабуть, повинні використовувати, qа не lбрати вклад. Перший тестовий вигляд представляється багаторядковим. Також можна скоротити "eioua"до _1m<. Насправді ви можете піти далі і пограти в цеq"aeioua"_eu+_1m<er
Пітер Тейлор


2

PHP, 90 байт

Спробуйте в Інтернеті

Код

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

Пояснення

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 байт, якщо вони використовуються з php -rвикористанням$argv

<?=strtr($argv,array_combine(str_split(UuAaEeIiOo),str_split(AaEeIiOoUu)));



2

PHP, 38 байт

Досить простий, не дуже креативний, використовує strtrдля заміни голосних:

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

Запустіть echo '<input>' | php -nF <filename>або спробуйте в Інтернеті .


Чи не передбачає це, що вхід призначений заздалегідь заданій змінній argn? Якщо так, то це не вірно; вам потрібно буде передавати рядок як аргумент і використовувати $argv1]замість цього.
Кудлатий

2
@Shaggy Ні, якщо ви запустите його з -Fпрапором, він працює з введенням в командному рядку. З документів PHP щодо варіантів : -F --process-file PHP file to execute for every input line. Added in PHP 5.Визначення змінної "Спробуйте в Інтернеті" - це лише тому, що у деяких людей PHP не встановлено локально, і я не міг отримати -Fпрапор, що працює в TIO.
Давид

1
Дякую, @David - це моє "щось нове" для PHP сьогодні :)
Shaggy

2

q / kdb +, 36 33 байт

Рішення:

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

Приклади:

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"

Пояснення:

Визначте індекс голосних, додайте один, щоб натиснути на наступний, та індексуйте. Все ж думаю, що цей підхід можна значно покращити ...

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

Бонус:

Моє старе рішення ** (36) байт (()), яке, на мою думку, є досить класним, але мені потрібно розгорнути список, щоб зробити його конкурентоспроможним:

ssr/[;"uoiea%UOIEA%";"%uoiea%UOIEA"]

2

Вугілля деревне , 35 байт

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

Спробуйте в Інтернеті!

Наївний метод.

Пояснення:

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)

2

PHP , 76 байт.

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

Перевір!

Це було найкоротше, що мені вдалося це зробити в 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
        )
    );
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.