Это задание основано на тестовых курсах, которые я проходил в университете Аалто , и содержит контрольные примеры . Материал использован с разрешения.
Два с половиной года назад возникла проблема с ложками на английском языке . Однако в финских ложках гораздо сложнее.
Спунеризмы по-фински
По-фински гласные aeiouyäö
и согласные bcdfghjklmnpqrstvwxz
. ( å
технически является частью финского языка, но здесь не рассматривается.)
Самые простые ложные слова принимают только первый гласный каждого слова и любые согласные, предшествующие им, и обмениваются частями:
henri kontinen -> konri hentinen
tarja halonen -> harja talonen
frakki kontti -> kokki frantti
ovi kello -> kevi ollo
Длинные гласные
Некоторые слова содержат два одинаковых последовательных гласных. В этих случаях пара гласных должна быть заменена первой гласной другого слова, сокращающей или удлиняющей гласные, чтобы сохранить длину одинаковой.
haamu kontti -> koomu hantti
kisko kaappi -> kasko kiippi
В случае двух разных последовательных гласных это не распространяется:
hauva kontti -> kouva hantti
puoskari kontti -> kooskari puntti
Три или более одинаковых последовательных букв не будут отображаться на входе.
Гласная гармония
У финнов есть эта прекрасная вещь под названием гласная гармония . По сути, это означает, что задние aou
и передние гласные äöy
не должны встречаться в одном и том же слове.
Когда замена передних или задних гласных звуков в слове, все гласные другого рода в остальной части слова должны быть изменены в соответствии с новым начало слова ( a <-> ä
, o <-> ö
, u <-> y
):
köyhä kontti -> kouha köntti
hauva läähättää -> läyvä haahattaa
e
и i
являются нейтральными и могут появляться со всеми другими буквами; замена их на слово не должна вызывать изменений в остальной части слова.
Особые случаи
Гармония гласных не относится к некоторым словам, включая многие заимствованные слова и сложные слова. Эти случаи не обязательно должны обрабатываться «правильно».
Вызов
Учитывая два слова, выведите слова в ложку.
Входные слова будут содержать только символы a-z
и äö
. Вы можете использовать прописные или строчные буквы, но ваш выбор должен быть согласован как между словами, так и с вводом / выводом.
Ввод / вывод может быть выполнен в любом удобном формате . (Слова должны рассматриваться как строки или массивы символов.)
Это код-гольф , поэтому выигрывает самое короткое решение в байтах.
U+0308 COMBINING DIAERESIS
должно обрабатыватьсяU+00E4 LATIN SMALL LETTER A WITH DIAERESIS
очень хорошо.)e
иi
являются нейтральными, являютсяfihus keksy
,huvu lehy
иlesmä prihti
приемлемые ответы наkehys fiksu
,levy huhu
и ,prisma lehti
соответственно?puoskari äyskäri --> äöskäri puuskari --> puoskari ääskäri
.Ответы:
JavaScript (ES6),
196175 байтПринимает слова как две строки в синтаксисе карри
(a)(b)
. Возвращает массив из двух массивов символов.Попробуйте онлайн!
Как?
Каждое входное слово передается через регулярное выражение e , которое имеет 4 группы захвата:
Вспомогательная функция g () принимает все группы захвата слова, которые должны быть обновлены как a [], а первую и вторую группы захвата другого слова - как c и v .
Мы применяем базовую ложку и заботимся о длинных гласных с помощью:
Чтобы применить гармонию гласных, мы сначала приводим регулярное выражение e к строке, добавляя его к себе, что дает:
Гласные, которые должны быть гармонизированы, имеют позицию больше 9 в результирующей строке. Кроме того, выражение было организовано таким образом, что передние гласные äöy расположены в четных положениях, а задние гласные aou расположены в нечетных положениях рядом с их аналогами.
Отсюда следующая формула перевода, которая применяется к каждому символу c выходного слова:
источник
Python 3 ,
235231225221217215 байтПопробуйте онлайн!
Сохраненный
источник
fr' ?(.*?([ei{B+F}]))(\2)?(\w*)'
S='äöy','aou'
, затем на пятую строку:(F,B)
=>S
и(B,F)
=>S[::-1]
(это несовместимо с предложением, которое дал @Lynn)e,r,Q,W=re.findall(r' ?(.*?([eiaouäöy]))(\2)?(\w*)'*2,a+' '+b)[0][2:5]
сохранить еще несколько байтов.S=F,B='aöy','aou'
, а затем на 4-й строке изменить(F,B)
наS
.S=F,B=...
следует сохранить несколько байтов, если заменить(F,B)
наS
Pyth, 84 байта
Попробуйте онлайн. Тестирование.
Доказывая , что это не так, что трудно в языках гольфа. Основанный на стеке язык мог бы сделать даже лучше.
Pyth по умолчанию использует ISO-8859-1, поэтому
äö
каждый по одному байту.объяснение
Q
, содержащий входную пару слов, добавляется неявно.m
: сопоставить каждое словоd
в входе с::"^([^A*)([A)(\\2)*(.+)"\A"aeiouyäö]"
ЗаменитеA
сaeiouyäö]
в строке , чтобы получить регулярное выражение^([^aeiouyäö]*)([aeiouyäö])(\2)*(.+)
.:d
: найти все совпадения и вернуть их группы захвата.h
: принять первый (и единственный) матч.t
: удалить первую группу, содержащую все совпадение._B
: пара с обратным, чтобы получить[[first, second], [second, first]]
..b
: сопоставить каждую пару словN, Y
в этом:hY
: возьмите в начале согласные второго слова.@N2
: взять длинную первую гласную первого слова илиNone
.htY
: взять первый гласный из второго слова.J
сохранить это вJ
.*W
…2
: Если была длинная гласная, дублируйте гласную второго слова.+
: добавь это к согласным.c2"aouäöy"
: разделитьaouäöy
на две части, чтобы получить["aou", "äöy"]
.@DJ
: отсортировать пару по пересечению с первым гласным второго слова. Это получает половину с первым гласным второго слова в конце пары.A
: сохранить пару вG, H
.e
взять второй тайм}J
: посмотреть, если первый гласный второго слова во второй половине.XW
...eNGH
: если она была, картаG
сH
суффиксом первого слова, в противном случае держать суффикс как есть.+
: добавьте суффикс.источник