Преобразовать строку в эквивалент Rövarspråket


15

Rövarspråket

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

Основные правила следующие (из Википедии):

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

Несколько примеров:

  • "привет" -> "hohelollolo"
  • "Min svävare är full med ål" -> "MoMinon sosvovävovarore äror fofulollol momedod ålol"

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

Буква «у» в этом случае воспринимается как согласная, как и в большинстве случаев.


Твое задание:

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


@ MartinBüttner Уточнил мой вопрос дальше - он должен работать со шведским языком (так как это шведская игра в слова).
— Джеймс Уильямс

В чем смысл алфавитных записей?
— Оптимизатор

@Optimizer Строка только из буквенных символов. Извините, я плохо сформулировал это, я отредактирую
— Джеймс Уильямс,

3
Как мы должны относиться к не буквам? По крайней мере, пробелы появляются во втором примере.
— Ними

2
С другой стороны: «Y» считается гласным на шведском языке
— Лев

Ответы:


14

Сетчатка , 14 + 5 = 19 байт

Retina - это язык, который по сути является регулярным выражением .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
bash, хотя оболочка не должна иметь значения, если ваша программа 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

Mathematica, 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, поскольку *выполняет конкатенацию строк в Julia. Таким образом, конечным результатом является входная строка с каждым согласным, удвоенным с «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, 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 может иногда конкурировать и с этим, и с беззастенчивым похищением регулярных выражений из ответа Retina Мартина Бюттнера:

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

принимает ввод строки из стандартного ввода


1

Pyth - 28 байт

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

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

Объяснение скоро.

Попробуй это здесь .


Вы можете сохранить 4 бита, удалив 4 символа и заменив один символ другим.
— Якуб



1

Python, 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» в зависимости от того, был ли найден каждый символ в таблице поиска игнорируемых гласных, и присоединитесь к полученным спискам.

Вы можете попробовать это в своем браузере, используя ОК :

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

Golfscript, 35 байт

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

Ожидается, что вход будет в стеке. С вводом (50 байтов):

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

Работает со шведскими гласными å, ä и ö.


2
ввод всегда в стеке на GS
— Оптимизатор

0

Sed (в командной строке), 28 байт

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

Либо передайте текст, либо введите его напрямую. Сам по себе код sed составляет 22 байта.


3
Это также дублирует пробелы и символы как ä.
— ProgramFOX

0

R, 45 символов

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

Простое регулярное выражение. Читает со стандартного ввода. i=Tозначает ignore.case=TRUE(благодаря частичному сопоставлению имен аргументов), что делает gsubрегистр нечувствительным.

Использование:

> 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 байт

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

Простое сопоставление с образцом: возьмите stdin, затем найдите не гласные ( %Wзаботится о не алфавитно-цифровых символах) и вставьте oмежду двумя заменами. К сожалению, выполнение всего этого в рамках записи (т. Е. w(I.r():g(....))) Также выводит количество вставок, хотя это сохранило 3 символа. Эквивалент Lua будет

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

0

REXX, 107 байт

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

Спасибо @Masterzagh за сохранение синтаксиса функций.

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

JavaScript 62

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

Ваша функция может быть в форме функции анонимной стрелки, как x=>x.replace(/[bcdfghj-np-tv-z]/gi,"$&o$&"). Функции стрелок работают следующим образом name=(arg1, arg2)=>{code}. ()не нужны, если есть только один аргумент, и {}не нужны, если есть только одна строка кода. Возврат также не требуется, если одна строка возвращает что-то.

И я забыл сказать. Вам не нужно давать ему имя, чтобы решить проблему, которая требует только создания функции.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.