Golff y Côd - Treiglad


16

Прочитайте это Инг Нгимраэг

Вызов

Задав слово на валлийском языке, выведите все возможные мутированные формы слова.

Мутации

Мутация - это изменение первой буквы слова при следовании определенным словам или в определенных грамматических контекстах.

На валлийском языке следующие согласные считаются:

b c ch d dd f ff g ng h l ll m n p ph r rh s t th

Обратите внимание, что несколько символьных согласных, таких как ch, ng и rh, считаются одной буквой в валлийском языке и, следовательно, одной согласной.

Другие буквы в валлийском алфавите - это гласные, перечисленные ниже:

a e i o u w y

Смотрите ниже, все мутации с исходной буквой слева и получившимися мутантными буквами справа:

Original | Mutations
---------+---------------
p        | b mh ph
t        | d nh th
c        | g ngh ch
b        | f m
d        | dd n
g        | [no letter] ng
m        | f
ll       | l
rh       | r

Здесь [no letter]означает, что г удаляется из начала слова.

Обратите внимание, что есть некоторые согласные, которые не мутируют:

ch
dd
f
ff
j
l
n
ng
ph
r
s
th

Гласные также можно найти в начале слов, но они не изменяются:

a
e
i
o
u
w
y

Примеры

Входные данные: dydd

Выход:

dydd
ddydd
nydd

Входные данные: pobl

Выход:

pobl
bobl
mhobl
phobl

Входные данные: gwernymynydd

Выход:

gwernymynydd
wernymynydd
ngwernymynydd

Входные данные: ffrindiau

Выход:

ffrindiau

Входные данные: enw

Выход:

enw

Входные данные: theatr

Выход:

theatr

По запросу ArtOfCode;)

Входные данные: llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch

Выход:

llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch
lanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch

правила

На входе будет только одно слово.

После вашего начального согласного всегда будет больше букв.

выигрыш

Самый короткий код в байтах побеждает.


5
Новый тестовый пример:llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch
ArtOfCode

Еще один контрольный пример theatr; tмутирует, но thне делает.
Антти Хаапала

Должно быть «Golff y Côd» - «yr» следует только перед гласным, вы используете «y» перед согласным.
Гарет

Если кого-то интересуют сложные правила, касающиеся мутаций в валлийском языке, есть приложение под названием «Ap Treiglo», в котором приведены правила и перечислены многие слова, которые вызывают мутации в следующем слове.
Гарет

@ Beta Decay Да, за последние 5 лет. Рил до этого, за мои грехи.
Гарет

Ответы:


5

JavaScript (ES6), 180 байт

x=>x.replace(/^([cpt](?!h)|d(?!d)|[bgm]|ll|rh)(.+)/,(_,y,z)=>({p:"b mh ph",t:"d nh th",c:"g ngh ch",b:"f m",d:"dd n",g:" ng",m:"f"}[y]||y[0]).split` `.map(b=>a.push(b+z)),a=[x])&&a

Выходы в виде массива строк. Это моя первая попытка, поэтому она почти наверняка не оптимальна.

Попробуйте это


Это не оптимально, но мой компьютер решил отключиться, и я уже не помню, какую оптимизацию я смог провести.
Нил

4

C #, 356 338 360 байт

Я знаю, что C # - плохой выбор для кода гольфа, но он того стоит:

Третья попытка, все случаи теперь проходят, включая и т. Д. Эта корректировка стоит примерно 18 байт.

Спасибо pinkfloydx33 за советы, экономящие 24 байта!

namespace System{using Linq;using S=String;class P{static void Main(S[]a){Action<S>w=Console.WriteLine;w(a[0]);foreach(S r in"th-dd-ch-ph-p.b.mh.ph-t.d.nh.th-c.g.ngh.ch-b.f.m-d.dd.n-g..ng-m.f-ll.l-rh.r".Split('-')){var b=r.Split('.');if(a[0].StartsWith(b[0])){foreach(S f in b.Skip(1))w(Text.RegularExpressions.Regex.Replace(a[0],$"^{b[0]}",f));break;}}}}}

Выход

$> ./p gwernymynydd
gwernymynydd
wernymynydd
ngwernymynydd

Отформатированная версия

    namespace System {
    using Linq;
    using S = String;

    class P {
        static void Main(S[] a) {
            Action<S> w = Console.WriteLine;
            w(a[0]);
            foreach (S r in "th-dd-ch-ph-p.b.mh.ph-t.d.nh.th-c.g.ngh.ch-b.f.m-d.dd.n-g..ng-m.f-ll.l-rh.r"
                .Split('-')) {
                var b = r.Split('.');
                if (a[0].StartsWith(b[0])) {
                    foreach (S f in b.Skip(1))
                        w(Text.RegularExpressions.Regex.Replace(a[0], $"^{b[0]}", f));
                    break;
                }
            }
        }
    }
}

1
$"{f}"должно быть f, вы также можете сохранить первый вызов для записи строки, а также действие, не пропуская первый элемент в b (сохраняя также и пропуск) и просто заменив первый элемент на себя (я думаю). Вы также делаете только один вызов regex, поэтому кэширование / переименование импорта стоит больше, чем просто Text.RegularExpressions.Regex.Replace(...)в теле. Перерыв также является излишним, так как он будет соответствовать только один раз, не имеет значения, если он проходит до конца
pinkfloydx33

1
Не существует плохого выбора языка для гольфа - вы соревнуетесь с кем-то еще, кто хочет попытаться победить вас на одном языке. Плюс C # был когда-то предпочтительным языком для игры в гольф для Джона Скита ...
trichoplax

@ pinkfloydx33 Спасибо за советы! Однако я не могу удалить первый вызов Console.WriteLine, потому что это пропустит вывод слова в случае, если для него нет замены. Я уверен, что есть способ оптимизировать его, изменив условия.
гризли

Я только что заметил theatrслучай, и похоже, что он не мутирует правильно.
гризли

Да, есть несколько тестовых случаев, которые не проходят в данный момент, потому что PH, TH, CH и DD не трансформируются
pinkfloydx33

3

Python 3, 196 189 185 байт

Оригинальная попытка

w=input();print(w);[w.startswith(a)and[print(w.replace(a,i,1))for i in
r]+exit()for(a,*r)in(j.split(',')for j
in'th rh ph p,b,mh,ph t,d,nh,th c,g,ngh,ch b,f,m d,dd,n g,,ng m,f ll,l rh,r'.split())]

Vaultah отметил, что not w.find(a)будет заменой w.startswith(a), что спасет 2 символа. Но вместо этого not x and yмы можем использовать, x or yкоторый сохраняет некоторые символы больше:

w=input();print(w);[w.find(a)or[print(w.replace(a,i,1))for i in
r]+exit()for(a,*r)in(j.split(',')for j
in'th rh ph p,b,mh,ph t,d,nh,th c,g,ngh,ch b,f,m d,dd,n g,,ng m,f ll,l rh,r'.split())]

Еще больше экономии за счет замены w.replace(a,i,1)на i+w[len(a):]:

w=input();print(w);[w.find(a)or[print(i+w[len(a):])for i in
r]+exit()for(a,*r)in(j.split(',')for j
in'th rh ph p,b,mh,ph t,d,nh,th c,g,ngh,ch b,f,m d,dd,n g,,ng m,f ll,l rh,r'.split())]

Тогда я заметил, что была ошибка, rhбыл указан дважды; однажды в моем списке коротких замыканий, который позаботится об этих двухбуквенных согласных. К сожалению, ddоттуда не хватало, поэтому нет сбережений, и у нас есть

w=input();print(w);[w.find(a)or[print(i+w[len(a):])for i in
r]+exit()for(a,*r)in(j.split(',')for j
in'th ph dd p,b,mh,ph t,d,nh,th c,g,ngh,ch b,f,m d,dd,n g,,ng m,f ll,l rh,r'.split())]

Учитывая любой из входных данных выборки, он дает желаемый результат; данный

gorsaf

это выводит

gorsaf
orsaf
ngorsaf

и учитывая вход

theatr

это печатает

theatr

3

PowerShell v3 +, 254 231 байт

param($a)$a;$z=-join$a[1..$a.length]
if(($x=@{112='b mh ph';116='d nh th';99='g ngh ch';98='f m';100='dd n';109='f'})[+$a[0]]-and$a-notmatch'^[cpt]h|^dd'){-split$x[+$a[0]]|%{"$_$z"}}
($z,"ng$z")*($a[0]-eq103)
$z*($a-match'^ll|^rh')

работа в гольф дальше ...

Примеры

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

PS C:\Tools\Scripts\golfing> 'dydd','pobl','gwernymynydd','ffrindiau','enw','rhee','llewyn','chern','ddydd','phobl'|%{"$_ --> "+(.\golff-yr-cod.ps1 $_)}
dydd --> dydd ddydd nydd
pobl --> pobl bobl mhobl phobl
gwernymynydd --> gwernymynydd wernymynydd ngwernymynydd
ffrindiau --> ffrindiau
enw --> enw
rhee --> rhee hee
llewyn --> llewyn lewyn
chern --> chern
ddydd --> ddydd
phobl --> phobl

1

C #, 349 байт

На основе @ гризли - х представлениях , но исправили на работу с согласными , которые не получают трансформированные (фот / ч / й дд /) , что он не работает с, а также отделан некоторым избытком аута. Надеюсь, что все в порядке?

У меня было до 290, пока я не понял, что пропускаю дела th / ch / ph / dd :-(. Добавление в вызове Regex убило его

namespace System{class P{static void Main(string[]a){var x=a[0];if(!Text.RegularExpressions.Regex.IsMatch(x,"^[pct]h|^dd"))foreach(var r in"p.b.mh.ph-t.d.nh.th-c.g.ngh.ch-b.f.m-d.dd.n-g..ng-m.f-ll.l-rh.r".Split('-')){var b=r.Split('.');if(a[0].StartsWith(b[0]))for(int i=1;i<b.Length;)x+='\n'+b[i++]+a[0].Substring(b[0].Length);}Console.Write(x);}}}

Интересная заметка, никогда не знал, что вы можете опустить пространство между var r in"string"

отформатирован:

namespace System
{
    class P
    {
        static void Main(string[] a)
        {
            var x = a[0];
            if (!Text.RegularExpressions.Regex.IsMatch(x, "^[pct]h|^dd"))
                foreach (var r in"p.b.mh.ph-t.d.nh.th-c.g.ngh.ch-b.f.m-d.dd.n-g..ng-m.f-ll.l-rh.r".Split('-'))
                {
                    var b = r.Split('.');
                    if (a[0].StartsWith(b[0]))
                        for (int i = 1; i < b.Length;) x += '\n' + b[i++] + a[0].Substring(b[0].Length);
                }
            Console.Write(x);
        }
    }
}

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