Разбери мой эсперанто!


21

Известный построенный язык эсперанто использует латинский алфавит (в основном, см. Дополнительную информацию на странице википедии). Однако есть некоторые символы с акцентами: ĉ, ĝ, ĥ, ĵ, ŝ и ŭ . (С-огибающая, г-огибающая, ч-огибающая, J-огибающая, втор-огибающая и и- бревисом .) Естественно, что эти символы очень трудно ввести. Даже для этого вопроса мне пришлось искать в селекторе Unicode символы. В связи с этим для электронного использования была разработана конвенция с использованием буквы «х». Например, «cxu» используется для «ĉu». (Примечание: буква «х» обычно не используется в алфавите эсперанто ».

Тем не менее, я языковой пурист! Эта * воздушная цитата * х ерунда убивает меня! Мне нужна программа, чтобы исправить это, желательно как можно короче, чтобы я мог набрать ее в свой терминал как можно быстрее!

Вызов

Ваша миссия состоит в том, чтобы взять строку эсперанто с помощью x-Convention и преобразовать ее в настоящий эсперанто.

По сути, вы должны отобразить:

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

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

Ввод и вывод могут быть в любом формате, приемлемом для вашего языка. Удачи!

Testcases

"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"

счет

Это . Ответы оцениваются по наименьшему количеству пользователей в кодировке языка по умолчанию.

Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам.

Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:

# 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, или что?
user202729

Все для печати.
OldBunny2800

Примечание: я добавил пояснение, что вы можете использовать букву и модификатор ударения.
OldBunny2800

5
Комбинированный круговой оборот находится в 0302 ̂, и объединяющий разрыв в 0306 ̆.
user202729

^ Каждый принимает 2 байта в UTF8 как количество TIO .
user202729

Ответы:


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 Да, но моя батарея разрядилась до того, как у меня появилась возможность опубликовать это.
Адам

6

Сетчатка , 27 байт

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

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

Эта программа состоит из двух транслитераций. Из-за того, что в коде комбинируются символы, это не слишком хорошо отрисовывается, первая строка должна выглядеть примерно так iT`x`^`[cghjs]x, где ^обозначает символ комбинирования акцентирующего окружности. Это говорит о том, что он должен Tтранслировать ( ignoring case) все xs во входных данных в a ^, когда они следуют за любой буквой в [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?
user202729

(но это, к сожалению, не работает на
TIO

Вы можете использовать, 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','Ŭ')

Эрик Outgolfer сохранил байт.


@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

Используйте и / или трюк, чтобы сохранить один байт: попробуйте онлайн!
Колера Су

@ColeraSu о, круто, спасибо. не уверен, почему этот трюк исчез D:
HyperNeutrino

@HyperNeutrino Потому что я не знал об этом трюке. Сожалею!
WhatToDo



1

JavaScript (ES6), 92 байта

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

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

Использовал метод split-join, рекомендованный здесь, чтобы уменьшить количество байтов, потому что 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 (Dyalog Unicode) , 57 байт

Анонимная молчаливая функция. Обычаи:

  1. Префикс функции к строке. Это транслитерирует строку.

  2. Префиксная функция к списку строк. Это транслитерирует строки.

  3. Инфиксная функция с номером связи входного файла в качестве правого аргумента и номером связи выходного файла в качестве левого аргумента. Это заполняет выходной файл транслитерированным содержимым входного файла.

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

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

'cghjsuCGHJSU' эти письма

,¨'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) на ʊ (значение Юникода 650). Проверьте, был ли персонаж au (для краткости) и добавляет 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", за которыми следует символ Юникод для краткости
  • gsub('([cghjs])x','\\1\U302',gsub('(u)x','\\1\U306',s,T),T): возьмите результат этого и замените каждое вхождение верхнего или нижнего регистра (используя ignore.case=TRUEчерез четвертый аргумент T) "c", "g", "h", "j" или "s", за которыми следует "x": буква с последующим Unicode для обхода

использование порядка аргументов вместо именования экономит 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)

если я чувствителен

Эквивалентно следующему коду Dyalog APL:

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

Почему это 28, а не 24 байта?
Эрик Outgolfer

Счетчик SBCS @EriktheOutgolfer TIO меня смутил. Исправлена. Спасибо. Подождите, это значит, что я выиграю?
Адам

Да, теперь похоже, что это 27 байтов (скопировано из TIO), но 24 байта при копировании отсюда. Что такое кодировка QuadR и какая она правильная?
Эрик Outgolfer

@EriktheOutgolfer Обе ссылки сообщают 24 на моем FFQ / Win10. QuadR использует Dyalog Classic или любой Unicode.
Адам

Так что это 24 байта или что?
Эрик Outgolfer

1

C 145 144 байта

Другой C подход. Возвратите путем перезаписи ввода, используя тот факт, что обводный / короткий - 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 байтов благодаря Nahuel Fouilleul


может сэкономить 7 байт:s/[CGHJScghjs]\Kx/\x{0302}/g;s/[Uu]\Kx/\x{0306}/g
Науэль Фуйе

Кажется, что это работает также только с -Cи без -Cпредупреждения ( Wide character in print)
Науэль Фуий

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.
Науэль Фуйе

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 есть специальная кодировка.
user202729

@ user202729 Изменено (почему-то TIO считал байты символами)
Esolanging Fruit

Потому что TIO считает, что все языки игры в гольф имеют специальную кодовую страницу символов, и не стоит проверять, все ли символы находятся в правильной кодовой странице.
user202729

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 отступов.
user202729

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

2
Похоже, это 119 байтов в длину.
Эрик 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

Скала , 110 байт

Скучное регулярное выражение:

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

Старое решение для скалы (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)

Ungolfed

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.