Преобразователь «А» в Ä


12

В настоящее время я сканирую кучу рукописных документов и преобразовываю их в .txtфайлы. Поскольку у меня ужасный почерк, конвертер .jpg-> .txtпреобразует некоторые из моих умляутов в «обычную» букву, заключенную в'

задача

Напишите программу или функцию, которая:

  • Дается строка
    • Вы можете выбрать любую кодовую страницу ввода / вывода, если
    • ввод (кроме пробелов) будет содержать только печатные символы из вашей кодовой страницы.
      • Будет только одно решение, поэтому такие вещи как 'a'e'не будут появляться
  • Преобразует все символы в следующем наборе AEIOUaeiouвÄËÏÖÜäëïöü
    • Если и только если они окружены 'символами:
      • Пример :'a''e' -> äë
    • Если из строки является одной буквой.
      • например 'AE'не меняется вообще, выводя как есть.
    • Если символ « из» не является символом из AEIOUaeiouэтого символа, он не изменится.

Примечание: символ from / from является строкой между '.

Testcases

Input
Output
<empty line>

'A'sthetik
Ästhetik

Meinung ist wichtig!
Meinung ist wichtig!

Ich sagte: "Er sagte: 'Ich habe Hunger'"
Ich sagte: "Er sagte: 'Ich habe Hunger'"

Ich sagte: "Er sagte: ''A'sthetik'"
Ich sagte: "Er sagte: 'Ästhetik'"

Hämisch rieb er sich die H'a'nde
Hämisch rieb er sich die Hände

H'a''a'slich isn't a German word
Hääslich isn't a German word

since it's really called h'a'sslich
since it's really called hässlich

6
Активный ингредиент во всех ваших тест-кейсах - это 'A'или 'a'не то, что я считаю хорошими тест-кейсами.
Дрянная Монахиня

1
Можете ли вы добавить пример с 'w'(как wне один из AEIOUaeiou)?
jimmy23013

8
Объединение диакритических знаков имело неизвестный статус , затем было разрешено , затем было запрещено . Это лишило законной силы как минимум 4 ответа. Бу! Шипение! Я изменил свое мнение на понижающее :(
Цифровая травма

1
@DigitalTrauma Мне очень жаль.
Роман Греф

4
Добавить 'q'e'd'
Отображаемое имя

Ответы:


11

JavaScript (ES6), 81 70 68 байт

s=>s.replace(/'[aeiou]'/gi,c=>"ï   ÖÄöä ËÜëüÏ "[c.charCodeAt(1)%15])

Попытайся

f=
s=>s.replace(/'[aeiou]'/gi,c=>"ï   ÖÄöä ËÜëüÏ "[c.charCodeAt(1)%15])
i.addEventListener("input",_=>o.innerText=f(i.value))
console.log(f("'A'sthetik")) // Ästhetik
console.log(f("Meinung ist wichtig!")) // Meinung ist wichtig!
console.log(f(`Ich sagte: "Er sagte: 'Ich habe Hunger'"`)) // Ich sagte: "Er sagte: 'Ich habe Hunger'"
console.log(f(`Ich sagte: "Er sagte: ''A'sthetik'"`)) // Ich sagte: "Er sagte: 'Ästhetik'"
console.log(f("Hämisch rieb er sich die H'a'nde")) // Hämisch rieb er sich die Hände
console.log(f("H'a''a'slich isn't a German word")) // Hääslich isn't a German word
console.log(f("since it's really called h'a'sslich")) // since it's really called hässlich
<input id=i><pre id=o>


объяснение

  • s=> Анонимная функция, принимающая входную строку в качестве аргумента через параметр "s".
  • s.replace(x,y) Возвращает строку с заменой «x» на «y».
  • /'[aeiou]'/gi Нечувствительное к регистру регулярное выражение, которое соответствует всем вхождениям гласного, заключенным в одинарные кавычки.
  • c=> Передает каждое совпадение регулярного выражения анонимной функции через параметр "c".
  • "ï ÖÄöä ËÜëüÏ "[n]Возвращает n-й символ (индексированный 0) в строке «ï ÖÄöä ËÜëüÏ», аналогично "ï ÖÄöä ËÜëüÏ ".charAt(n).
  • c.charCodeAt(1)%15 Получает остаток кода символа второго символа в «c» (то есть гласный символ) при делении на 15.

Альтернатива, 40/52 36/48 байт (35/47 символов)

Ниже был мой ответ до того, как объединить диакритические знаки было запрещено (Бу-урны!) - лучше смотреть в этой скрипке

s=>s.replace(/'([aeiou])'/gi,"$1̈")

Тем не менее, ETHproductions предполагает, что с добавлением .normalize()дополнительных 12 байтов это будет допустимо.

s=>s.replace(/'([aeiou])'/gi,"$1̈").normalize()

ОП до сих пор не ответил codegolf.stackexchange.com/users/59183/dzaima
Адам

Нет, если допускается объединение диакритических знаков.
Адам

Объединение диакритических знаков теперь запрещено.
Адам

Я считаю, что вы можете сделать это действительным, добавив .normalize()в конец функции.
ETHproductions

Вы уверены, @ETHproductions? Если сочетающие диакритические запрещены, они не запрещено появляться в ответ на все ?
Shaggy

8

Perl 5, 25 байт

s/'(\w)'/chr 1+ord$1/age

24 байта, плюс 1 -peвместо-e

Это использует правило, что «вы можете выбрать любую кодовую страницу ввода / вывода, если она поддерживает символы AEIOUaeiouÄËÏÖÜäëïöü'». Он также использует /aфлаг для регулярных выражений, который заставляет \wобращаться именно к символам abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789независимо от того, как они закодированы.

Выбранная кодовая страница ввода / вывода для моего скрипта выглядит так:

 1  a
 2  ä
 3  e
 4  ë
 5  i
 6  ï
 7  o
 8  ö
 9  u
10  ü
11  A
12  Ä
13  E
14  Ë
15  I
16  Ï
17  O
18  Ö
19  U
20  Ü
21  '

(Я не могу протестировать этот скрипт на тестовых примерах в вопросе, так как они включают в себя некоторые действительно странные символы, например t.)


Спасибо Грими за то, что он спас мне три байта. Ранее у меня был s/'([a-z])'/chr 1+ord$1/gie, который использовал (кодирование и) интересный факт, который [a-z]специально разработан в Perl для точного соответствия abcdefghijklmnopqrstuvwxyzнезависимо от кодировки. Мой предыдущий ответ, IMO, более интересный, но этот короче, так что, черт возьми, я возьму его.


1
Я тщательно проверил список «лазеек, которые по умолчанию запрещены», прежде чем опубликовать это, и изобретать кодовую страницу среди них не было. Это, плюс, в частности, тот факт, что вопрос предполагает использование «любой кодовой страницы ввода / вывода», по-видимому, позволяет ответить на этот вопрос. И тогда a-zхитрость делает ответ на самом деле интересным, а не просто читом. (
Во

3
Это своего рода трюк , который только смешно один раз, но я считаю , что ты первый один , чтобы использовать его, так что он работает (=
Grimmy

1
Вы можете сэкономить 3 байта, используя \wвместо [a-z], а также /aвместо /i. Если модификатор "/ a" \wактивен , соответствует символам [a-zA-Z0-9_], независимо от того, как они закодированы.
Grimmy

@ Грими, спасибо! Я отредактирую ....
msh210


4

Japt , 29 байт

r"'%v'"@"ï   ÖÄöä ËÜëüÏ "gXc1

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

объяснение

r"'%v'"@"ï   ÖÄöä ËÜëüÏ "gXc1

r"'%v'"@                       // Replace each match X of /'<vowel>'/ in the input with
        "ï   ÖÄöä ËÜëüÏ "g     //   the character in this string at index
                          Xc1  //     X.charCodeAt(1).
                               //   Values larger than the length of the string wrap around,
                               //   so this is effectively equal to " ... "[n%15].
                               // Implicit: output result of last expression

1
Использование сочетания диакритических знаков является спорным.
Дрянная Монахиня

Ударь меня к этому. Ваше решение намного короче моего, хотя ... Молодцы.
Люк

@LeakyNun Спорные на этот вопрос или вообще?
Цифровая травма

Спорный для этого вопроса, потому что вы подняли его в комментариях, но он никогда не был рассмотрен.
Утренняя монахиня

@ Adám Побей тебя на 38 секунд ;-)
ETHproductions

4

Javascript, 67 байт

s=>s.replace(/'.'/g,c=>"äëïöüÄËÏÖÜ"['aeiouAEIOU'.indexOf(c[1])]||c)

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

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


3

Желе , 36 байт

œṣ⁹Ṫ¤j
“.ạẏụ’D196;+\Ọż⁾''jЀØc¤;@Wç/

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

Это кажется довольно сложным для желе!

Как?

Примечание: поскольку символы не находятся на кодовой странице, но находятся в пределах диапазона байта в Unicode, я думаю, что они должны быть созданы из ординалов, поэтому я так и сделал.

œṣ⁹Ṫ¤j - Link 1, Replace: char list S [...], list R [char T, char list F]
œṣ     - split S at sublists equal to:
    ¤  -   nilad followed by link(s) as a nilad:
  ⁹    -     link's right argument, R
   Ṫ   -     tail - yield char list F and modify R to become [T]
     j - join with R (now [T])
       - all in all split S at Rs and join back up with [T]s.

“.ạẏụ’D196;+\Ọż⁾''jЀØc¤;@Wç/ - Main link: char list S
       196;                   - 196 concatenate with:
“.ạẏụ’                        -   base 250 literal 747687476
      D                       -   to decimal list [7,4,7,6,8,7,4,7,6]
           +\                 - cumulative reduce with addition: [196,203,207,214,220,228,235,239,246,252]
             Ọ                - cast to characters: ÄËÏÖÜäëïöü
                       ¤      - nilad followed by link(s) as a nilad:
               ⁾''            -   literal ["'", "'"]
                     Øc       -   vowel yield: AEIOUaeiou
                  jЀ         -   join mapped:  ["'A'", "'E'", ...]
              ż               - zip together
                          W   - wrap S in a list
                        ;@    - concatenate (swap @rguments)
                           ç/ - reduce with last link (1) as a dyad
                              - implicit print

3

V , 24 байта

Óã'¨[aeiou]©'/±:
éiD@"

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

HexDump:

00000000: d3e3 27a8 5b61 6569 6f75 5da9 272f 160b  ..'.[aeiou].'/..
00000010: b13a 0ae9 6944 4022                      .:..iD@"

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



1

/// , 67 байт

/~/'\///`/\/\/~/'A~Ä`E~Ë`I~Ï`O~Ö`U~Ü`a~ä`e~ë`i~ï`o~ö`u~ü/

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

Это работает путем замены букв 'A'без точек, заключенных в одинарные кавычки ( Ä), той же буквой, что и точки, без одинарных кавычек ( ). Единственная замена этого выглядит следующим образом (перед гольфом) /'A'/Ä/.

Гольф принимает два общих случая, //и '/, и использует их в качестве замены.


1

Swift - 201 байт

import Foundation;func g(s:String){var e=s;var r="aeiouAEIOUäëïöüÄËÏÖÜ".characters.map{String($0)};for i in r[0...9]{e=e.replacingOccurrences(of:"'\(i)'",with:r[r.index(of:i)!+10])};print(e)}

Использование: g("'A'sthetik") // => Ästhetik


1
characters.map{blah blah}и replacingOccurrences()действительно убить веселье: ((
Мистер Xcoder

1

APL (Dyalog) , 53 байта

(v'''[AEIOUaeiou]''')⎕R{'  ÄËÏÖÜäëïöü'[v2⊃⍵.Match]}

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

Использует PCRE R eplace (сохраняя RegEx как v ), чтобы применить следующую функцию к цитируемым гласным:

{ анонимная функция

' ÄËÏÖÜäëïöü'[] Индексировать строку (отметьте два пробела, соответствующих '[) с помощью:

  ⍵.Match согласованная строка

  2⊃ выбрать второе письмо (гласная)

  v⍳ найти индекс в v

}



1

SOGL , 43 35 (UTF-8) байтов

L∫:ÆW ':h++;"äëïöü”:U+Wŗ

Объяснение:

L∫                        repeat 10 times, pushing current iteration (0-based)
  :                       duplicate the iteration
   ÆW                     get the index (1-based) in "aeiouAEIOU"
      ':h++               quote it
           ;              put the copy (current iteration) ontop
            "äëïöü”       push "äëïöü"
                   :      duplicate it
                    U     uppercase it
                     +    join together, resulting in "äëïöüÄËÏÖÜ"
                      W   get the index (1-based) in it
                       ŗ  replace [in the input, current char from "aeiouAEIOU" with
                          the corresponding char in "äëïöüÄËÏÖÜ"

3
Хех, можно подумать, что ̈+это функция в SOGL.
Адам

Объединение диакритических знаков теперь запрещено.
Адам

1

05AB1E , 30 29 24 байта

-6 байт благодаря Emigna

žMDu«S''«''ì"äëïöü"Du«S:

05AB1E удобно имеет символы äëïöüв своей кодовой странице.

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

(старый код)

žMDu«Svy''.ø})"äëïöü"Du«¹ŠS:

Объяснение (устаревшее):

žM                             Push aeiou                    ['aeiou']
  D                            Duplicate                     ['aeiou', 'aeiou']
   u                           Uppercase                     ['aeiou', 'AEIOU']
    «                          Concatenate                   ['aeiouAEIOU']
     vy                        For each...
       ''                        Push '
         .ø                      Surround a with b (a -> bab)
           }                   End loop
            )                  Wrap stack to array           [["'a'", "'e'", "'i'", "'o'", "'u'", "'A'", "'E'", "'I'", "'O'", "'U'"]]
             "äëïöü"           String literal.               [["'a'", "'e'", "'i'", "'o'", "'u'", "'A'", "'E'", "'I'", "'O'", "'U'"], 'äëïöü']
                    Du«        Duplicate, uppercase, concat  [["'a'", "'e'", "'i'", "'o'", "'u'", "'A'", "'E'", "'I'", "'O'", "'U'"], 'äëïöüÄËÏÖÜ']
                       ¹       Push first input
                        Š      Push c, a, b                  ["'A'sthetik", ["'a'", "'e'", "'i'", "'o'", "'u'", "'A'", "'E'", "'I'", "'O'", "'U'"], 'äëïöüÄËÏÖÜ']
                          S    Convert to char list          ["'A'sthetik", ["'a'", "'e'", "'i'", "'o'", "'u'", "'A'", "'E'", "'I'", "'O'", "'U'"], ['ä', 'ë', 'ï', 'ö', 'ü', 'Ä', 'Ë', 'Ï', 'Ö', 'Ü']]
                           :   Replace all                   ['Ästhetik']
                               Implicit print

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


Вы можете заменить на Š.
Эминья

Вы можете сэкономить еще несколько байтов сžMDu«S''«''ì"äëïöü"Du«S:
Emigna

@ Emigna Еще раз спасибо.
Okx

Вам также не нужно Iв начале :)
Emigna

1

Python 3.6, 98 92 символа

import re;a=lambda i,p="'([AEIOUaeiou])'":re.sub(p,lambda x:'ÄËÏÖÜäëïöü'[p.index(x[1])-3],i)

Это функция, а не полная программа.

Отформатирован для удобства чтения:

import re

a = lambda i, p="'([AEIOUaeiou])'":\
    re.sub(p, lambda x: 'ÄËÏÖÜäëïöü'[p.index(x[1]) - 3], i)

Спасибо @ValueInk за умные советы для дальнейшей игры в гольф.


Не бежит за мной. Останавливается с ошибкой TypeError.
полностью человек

@totallyhuman ты уверен? Кажется, это работает для меня. Вам нужно вызвать aфункцию со строкой, которую вы хотите заменить.
Numbermaniac


1
Документы Python сообщают о новинках match.__getitem__(g)в Python 3.6, поэтому, вероятно, их следует указать в заголовке. Кроме того, если вы измените свое регулярное выражение '([AEIOUaeiou])', сохраните байт, изменив x[0][1]на x[1]и используя -3вместо -2.
Value Ink

1
На самом деле, это еще короче, import re;a=lambda i,p="'([AEIOUaeiou])'":re.sub ...так как вы избавляетесь от лишних накладных расходов, больше не нуждаясь в returnутверждении!
Value Ink

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