Я програмую пазли, іл-код гольфу


21

Фон

Італійська артикль (відповідна англійська в ) має сім різних форм: L » , иль , чи , GLI , я , чи , ль . Яку використовувати, залежить від трьох змінних:

  • Стать: чоловічий / жіночий.
  • Номер: однина / множина.
  • Початкова літера наступного слова: голосний / приголосний тип А / приголосний тип В.
    • Голосний - це будь-який із них: aeiou .
    • Приголосний тип B - це будь-який із цих випадків: s-, за яким йде інший приголосний, z- , gn- , pn- , ps- , x- , i-, за яким йде голосний (це i виступає як напівголосний).
    • Приголосний тип А - це приголосний, який не є типом В.

У таблиці показана форма статті, яка повинна використовуватись у кожній із дванадцяти комбінацій трьох вищезмінних змінних. Зауважте, що форма l ' додається до наступного слова з однією цитатою та без пробілу.

введіть тут опис зображення

Змагання

Введіть слово та один-два рядки, числа чи булеві символи із зазначенням статі та числа . (Початкові літери повинні бути отримані з вхідного слова).

Вхідним словом буде послідовність малих літер ASCII. Наголошені голосні звуки будуть замінені версіями без наголосів (наприклад, realtà буде введено як realta ).

Вхідні дані про стать і число можуть бути окремими числами, булевими або рядками або комбінованим числом рядків (наприклад, 1 для чоловічого роду однини, 2 для жіночого однини тощо).

Можна використовувати будь-який розумний формат і роздільник, якщо це вказано у відповіді.

Виведіть слово, яке передує відповідній формі статті , з необхідним пробілом або однією цитатою. Вихід також має бути малий. Дозволений пробіл або пробіл.

Код гольфу, найкоротші виграші.

Тестові кейси

Надалі я використовую вхідні літери m, fвказати стать, і s, pдля числа (це тільки один можливий формат вводу).

Input               Output              Comment

macchina f s        la macchina         Initial letter is cons. A
zio m s             lo zio              Initial letter is cons. B
libri m p           i libri             Initial letter is cons. A
ieri m s            lo ieri             Initial letter is cons. B
aquile f p          le aquile           Initial letter is vowel
spagnoli m p        gli spagnoli        Initial letter is cons. B
golf m s            il golf             Initial letter is cons. A
ombra f s           l'ombra             Initial letter is vowel
impossibili m p     gli impossibili     Initial letter is vowel

Можливо, ви також хочете зробити виклик щодо сполучення регулярних дієслів.
user6245072

@ user6245072 Ну, вже є це ... різниця, ймовірно , буде занадто мала
Луїс Mendo

1
Незначний технічний нігень: / j / в англійській мові зазвичай називається напівголовим , а не напівсоннім . Цікаво, які рішення були б, якби вони враховували крайові випадки на зразок ⟨ch⟩, що представляє [ʃ], а не [k] ( lo chef , lo chardonnay ), варіації з французькими іменами ( l'Havet, але lo Hugo ), скам’янілі форми ( gli dei , per lo meno ), жінки, на які посилаються своїм прізвищем ( l'Antonia, але la Antonini ) тощо.
Jaus Bahs Jacquet

1
Як італійський я прошу зняти ieri тестовий випадок, оскільки це прислівник, а не іменник! (До речі, це було формально правильно) Будь ласка!
Джакомо Гарабелло

1
Ми зазвичай кажемо: "Non pensare a ieri, Pensa a Domani"
Джакомо Гарабелло

Відповіді:


7

Сітківка, 138 133 129 113 байт

^.(s[^aeiou]|z|gn|pn|ps|x|i[aeiou])
B$&
^.[aeiou]
V$&
^\d.
A$&
V[02]
l'
A0
il 
B0
lo 
A1
i 
.1
gli 
.2
la 
.3
le 

Тестовий набір. ( %(G`\nпередбачувано запускати всі тестові справи одразу)

Формат введення: замість цього macchina f sстає 2macchina.

0: Masculine Singular
1: Masculine Plural
2: Feminine Singular
3: Feminine Plural

Таблиця переходів завдяки Кевіну Лау .


4

Пітон 3,5, 238 235 192 181 178 байт:

( -13 байт завдяки підказкам Leaky Nun! )

import re;R=re.match;lambda a,b:(R('s[^aeiou]|(z|gn|pn|ps|x|i)[aeiou]',a)and['lo ','gli ','la '][b]or R('[aeiou]',a)and["l'",'gli '][b%2]or['il ','i ','la '][b]if b<3else'le ')+a

Анонімна лямбда-функція, яка приймає аргументи у вигляді (<String>, <Integer Gender-Plurality mapping>) , де відображення виглядає так:

0 -> Masculine Singular
1 -> Masculine Plural
2 -> Feminine Singular
3 -> Feminine Plural

Щоб зателефонувати, просто дайте функції будь-яке дійсне ім'я, а потім назвіть її як звичайну функцію, загорнуту всередині оператора друку. Тому, якби питання було названоU , просто назвіть його так print(U(<String>, <Integer Gender-Plurality mapping>)).

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


zzz and yyy or xxxна два байти коротше, ніж[xxx,yyy][bool(zzz)]
Leaky Nun

@LeakyNun Я можу це зробити? Нічого собі, я навіть не знав. Спасибі! :)
Р. Кап

Він працює до тих пір, поки не yyyє правдою.
Leaky Nun

@LeakyNun Так, звичайно.
Р. Кап

["l'",'gli '][b%2]на 3 байти коротше, ніж["l'",'gli ',"l'"][b]
Leaky Nun

4

Ява, 227 208 195 байт

-13 байт завдяки Leaky Nun

String f(String a,int o){boolean v=a.matches("^([aeou]|i[^aeiou]).*"),b=a.matches("^([ixz]|gn|pn|ps|s[^aeiou]).*");return(o>1?o>2?"le ":v?"l'":"la ":o>0?v||b?"gli ":"i ":v?"l'":b?"lo ":"il ")+a;}

Бере свій рядок та int на основі наступного відображення:

0: Masculine Singular
1: Masculine Plural
2: Feminine Singular
3: Feminine Plural

Повертає рядок з результатом.

Без заготівлі з тестовими кейсами та без тернальних операторів (реально зараз):

class Test {

    public static String f(String a, int o) {
        boolean v = a.matches("^([aeou]|i[^aeiou]).*");
        boolean b = a.matches("^([ixz]|gn|pn|ps|s[^aeiou]).*");
        String r;
        if(o > 1)
            if(o > 2)
                r = "le ";
            else
                if(v)
                    r = "l'";
                else
                    r = "la ";
        else
            if(o > 0)
                if(v || b)
                    r = "gli ";
                else
                    r = "i ";
            else
                if(v)
                    r = "l'";
                else if(b)
                    r = "lo ";
                else
                    r = "il ";
        return r + a;
    }

    public static void main(String[] args) {
        System.out.println(f("macchina", 2));
        System.out.println(f("zio", 0));
        System.out.println(f("libri", 1));
        System.out.println(f("ieri", 0));
        System.out.println(f("aquile", 3));
        System.out.println(f("spagnoli", 1));
        System.out.println(f("golf", 0));
        System.out.println(f("ombra", 2));
        System.out.println(f("impossibili", 1));
    }
}

Використовує трохи регекс-магії та діє залежно від двох заданих булевих значень. На мій подив, імпорт не потрібен, що допомагає з розміром коду!


1
Моє ... довше, ніж JAVA ?! Я повинен гольфу ще трохи скоріше! Хороша робота, хоча! +1
Р. Кап

Якби мені довелося брати свої аргументи з командного рядка або stdin, повірте, це було б набагато довше: P

Так, буленів теж прийняли. Я це відредагував у
Луїс Мендо

Я думаю, що ви можете використовувати 0/1замість цього, false/trueщоб заощадити кілька байтів.
Leaky Nun

Якщо не використовувати, то String e = "[^aeiou]).*";ви економить 5 байт.
Leaky Nun

3

Рубі, 147 146 байт

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

Можливо, можна скористатися кращим методом, щоб визначити, яку статтю використовувати, але я не знаю жодної.

Відповідно до специфікації, ідентифікатор - це число:

0: Masculine Singular
1: Masculine Plural
2: Feminine Singular
3: Feminine Plural

->w,i{(%w"lo gli la le l' gli l' le il i la le"[(0..2).find{|r|[/^(i[aeiou]|s[^aeiou]|z|x|[gp]n|ps)/,/^[aeiou]/,//][r]=~w}*4+i]+' '+w).sub"' ",?'}

2

Пакетна, 446 390 385 380 байт

@echo off
set w=%2
call:l %1 l' gli_ l' le_ il_ i_ la_ le_ lo_ gli_ le_ le_
exit/b
:l
for /l %%a in (0,1,%1)do shift
set o=%5
for %%a in (gn pn ps)do if %%a==%w:~,2% set o=%9
for %%a in (s z x)do if %%a==%w:~,1% set o=%9
for %%a in (a e i o u)do if %%a==%w:~,1% set o=%1
for %%a in (a e i o u)do if i%%a==%w:~,2% (set o=%9)else if s%%a==%w:~,2% set o=%1
echo %o:_= %%w%

Нова версія використовує те саме 0-3кодування для статі та кількості, як і кілька інших відповідей. Працює, створюючи одновимірний масив %2.. %13форм, потім переміщуючи перші 1+%1елементи так, щоб форми, що цікавлять, ставали %1, %5і %9(що пощастило, оскільки Пакет не піде вище %9без зсуву). Потім він наполегливо перевіряє списки префіксів, щоб з’ясувати, яку форму потрібно використовувати. _використовується як заповнювач для представлення пробілу до виведення слова.


Можна також їх закодувати в одну цифру (або літеру, якщо це потрібно, оскільки специфікація дозволяє) для збереження байтів. Все заради байтів!
Значення чорнила

@ KevinLau-notKenny Перехід на цифрове кодування дозволив мені зберегти колосальні 56 байт, переписавши стать та обробку цифр!
Ніл

1

Python 3, 235 байт

Мені було цікаво побачити, як коротко я можу отримати це в Python без регулярних виразів. Виявляється, це не найкращий варіант ...

lambda s,c,v='aeiou':[["l'",'il','lo'],['gli','i','gli'],["l'",'la','la'],['le']*3][c][[[1,2][s[0]=='s'and s[1]not in v or s[0]in'zx'or s[:2]in['gn','pn','ps']or s[0]=='i'and s[1]in v],0][s[0]in v and not(s[0]=='i'and s[1]in v)]]+' '+s

Анонімна функція, яка приймає введення через аргумент слова sта гендерний код cяк ціле число, використовуючи наступне відображення:

0 - Masculine Singular
1 - Masculine Plural
2 - Feminine Singular
3 - Feminine Plural

і повертає слово з правильною статтею.

Як це працює

Створюється список, що містить можливості для кожного cокремого списку. Потім список індексується, використовуючи значення c, отримуючи 3-елементний список з відповідними параметрами. Індекс списку тепер вибирається шляхом індексації до іншого вкладеного списку з результатами булевих виразів. Якщо перший символ символу sє голосним і не iсупроводжується голосним, то опція для цього vowelвидається через повернення індексу 0. В іншому випадку оцінюється булевий вираз, що повертається Trueза cons. Bі Falseдля cons. A, отримуючи показники 2і 1відповідно. Нарешті, індекс використовується для отримання статті, яка об'єднується з пробілом та початковою рядком перед поверненням.

Спробуйте це на Ideone


1

JavaScript 210 байт

(s,p)=>{var c=i=>!("aeiou".indexOf(s[i])+1),r=["z","gn","pn","ps","x"].some(t=>!s.indexOf(t))||(c(1)?s[0]=="s":s[0]=="i")?2:c(0)?1:0;return (p&1?(p&2?"le ":r&1?"i ":"gli "):!r?"l'":p&2?"la ":r&1?"il ":"lo ")+s}

Анонімна функція, що приймає два параметри s і p де

s  is the input string
p  is plurality (bit 0, set=plural) and gender (bit 1, set=f) combined as
    0 = masculine singular
    1 = masculine plural
    2 = feminine singular
    3 = feminine plural

Після присвоєння функції змінній та деякого розпакування) її можна перевірити як

var f=(s,p)=>{
    var c = i=>!("aeiou".indexOf(s[i])+1),
        r = ["z","gn","pn","ps","x"].some(t=>!s.indexOf(t))
             || ( c(1)? s[0]=="s":s[0]=="i" )
             ?   2 : c(0) ? 1 : 0;

     return (p&1?(p&2?"le ":r&1?"i ":"gli "):!r?"l'":p&2?"la ":r&1?"il ":"lo ")+s;
}

console.log("%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n",
 f("macchina",2),
 f("zio",0),
 f("libri",1),
 f("ieri", 0),
 f("aquile",3),
 f("spagnoli",1),
 f("golf",0),
 f("ombra",2),
 f("impossibili",1))

де

  • c- це функція перевірки sна приголосний у положенні i.
  • r оцінює 0 для початку з голосною, 1 для початку з приголосного типу A і 2 для початку з приголосного типу B (тестується у зворотному порядку).
  • Біт базування у зворотному заяві поєднує його.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.