Розберіть мій есперанто!


21

Знаменита побудована мова есперанто використовує латинський алфавіт (в основному див. Пов’язану сторінку вікіпедії для деталей). Однак є деякі символи з наголосами: ĉ, ĝ, ĥ, ĵ, ŝ і ŭ . (C-circumflex, g-circumflex, h-circumflex, j-circumflex, s-circumflex і u- breve .) Звичайно, цих персонажів дуже важко набрати. Навіть для цього питання мені довелося шукати символів у селекторі Unicode. Завдяки цьому для електронного використання була розроблена конвенція, що використовує букву "х". Наприклад, "cxu" використовується для "ĉu". (Примітка: літера "х" не використовується зазвичай в алфавіті есперанто. "

Проте я - мовний пурист! Ця * повітряна цитата * х дурниця вбиває мене! Мені потрібна програма, щоб виправити це, бажано якомога коротше, щоб я міг набрати її в свій термінал якомога швидше!

Виклик

Ваша місія - взяти рядок есперанто за допомогою x-convention і перетворити його на справжнє есперанто.

Насправді вам потрібно зробити карту:

cx: ĉ
gx: ĝ
hx: ĥ
jx: ĵ
sx: ŝ
ux: ŭ
Cx: Ĉ
Gx: Ĝ
Hx: Ĥ
Jx: Ĵ
Sx: Ŝ
Ux: Ŭ

Усі інші символи для друку ASCII слід приймати та не змінювати. Unicode було б добре, але не обов'язково.

Введення та вихід можуть бути у будь-якому форматі, що відповідає вашій мові. Удачі!

Тестові шафи

"input" : "output"
_____________
"gxi estas varma" : "ĝi estas varma"
"Cxu sxi sxatas katojn aux hundojn?" : "Ĉu ŝi ŝatas katojn aŭ hundojn?"
"Uxcxsxabcd(hxSx)efg{};" : "Ŭĉŝabcd(ĥŜ)efg{};"
"qwertyuiop" : "qwertyuiop"
" " : " "
"" : ""
"x" : "x"
"xc" : "xc"
"xcx" : "xĉ"
"cxx" : "ĉx"

Оцінка балів

Це . Відповіді набираються найменшим числом рахунків у кодуванні мови за замовчуванням.

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

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

# Language Name, N bytes

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

# Ruby, <s>104</s> <s>101</s> 96 bytes

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

# Perl, 43 + 2 (-p flag) = 45 bytes

Ви також можете зробити ім'я мови посиланням, яке потім з’явиться у фрагменті таблиць лідерів:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

Удачі, веселіться та сміливо пропонуйте покращення!

Роз'яснення:

  • Вам потрібно потурбуватися лише про друковані символи ASCII.

  • Вам потрібно лише вивести символ, схожий на правильний вихід. Так, це означає, що ви можете застосувати наголос на стандартному символі.


ASCII тут означає 20-7E символів для друку, 00-7F, або що?
користувач202729

Усі друкарські.
OldBunny2800

Примітка. Я додав пояснення, що ви можете використовувати літеру та наголос модифікатора.
OldBunny2800

5
Об'єднання обрізної лінії - 0302 ̂, а комбінування - 0306 ̆.
user202729

^ Кожен бере 2 байти в UTF8 як кількість TIO .
користувач202729

Відповіді:


9

QuadR , 65 байт

.x
3::⍵M'ĉĝĥĵŝŭĈĜĤĴŜŬ'['cghjsuCGHJSU'⍳⊃⍵M]

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

.x замініть будь-яку таблицю символів, а потім "x" на

3::⍵M при індексації помилки, повернути матч немодифікованих
 тепер спробуйте:
'ĉĝĥĵŝŭĈĜĤĴŜŬ'[... ] індекс в цьому рядку з
  ⍵M матчу за
   першою літерою в
   індексі
  'cghjsuCGHJSU' в цьому рядку

Це еквівалентно мовчазній функції Dyalog APL:

'.x'R{3::⍵.Match'ĉĝĥĵŝŭĈĜĤĴŜŬ'['cghjsuCGHJSU'⍳⊃⍵.Match]}

Гарна відповідь! +1
OldBunny2800

Я не впевнений, як тут рахуються байти. Чи не є прямим використання ⎕R коротше? ('cghjsuCGHJSU',¨'x')⎕r(,¨'ĉĝĥĵŝŭĈĜĤĴŜŬ')
ngn

@ngn Так, але мій акумулятор вичерпався, перш ніж у мене з'явилася можливість опублікувати це.
Adám

6

Сітківка , 27 байт

iT`x`̂`[cghjs]x
iT`x`̆`ux

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

Ця програма складається з двох транслітерацій. Завдяки поєднанню символів у коді це не надто добре відображається, перший рядок насправді повинен виглядати аналогічно тому iT`x`^`[cghjs]x, де ^розшифровується символ, що поєднує контурний наголос. Що це говорить, це те, що він повинен Tвикреслити ( iвипадок випадків) всіх даних, xщо надходять у вхід ^, коли вони слідкують за будь-якою літерою [cghjs].


Примітка: TIO неправильно вимірює цей код як 25 байт. Насправді ця програма Retina використовує кодування UTF-8 (інші програми можуть використовувати UTF-32 або ISO 8859-1), а два комбіновані символи коштують 2 байти кожен.


5

C,  173  154 байт

Дякуємо @Colera Su за економію 17 байт!

p,c,i;f(char*s){for(char*l="cghjsuCGHJSU";p=*s;~c&&putchar(p))for(c=*++s,i=0;c=='x'&&l[i];++i)l[i]-p||write(1,"ĉĝĥĵŝŭĈĜĤĴŜŬ"+i*2,2,c=-1,++s);}

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

Пояснення:

p,c,i;
f(char*s)
{
    // The outer loop and an array of characters that are modified by a trailing 'x'.
    // The array/string is used for getting the index for the accented character later.
    for (char*l="cghjsuCGHJSU";

                                // Store the current character of the input string in 'p'.
                                // If it is '\0', the loop terminates.
                                p=*s;

                                      // The last statement in the loop.
                                      // If 'c==-1', it outputs the char stored in 'p'. 
                                      ~c&&putchar(p))

        // Store the character following 'p' in 'c' and increment the string pointer.
        for(c=*++s, i=0;

                        // If 'c' is not the letter 'x', the inner loop terminates
                        // immediately. Otherwise it loops through the characters of
                        // string 'l'.
                        c=='x'&&l[i]; ++i)

            // If the character stored in 'p' is found inside the string 'l'...
            l[i]-p ||

                      // ...then print the accented character corresponding to 'p'.
                      // 'i' is the index of 'p' in 'l', and, because the characters
                      // with accents are two bytes each, the index is multiplied by 2.
                      write(1,"ĉĝĥĵŝŭĈĜĤĴŜŬ"+i*2,2,

                      // Finally set 'c' to -1 so that the non-accented character doesn't
                      // get printed too, and increment the string pointer so that the
                      // letter 'x' doesn't get printed either.
                                                    c=-1, ++s);
}

Приємно! Чи можу я отримати пояснення, будь ласка?
OldBunny2800

Можливо, ви можете використовувати буквальний нульовий байт замість \0?
користувач202729

(але це, на жаль, не працює в TIO)
user202729

Ви можете використовувати write(1,"..."+i*2,2)для збереження 17 байт. Спробуйте в Інтернеті!
Колера Су

5

Python 3 , 81 байт

lambda s,T="cĉgĝhĥjĵsŝuŭ":eval("s"+".replace('%sx',%r)"*12%(*T+T.upper(),))

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

Створює та оцінює рядок:

s.replace('cx','ĉ').replace('gx','ĝ').replace('hx','ĥ').replace('jx','ĵ').replace('sx','ŝ').replace('ux','ŭ').replace('Cx','Ĉ').replace('Gx','Ĝ').replace('Hx','Ĥ').replace('Jx','Ĵ').replace('Sx','Ŝ').replace('Ux','Ŭ')

Ерік Аутгольфер врятував байт.


@EriktheOutgolfer Приємний, дякую!
xnor

3

/// , 75 байт

/,/\/\///>/x\,/c>ĉ,g>ĝ,h>ĥ,j>ĵ,s>ŝ,u>ŭ,C>Ĉ,G>Ĝ,H>Ĥ,J>Ĵ,S>Ŝ,U>Ŭ/

Примітка: Оскільки в запиті на OP всі символи для друку повинні бути оброблені, вибрані мої "спеціальні символи" не повинні друкуватися. Тому я вибрав вкладку та новий рядок замість, що не змінює мій рахунок або код функції. Код виглядатиме так:

/
/\/\/// /x\
/c  ĉ
g   ĝ
h   ĥ
j   ĵ
s   ŝ
u   ŭ
C   Ĉ
G   Ĝ
H   Ĥ
J   Ĵ
S   Ŝ
U   Ŭ/

Однак це вимагає, щоб введення не повинно містити вкладки чи нові рядки.

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

Оскільки ///ви не можете прийняти введення, слід ввести дані після коду.

Досить прямо. Я думаю, що вона не може бути коротшою, тому що ///потрібно спеціальне поводження з кожним символом.

Пояснення:

/,/\/\//       Replace all `,` in the code by `//`
               (two slashes are represented as two backslash-ed slashes)
/>/x\,         (in original code) becomes
/>/x\//        (because `,` is replaced by `//`) - replace all occurence of 
               `>` by `x/`.
/cx/ĉ//gx/ĝ//hx/ĥ//jx/ĵ//sx/ŝ//ux/ŭ//Cx/Ĉ//Gx/Ĝ//Hx/Ĥ//Jx/Ĵ//Sx/Ŝ//Ux/Ŭ/
               ^ The remaining part of the code should look like this.
               Straightforward replacement.

3

Python 3 , 95 байт

f=lambda x,v="cĉgĝhĥjĵsŝuŭCĈGĜHĤJĴSŜUŬ":v and f(x.replace(v[0]+"x",v[1]),v[2:])or x

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

-10 байт завдяки WhatToDo
-1 байт завдяки Colera Su



@ user507295 о розумна ідея. Спасибі!
HyperNeutrino

Використовуйте та / або трюк, щоб зберегти один байт: Спробуйте в Інтернеті!
Colera Su

@ColeraSu о здорово, спасибі не впевнений, чому цей трюк зник Д:
HyperNeutrino

@HyperNeutrino Тому що я не знав про цей трюк. Вибачте!
WhatToDo



1

JavaScript (ES6), 92 байти

s=>[..."cghjsuCGHJSU"].reduce((a,v,i)=>a.split(v+"x").join("ĉĝĥĵŝŭĈĜĤĴŜŬ"[i]),s)

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

Використовуваний метод роздільного з'єднання, рекомендований в тут, щоб зменшити кількість байтів, оскільки new RegExp(/*blah*/)конструктор набрав занадто багато байт.

Порівняння:

Original: a.replace(new RegExp(v+"x", "g"), "ĉĝĥĵŝŭĈĜĤĴŜŬ"[i])
New     : a.split(v+"x").join("ĉĝĥĵŝŭĈĜĤĴŜŬ"[i])

Коротше, поєднуючи акцентний підхід (63 байти), але видно деякі артефакти.

s=>s.replace(/([cghjs])x/gi," ̂$1").replace(/(u)x/gi," ̌$1");

Виноска: я вимагаю відповіді 92 байти, оскільки 63-байтне рішення має артефакти, які можуть впливати на вихід.


1

APL (Діалог Unicode) , 57 байт

Анонімна негласна функція. Використання:

  1. Функція префікса до рядка. Це транслітерує рядок.

  2. Функція префікса до списку рядків. Це транслітерує рядки.

  3. Функція Infix з номером зв’язування вхідного файлу як правильним аргументом та номером зв’язку вихідного файлу як аргументом. Це заповнює вихідний файл транслітераційним вмістом вхідного файлу.

('cghjsuCGHJSU',¨'x')⎕R(,¨'ĉĝĥĵŝŭĈĜĤĴŜŬ')

(... )⎕R(... ) PCRE R eplace

'cghjsuCGHJSU' ці листи

,¨'x' за кожним з них x

 … З…

,¨'ĉĝĥĵŝŭĈĜĤĴŜŬ' кожна з цих літер як рядки

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


1

J , 64 63 байт

rplc((_2]\'ĉĝĥĵŝŭĈĜĤĴŜŬ');~"1'cghjsuCGHJSU',.'x')"0

Як це працює:

Якщо _2]\я переставляю рядок 'ĉĝĥĵŝŭĈĜĤĴŜŬ' у стовпець з 12 рядів, щоб відповідати формі іншої рядки.

,. додає "x" до кожного символу рядка "cghjsuCGHJSU" і створює масив з 12 рядків на 2 стовпці

;~"1' складає список упакованих пар з вищевказаного, "1 - ранг 1 - застосувати до кожного рядка.

┌──┬──┐
│cx│ĉ │
├──┼──┤
│gx│ĝ │
├──┼──┤
│hx│ĥ │
├──┼──┤
│jx│ĵ │
├──┼──┤
│sx│ŝ │
├──┼──┤
│ux│ŭ │
├──┼──┤
│Cx│Ĉ │
├──┼──┤
│Gx│Ĝ │
├──┼──┤
│Hx│Ĥ │
├──┼──┤
│Jx│Ĵ │
├──┼──┤
│Sx│Ŝ │
├──┼──┤
│Ux│Ŭ │
└──┴──┘

rplc використовує ці елементи в коробці, щоб замінити кожне виникнення лівого ящикового предмета з пари з правим.

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


1

Befunge , 2x48 +1 = 99 байт

>~:1+!#@_:"x"-v>$ 11p0"cghjsuCGHJSU"1\ >\31p11g-v
^ # #, : ++$\ _^#1"x"0*4!-"u"g11*"ʊ"!\_^#!:\*g13<

Спробуй (TIO є надзвичайно дивним щодо Befunge, і я не зміг отримати жодне з моїх рішень для роботи над ним)

Як це працює

>~:1+!@_

Отримує введення та перевіряє, чи це кінець. Закінчити програму, якщо вона є.

          "x"-v>
^ # #, : ++$\ _^

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

               >$ 11p0"cghjsuCGHJSU"1\

Збережіть останній символ у (1,1). Вкладає всіх символів для перевірки в стек.

                                       >\31p11g-v
                                      _^#!:\*g13<

Порівняйте останній символ з усіма значеннями в стеку.

                 1"x"0*4!-"u"g11*"ʊ"!\

Помножте чек (0 або 1) на ʊ (значення Unicode 650). Перевірте, чи символом був au (для breve), і додайте 4 до стека, якщо так. Нарешті, додайте також значення ascii x (100). Загальна сума додає правильний наголос, якщо потрібно, або просто "х", якщо ні.

>~:1+!#@_  
^ # #, : ++$\ _^#

Додайте всі значення в стек разом, роздрукуйте їх і зберігайте дублікат. Поверніться до наступного вводу.


1

R , 75 70 байт

function(s)gsub('([cghjs])x','\\1\U302',gsub('(u)x','\\1\U306',s,T),T)

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

-5 байт завдяки Джузеппе

Пояснення

  • gsub('(u)x','\\1\U306',s,T): замінюйте в sкожному випадку великого чи малого регістру на "u" (за допомогою ignore.case=TRUEчетвертого аргументу T) з наступним "x" на "u", а потім на unveod для breve
  • gsub('([cghjs])x','\\1\U302',gsub('(u)x','\\1\U306',s,T),T): взяти результат цього і замінити кожне виникнення великого чи малого регістру (за допомогою ignore.case=TRUEчетвертого аргументу T) "c", "g", "h", "j" або "s" з подальшим "x" на лист, за яким іде однокод для обрізання

Використовуючи порядок аргументів, а не іменування, економлять 3 байти та ще два, позбувшись провідного нуля в \U0302і \U0306: Спробуйте в Інтернеті!
Джузеппе

@Giuseppe - відмінна ідея, дякую!
duckmayr

1

QuadR , 25 байт

Поєднання діакритичного видання.

ux
([cghjs])x
 ̆&
 ̂\1

i прапор

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

Замінити…

(u)x         u followed by x and
([cghjs])x   any of these letters followed by x 
 ̆\1          by a breve followed by the first group (the u) and
 ̂\1          a circumflex followed by the first group (the letter)

випадку я нечутливий

Еквівалентний наступному коду APL Dyalog:

'(u)x' '([cghjs])x'R' ̆\1' ' ̂\1'

Чому це 28, а не 24 байти?
Erik the Outgolfer

@EriktheOutgolfer Лічильник SBCS TIO мене збентежив. Виправлено. Спасибі. Зачекайте, це означає, що я перемагаю?
Adám

Так, зараз схоже, що це 27 байт (скопійовано з TIO), але 24 байти, скопійовані звідси. Що таке кодування QuadR, і яке правильно?
Ерік Атголфер

@EriktheOutgolfer Обидва посилання повідомляють 24 про мій FFQ / Win10. QuadR використовує Dyalog Classic або будь-який Unicode.
Adám

Так це 24 байти чи що?
Erik the Outgolfer

1

С, 145 144 байт

Ще один підхід С. Поверніться, перезаписавши вхід, використовуючи той факт, що circumflex / breve - 2 байти.

-1 байт завдяки Steadybox .

i,t;f(char*s){for(t=1;*s;s++)if(*s^'x')for(i=12,t=1;i--;)t="cghjsuCGHJSU"[i]-*s?t:i*2;else t^1&&memcpy(s-1,"ĉĝĥĵŝŭĈĜĤĴŜŬ"+t,2),t=1;}

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


1
Використання t^1&&memcpy(s-1,"ĉĝĥĵŝŭĈĜĤĴŜŬ"+t,2),t=1;замість цього t^1?memcpy(s-1,"ĉĝĥĵŝŭĈĜĤĴŜŬ"+t,2),t=1:0;зберігає один байт. Спробуйте в Інтернеті!
Steadybox

1

Mathematica, 81 байт або 57 байт

StringReplace[RemoveDiacritics@#<>"x"->#&/@Characters@"ĉĝĥĵŝŭĈĜĤĴŜŬ"]

Він застосовує правило заміни, коли літера без шапки разом з «х» замінюється буквою.

Ось альтернатива з використанням символів доданих акцентів: StringReplace[{"ux"->"ŭ","Ux"->"Ŭ",c_~~"x":>c<>"̂"}]


1

Perl 5 , 49 + 2 ( -p -C) = 61 51 байт

s/[CGHJScghjs]\Kx/\x{0302}/g;s/[Uu]\Kx/\x{0306}/g

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

Збережено 10 байт завдяки Нахуелю Фуле


вдалося врятувати 7 байт:s/[CGHJScghjs]\Kx/\x{0302}/g;s/[Uu]\Kx/\x{0306}/g
Nahuel Fouilleul

Здається, це працює також просто з -Cі без -Cпопередження ( Wide character in print)
Nahuel Fouilleul

1
від perlrun-C on its own (not followed by any number or option list), or the empty string "" for the PERL_UNICODE environment variable, has the same effect as -CSDL.
Nahuel Fouilleul

0

CJam , 51 байт

q"ĉĝĥĵŝŭĈĜĤĴŜŬ""cghjsuCGHJSU".{'x+@\/*}

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

Пояснення:

q                   Read input
"ĉĝĥĵŝŭĈĜĤĴŜŬ"      String literal
"cghjsuCGHJSU"      Another string literal
.{                  Iterate over the strings in parallel
  'x+                 Add an 'x to the normal character
  @                   Rotate to bring the input to the top of stack
  \                   Swap to bring the "cx" to the top
  /                   Split the input on instances of "cx"
  *                   Join the input on instances of the accented character
}

Це дійсно 39 байт? Я налічую 39 символів, і я не думаю, що у CJam немає спеціального кодування.
користувач202729

@ user202729 Змінено (TIO чомусь
перелічено

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

0

sed, 108 байт

s/cx/ĉ/g
s/gx/ĝ/g
s/hx/ĥ/g
s/jx/ĵ/g
s/sx/ŝ/g
s/ux/ŭ/g
s/Cx/Ĉ/g
s/Gx/Ĝ/g
s/Hx/Ĥ/g
s/Jx/Ĵ/g
s/Sx/Ŝ/g
s/Ux/Ŭ/g

Ви повинні відформатувати код у вигляді коду через `...`або <pre><code>...</code></pre>або 4 відступи.
користувач202729

@ user202729 Я, очевидно, це знав. Я надсилав повідомлення зі свого телефону Android, тому я не відформатував його правильно.
iBug

2
Схоже, що це 119 байт.
Erik the Outgolfer

0

PowerShell, 58 байт

Це 54 символи, а економія в PowerShell ISE робить його UTF-8 + BOM на 58 байт. У браузері це не так добре:

$args-replace'(?<=u)x','̆'-replace'(?<=[cghjs])x','̂'

regex замінює x комбінуючими символами Unicode з коментаря @ user202729.

напр

PS C:\> .\eo.ps1 "Cxu vi sxatas la cxapelliterojn? Mi ankaux."
Ĉu vi ŝatas la ĉapelliterojn? Mi ankaŭ.

0

Clojure, 126 115 байт

-11 байт шляхом зміни карти заміни на розділ рядка.

#(reduce(fn[a[f r]](clojure.string/replace a(str f\x)(str r)))%(partition 2"cĉgĝhĥjĵsŝuŭCĈGĜHĤJĴSŜUŬ")) 

Скорочення на карту заміни, яку потрібно шукати, і на що їх замінити.

Ще працюю над способом стиснення карти заміни.

(defn translate [^String esperanto]
  (reduce (fn [acc [f r]] (clojure.string/replace
                            acc ; Replace the translation so far by
                            (str f \x) ; adding a x after each character, search for it in the string,
                            (str r))) ; and replace it with a stringified accented char

          esperanto ; Before the reduction happens, the accumulator is the original string

          ; A list of [char-to-find what-to-replace-with] pairs
          (partition 2"cĉgĝhĥjĵsŝuŭCĈGĜHĤJĴSŜUŬ")))))


0

Scala , 110 байт

Скучне рішення регулярного виразу:

def?(s:String)="(.)x".r.replaceAllIn(s,m=>m.group(0)(0)+(if(m.group(0)(0).toUpper=='U')"\u0306"else"\u0302"))

Старе рішення Scala (116 байт)

def?(s:String)=s.foldLeft("")((r,c)=>if(c=='x')r.init+r.last+(if(r.last.toUpper=='U')"\u0306"else"\u0302")else r+c)

Безумовно

def?(s:String)=
  s.foldLeft("")((r,c)=>  // 'Fold' string with empty string as first result
    if(c=='x')            // If current character is x
      r.init+             // Take the every character from result but the last
        r.last+           // The last character from result and add
          (if(r.last.toUpper=='U')
            "\u0306"      // combining breve if 'u' or 'U'
          else"\u0302")   // combining circumflex in any other case
 else r+c                 // Otherwise return result + character
)


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