Гольф і Код - Тріглад


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]означає, що g видалено з початку слова.

Зауважте, що є деякі приголосні, які не мутують:

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 Deay Так, за останні 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 # є поганим вибором для кодового гольфу, але варто зняти:

Третя спроба, всі випадки тепер проходять, включаючи thph- і т. Д. Це коригування коштувало приблизно 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 (збереження пропуску також) і просто замінивши перший елемент на себе (я думаю). Ви також робите лише один виклик регулярного вибору, тому кешування / перейменування імпорту коштує більше, ніж просто 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())]

Ваулта зазначив, що not w.find(a)заміною w.startswith(a)цього буде збереження двох символів. Але замість цього 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 байт

На основі подання @ grizzly , але виправлено на роботу з приголосними, які не перетворюються (ph / ch / th / dd), з якими не працювали, а також обрізали деякий надлишок. Сподіваюся, що це добре?

У мене це було до 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.