Перетворювач 'A' в Ä


12

Зараз я сканую купу купу рукописних документів і конвертую їх у .txtфайли. Оскільки у мене жахливий почерк, конвертер .jpg-> .txtперетворює частину моїх умлаутів у "звичайний" лист, укладений'

Завдання

Напишіть програму або функцію, яка:

  • Дається рядок
    • ви можете вибрати будь-яку кодову сторінку вводу-виводу до тих пір, як
      • він підтримує символів AEIOUaeiouÄËÏÖÜäëïöü'.
      • вхідні та вихідні сторінки коду однакові.
    • вхід буде (крім пробілів) містити лише друковані символи з вашої кодової сторінки.
      • Буде лише одне рішення, тому такі речі, як, наприклад 'a'e', не з’являться
  • Перетворює всі символи в наступному наборі AEIOUaeiouвÄËÏÖÜäëïöü
    • Якщо і лише якщо вони оточені 'символами:
      • Приклад :'a''e' -> äë
    • Якщо з рядка - це одна літера.
      • наприклад, 'AE'зовсім не змінюється, виводячи як є.
    • Якщо символ з символу не є символом, AEIOUaeiouцей символ не зміниться.

Примітка. З символу / з рядка знаходиться один з них між '.

Тестові шафи

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'... не те, що я вважаю хорошими тестовими шафами.
Leaky Nun

1
Чи можете ви додати приклад із 'w'(як wце не один із AEIOUaeiou)?
jimmy23013

8
Діакритики, що поєднувались, мали невідомий статус , потім їх дозволено , потім заборонили . Це визнало недійсними принаймні 4 відповіді. Бу! Поцілунок! Я змінив свій внесок на потік :(
Digital Trauma

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()

OP досі не відповів codegolf.stackexchange.com/users/59183/dzaima
Adám

Ні, якщо комбінування діакритики дозволено.
Adám

Поєднувати діакритики зараз заборонено.
Адам

Я вважаю, що ви можете зробити це дійсним, додавши .normalize()до кінця функції.
ETHproductions

Ви впевнені, @ETHproductions? Якщо поєднують діакритичні заборонені, вони не заборонено з'являтися у відповідь на все ?
Кудлатий

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незалежно від кодування. Моя попередня відповідь - ІМО, цікавіша, але ця коротша, тож, чорт, я візьму.


1
Я ретельно перевіряв список "лазівки, які заборонені за замовчуванням", перш ніж публікувати це, і вигадувати кодову сторінку не було серед них. Це, плюс особливо той факт, що на запитання, що пропонується використовувати "будь-яку кодову сторінку вводу-виводу", схоже, дається відповідь. І тоді a-zфокус робить відповідь насправді цікавою, а не просто обманом. (IMO, все одно.)
msh210

3
Це такий трюк, який лише один раз смішний, але я вважаю, ви першим його застосували, тому він працює (=
Grimmy

1
Ви можете зберегти 3 байти, використовуючи \wзамість [a-z], а також /aзамість /i. Якщо модифікатор "/ a" діє, \wвідповідає символам [a-zA-Z0-9_], незалежно від того, як вони закодовані.
Гриммі

@Grimy, дякую! Я відредагую ....
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ç/

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

Це здається досить складним для Jelly!

Як?

Примітка: Оскільки символи не знаходяться на кодовій сторінці, але знаходяться в межах байту в 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, щоб я міг перемогти всі мови гольфу. : P



1

/// , 67 байт

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

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

Це працює, заміняючи не пунктирні букви, оточені одинарними лапками ( 'A'), тією самою буквою, що і пунктирною, без одиничних лапок ( Ä). Одна заміна цього виглядає наступним чином (до гольф) /'A'/Ä/.

Поле має два загальних входжень, //і '/, і використовує їх в якості заміни.


1

Свіфт - 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.
Адам

Поєднувати діакритики зараз заборонено.
Adám

1

05AB1E , 30 29 24 байт

-6 байт завдяки Еміньї

ž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.
Значення чорнила

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

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