Перетворити рядок у його еквівалент Rövarspråket


15

Rövarspråket

Rövarspråket - гра в слова, яку грають шведські діти, з книг про Калле Бломквіст Астрід Ліндгрен.

Основні правила такі (з Вікіпедії):

  • Кожен приголосний (правопис має значення, а не вимова) подвоюється, а між ними вставляється o.
  • Голосні звуки залишаються недоторканими.

Кілька прикладів:

  • "привіт" -> "хохелоллоло"
  • "Min minäää är full med ål" -> "MoMinon sosvovävovarore äror fofulollol momedod ålol"

Шведські приголосні такі ж, як і англійські, тому програма повинна працювати як із шведською, так і з англійською мовами.

Буква "у" в цьому випадку сприймається як приголосний - як і більшість часу.


Ваше завдання:

Напишіть програму для перетворення рядка шведських літер, введених через функцію або через stdin, у його еквівалент Rövarspråket. Найкоротша відповідь у байтах виграє!


@ MartinBüttner далі уточнив моє запитання - воно має працювати зі шведською (оскільки це шведська гра в слова).
Джеймс Вільямс

Яке значення алфавітних записів?
Оптимізатор

@Optimizer Рядок лише алфавітних символів. Вибачте, я погано висловив це, редагую
Джеймс Вільямс

3
Як слід ставитися до листів, що не стосуються? Принаймні пробіли відображаються у другому прикладі.
німі

2
Зі сторони: "Y" вважається голосною шведською мовою
leo

Відповіді:


14

Сітківка , 14 + 5 = 19 байт

Сітківка - це мова, яка по суті є просто .NET регулярним виразом з якомога меншими накладними витратами. Код цієї програми складається з двох файлів:

i`[b-z-[eiou]]
$0o$0

Це зчитує вхід на STDIN і друкує вихід на STDOUT.

Якщо ви зателефонуєте у файли pattern.rgxі replacement.rpl, можна запустити програму просто так

echo "hello" | ./Retina pattern.rgx replacement.rpl

Пояснення

Це досить просто, але дозвольте мені все-таки додати трохи пояснень (переважно про те, як працює Retina). Якщо Retina викликається двома файлами, то автоматично передбачається, що вона працює в режимі «Заміна», де перший файл - це регулярний вираз, а другий - шаблон.

Сітківку можна налаштувати (що включає в себе RegexOptionsта інші параметри), попередньо додавши регулярний вираз `і конфігураційну рядок. У цьому випадку я лише надаю це, iякий є нормальним модифікатором регулярних виразів для нечутливості випадку.

Що стосується самого регулярного вираження, він використовує віднімання класу символів .NET, щоб відповідати будь-якому приголосному в діапазоні ASCII. Потім заміна просто записує матч двічі з oпроміжком.


Ви пропускаєте a у класі вашого голосного персонажа?
Брайан Гордон

3
@BrianGordon Ні, я починаю клас символів з b, тому мені не потрібно віднімати a.
Мартін Ендер

2
Цікаво, що я ніколи не бачив вкладених, віднімаючих діапазонів символів раніше. Це просто .NET річ?
Стів Беннетт

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

@Sparr так, це політика зараз, але ця політика є новішою, ніж ця проблема / відповідь. Для довідки (насправді, якщо ви подивитесь на часові позначки, ви можете побачити, що я наполягав на політиці через цю відповідь, але застосовувати такі правила на всьому сайті заднім числом не має особливого сенсу.)
Мартін Ендер,

12

Використання Unix KSH 27 28 32 27 байт (або 21, якщо рахувати лише команду sed)

Завдяки пропозиціям інших людей :) Вдячний.

.. Я дійшов до цього:

sed 's/[^AEIOUÅÄÖ ]/&o&/ig'

(дозволено для пробілів та шведських символів)

echo "hello" | sed 's/[BCDFGHJ-NP-TV-Z]/&o&/ig'
hohelollolo
echo "HELLO" | sed 's/[BCDFGHJ-NP-TV-Z]/&o&/ig'
HoHELoLLoLO
echo "QuIcKlY Now" | sed 's/[BCDFGHJ-NP-TV-Z]/&o&/ig'
QoQuIcocKoKlolYoY NoNowow

4
Крім того, я вважаю, що можна стверджувати, що ваша відповідь - це sedпрограма, і просто порахуйте байти між цитатами
Digital Trauma

1
s/[^AEIOU]/&o&/igздається, працює .. принаймні для окремих слів ... вам потрібно буде також виключити пробіли
Digital Trauma

1
баш, хоч оболонка не має значення, поки ваша програма sed в одних котируваннях
Digital Trauma

1
Також стежте за шведськими голосні ö, åі так далі - це необхідність виключення теж. Можливо, краще використовувати білий список лише приголоснихs/[BCDFGHJ-NP-TV-Z]/&o&/ig
Digital Trauma

2
Я зробив би це "sed" і використав "s / [^ AEIOUÅÄÖ] / & o & / ig", який охоплює шведські голосні голоси та пробіли на 25 байт.
swstephe

7

CJam, 32 30 байт

q{_eu'[,66>"EIOU"-#)g{'o1$}*}/

Це повне читання програми від STDIN та друк до STDOUT. Він працює для довільного введення Unicode і розглядає наступні 42 символи як приголосні:

BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz

Тестуйте це тут.

Пояснення

q                              "Slurp STDIN.";
 {                          }/ "For each character...";
  _eu                          "Duplicate and convert to upper case.";
     '[,66>                    "Get a string from B to Z using range and slice.";
           "EIOU"-             "Remove the remaining four vowels.";
                  #            "Find the position of the character in this string or
                                -1 if the character can't be found.";
                   )g          "Increment, take signum, which gives 1 for consonants, 
                                and 0 otherwise.";
                     {    }*   "Repeat this block that many times, i.e. do nothing for
                                non-consonants.";
                      'o       "Push an 'o'.";
                        1$     "Copy the current character.";

5

JavaScript, 59 57 55 44 байт

s=>s.replace(/(?![eiou])[b-z]/gi,"$&o$&")

Дякую Masterzagh за те, що він нагадав мені, що функція також буде прийнятною, а також за його підказку щодо зворотних переказів без захоплення!

Більш довга версія з входом / виходом:

alert(prompt().replace(/(?![eiou])[b-z]/gi,"$&o$&"));

Відображає вікно підказок для введення рядка, а потім показує діалогове вікно, що містить вихід Rövarspråket. Код використовує регулярний вираз для подвоєння приголосних і вставки os.


"Написати програму для перетворення рядка шведських букв, введених через функцію або через stdin", Ви можете зробити цеs=>alert(s.replace(/(?![eiou])([b-z])/gi,"$1o$1"));

А оскільки його не просили виводити, вам також не потрібно сповіщення.

І ще одне - ви можете повернутись назад, не захоплюючи . В основному так s=>s.replace(/(?![eiou])[b-z]/gi,"$&o$&"), оскільки $&означає, що поточна відповідність, ви можете видалити дужки, які захоплюють ваш лист, і поки ви знаходитесь в ньому, збережіть ще один байт, видаливши крапку з комою.

@Masterzagh Це здорово, ще раз дякую!
ProgramFOX

4

Математика, 84 73 72 байт

StringReplace[#,a:RegularExpression@"(?i)[BCDFGHJ-NP-TV-Z]":>a<>"o"<>a]&

Пояснення:

  • RegularExpression@"(?i)[BCDFGHJ-NP-TV-Z]" являє собою регулярний вираз, який відповідає всім приголосним регістру без чутливості.
  • a:*..*:>a<>"o"<>a створює правило із запізненням на прив'язку цих приголосних a , замінювати їх оточеними собою.
  • Нарешті, StringReplace[#,*..*]&створює чисту функцію, застосовуючи це правило до кожної відповідної літери в своєму аргументі.

@ MartinBüttner Дякую! Ще новинка в гольф Mathematica ...
LegionMammal978

@ MartinBüttner збирався зробити це все одно, але відволікався на деякі повідомлення: P
LegionMammal978

4

Юлія, 46 44 байти

t->replace(t,r"(?![eiou])[b-z]"i,s->s*"o"*s)

Це створює анонімну функцію, яка приймає один рядок і друкує еквівалент Rövarspråket. Щоб зателефонувати, дайте ім’я, наприклад f=t->....

Тут не багато справді гольфу, крім місця після коми в replace().

Тут ми використовуємо 3 аргументи у replace()функції: рядок введення, регулярний вираз для ідентифікації підрядків та заміну. Джулія позначає закономірні форми виразів через r"...". Якщо додати iкінець, це робить його нечутливим. Цей конкретний вираз відповідає збігу приголосних. Якщо для заміни використовується функція, то вихід є тією функцією, яка застосовується до кожної збіжної підрядки. Функція, яку ми тут використовуємо, займає рядок sі повертається sos, оскільки* виконує конкатенацію рядків у Джулії. Таким чином, кінцевим результатом є вхідний рядок з кожним приголосним, подвоєним між "o" між.

Приклади:

julia> f("Min svävare är full med ål")
"MoMinon sosvovävovarore äror fofulollol momedod ålol"

julia> f("hello")
"hohelollolo"

julia> f("Rövarspråket")
"RoRövovarorsospoproråkoketot"

Зауважте, що це буде на 9 байт довше, якщо нам доведеться надрукувати результат, а не повертати його. Очікуємо підтвердження від ОП.


Редагувати: Збережено 2 байти завдяки Мартіну Бюттнеру!


3

Haskell, 81 байт

x n|elem n"bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ"=[n,'o',n]|1<2=[n]
f=(>>=x)

Використання: f "Hello there!"-> "HoHelollolo tothoherore!".

Я не можу вміло скласти список приголосних без дорогих imports. Навіть перевернення букви для перевірки на малі регістри потребує більше байтів, ніж просто перерахування як верхніх, так і малих приголосних.



2

Perl, 33 байт

Ця відповідь здебільшого має лише зворотній зсув з невеликою кількістю додаткового коду для виконання вводу-виводу

$_=<>;s/[^aeiou\W]/$&o$&/gi;print

Минув час, коли я використовував виразки Perl, тому, можливо, це можна покращити.

$_=<>;                              This takes input from STDIN `<>` and stores
                                    it into the default variable $_
      s/          /     /gi;        This is a case-(i)nsentive, (g)lobal, 
                                    (s)ubstitution regex.  Since no other
                                    variable is specified, it is applied to
                                    the default variable $_.
        [^aeiou\W]                  This matches any single character that 
                                    is a consonant, by using a double-
                                    negative ^\W to match only alphanumeric 
                                    characters excluding vowels.  Accented 
                                    vowels are not considered alphanumeric 
                                    by Perl.
                   $&o$&            This forms the replacement.  $& contains the 
                                    match (the consonant), so this replaces each 
                                    consonant with two copies of itself with 
                                    an 'o' in between.
                            print   This prints the result.  With no arguments, 
                                    it prints $_ by default.

Ще не [^aeiou]збігаються з å та іншими голосними, що не належать до ASCII?
Алекс А.

@AlexA. Я вже помітив проблему. Це було виправлення нульових символів ( \sдо \W).
PhiNotPi

+1, найбільш ретельне пояснення коду Perl, який я бачив на цьому сайті.
Згарб

2

C (версія ideone.com) - 133

Гаразд, це величезна кількість. Але у C немає регулярних виразів. Скажіть, будь ласка, якщо ви бачите щось, що може скоротити його ...

#define x (*c<66||*c>90)&&(*c<98||*c>122)||strchr("EIOUeiou",*c)?"":
c[2];main(){while(0<(*c=getchar()))printf("%s%s%s",c,x"o",x c);}

Як cзаявляється локальна змінна ?
wjl

@wjl глобальні змінні в C нульово ініціалізуються. Локальні змінні знаходяться на стеку і не ініціалізуються. Дивіться stackoverflow.com/questions/3553559/… Змінні з типом за замовчуванням для int, а оскільки printf працює на символах, у коду можуть виникнути проблеми з ендіапізмом - я перевірю завтра.
Джеррі Єремія

Так, я розумію ініціалізацію за замовчуванням. Я просто намагався красиво зазначити, що цей код не компілюється, оскільки cвзагалі не декларується , наприклад out.c:2:18: error: ‘c’ undeclared (first use in this function).
wjl

@wjl Я думаю, це залежить від компілятора. Він збирається та працює на ideone.com ideone.com/s7M5mZ, коли ви вибираєте C - будь-яка ідея в чому різниця?
Джеррі Єремія

Схоже на помилку з компілятором ideone. Якщо ви виправите новий рядок між c[2];main(необхідний, оскільки #defineне закінчується крапкою з комою), він дає подібні помилки як GCC. У будь-якому випадку, нічого страшного, це все-таки веселий код-гольф, але вам може знадобитися ще кілька символів, щоб зробити цю дійсну C. =)
wjl

2

Windows Batch, 235 байт

@echo off
setlocal enabledelayedexpansion
set d=qwrtypsdfghjklzxcvbnm
set #=%1
:x
if defined # (
for /l %%i in (0,1,20)do (
set m=!d:~%%i,1!
if /i !m!==%#:~0,1% set g=!g!!m!o)
set g=!g!%#:~0,1%
set #=%#:~1%
goto x)
echo %g%

Використання:

script.bat hello

Вихід:

hohelollolo

Вам може бути цікаво, чому я не встановив "d" на "aoui", для перевірки нерівних потрібен вихід з циклу. Не все, що повинно працювати, працює, в партії. Сценарій обробляє 1 слово символів [як вони відображаються на вашій клавіатурі]. Для запуску сценарію потрібні всі наявні пробіли та нові рядки.

Потрібна система Windows XP або новішої версії. Не тестується в Windows 8 і вище.


2

PowerShell - 35 байт

Тільки для того, щоб показати, що PowerShell може змагатися і в цих випадках, і з регулярним виразом, який безсоромно вкрав із відповіді Сіті Мартіна Бюттнера:

%{$_-replace'[b-z-[eiou]]','$0o$0'}

приймає рядковий вхід від stdin


1

Pyth - 28 байт

Це працює очевидним чином, генеруючи список приголосних на льоту, використовуючи задану різницю.

FNzpk+N?+\oN}rNZ-{G{"aeiou"k

Пояснення найближчим часом.

Спробуйте тут .


Ви можете зберегти 4 біти, видаливши 4 символи та замінивши одну таблицю іншою.
Якубе



1

Пітона, 61

Я не міг змусити об'єднання чи віднімання класів символів працювати, і тому я не думаю, що Python має таку особливість. Мені довелося замість цього використовувати негативну підказку.

import re;f=lambda s:re.sub('(?i)(?![eiou])([b-z])',r'\1o\1',s)

Запустіть його тут: http://repl.it/fQ5

Посилання на обернене: /codegolf//a/48182/34718


1

К, 38 символів

f:{,/(1+2*~(_x)in"aeiouåäö ")#'x,'"o"}

-1 f"Min svävare är full med ål";
MoMinon sosvovävovarore äror fofulollol momedod ålol

1

К, 31 байт

,/{(x,"o",x;x)9>" aeiouåäö"?x}'

Просте рішення виглядає досить конкурентоспроможним, враховуючи, що K не вистачає регулярних виразів. Виберіть між формою "XoX" та "X", залежно від того, чи був знайдений кожен символ у таблиці пошуку проігнорованих голосних звуків, і приєднайтесь до отриманих списків.

Ви можете спробувати його у своєму браузері за допомогою кнопки oK :

http://johnearnest.github.io/ok/index.html?run=%20%2C%2F%7B(x%2C%22o%22%2Cx%3Bx)9%3E%22%20aeiouåäö%22%3Fx%7D'%22Min%20svävare%20är%20full%20med%20ål%22

(На жаль, я не можу надати посилання, на якому можна натиснути, оскільки переповнення стека не відображається, щоб дозволити символи з наголосом у URL-адресах)


0

Гольфскрипт, 35 байт

{."aeiouåäö\n "?-1={."o"\}{}if}%

Очікує, що вхід буде в стеці. З входом (50 байт):

"#{STDIN.gets}"{."aeiouåäö\n "?-1={."o"\}{}if}%

Працює зі шведськими голосними å, ä і ö.


2
input is always on stack on GS
Optimizer

0

Sed (on command line), 28 bytes

sed 's/\([^aeiou]\)/\1o\1/g'

Either pipe the text in or type it direct. Just the sed code on its own is 22 bytes.


3
This also duplicates spaces and chars like ä.
ProgramFOX

0

R, 45 chars

gsub("([^aeiouäöå ])","\\1o\\1",readline(),i=T)

Simple regex. Reads from stdin. i=T stands for ignore.case=TRUE (thanks to partial matching of argument names), which makes gsub case insensitive.

Usage:

> gsub("([^aeiouäöå ])","\\1o\\1",readline(),i=T)
Min svävare är full med ål
[1] "MoMinon sosvovävovarore äror fofulollol momedod ålol"
> gsub("([^aeiouäöå ])","\\1o\\1",readline(),i=T)
hello
[1] "hohelollolo"
> gsub("([^aeiouäöå ])","\\1o\\1",readline(),i=T)
hElLo
[1] "hohElolLoLo"


0

golflua, 36 bytes

B=I.r():g("[^aeiou%W ]","%1o%1")w(B)

Simple pattern-matching: take stdin, then find the non-vowels (%W takes care of non-alphanumeric chars) & insert an o between the two replacements. Sadly, doing all this within the write (i.e., w(I.r():g(....))) also output the count of insertions, though it saved 3 chars. A Lua equivalent would be

line = io.read()
rovar = line:gsub("[^aeiou%W ]","%1o%1")
print(rovar)

0

REXX, 107 bytes

parse arg s
v='aeiouåäö '
o=
do until s=''
  parse var s l 2 s
  if verify(l,v)>0 then l=l'o'l
  o=o||l
  end
say o

"MoMinon sosvovävovarore äror fofulollol momedod ålol"


0

JavaScript 43

Thanks to @Masterzagh for saving on function syntax.

x=>x.replace(/[bcdfghj-np-tv-z]/gi,"$&o$&")

JavaScript 62

function E(x){return x.replace(/[bcdfghj-np-tv-z]/gi,"$&o$&")}

Your function can be in the form of an anonymous arrow function like x=>x.replace(/[bcdfghj-np-tv-z]/gi,"$&o$&"). Arrow functions work like this name=(arg1, arg2)=>{code}. () are not needed if there's only one argument and {} are not needed if there's only one line of code. Return is also not needed if the one line returns something.

And I forgot to say. You don't need to give it a name to solve the problem which only asked you to create a function.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.