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

21

Задний план

Итальянская артикль (соответствующая английский в ) имеет семь различных форм: , иль , ли , GLI , я , ли , ль . Какой из них использовать, зависит от трех переменных:

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

Таблица показывает форму статьи, которая будет использоваться в каждой из двенадцати комбинаций трех вышеупомянутых переменных. Обратите внимание, что форма 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
Незначительная техническая придирка: / х / обычно называется полугласный на английском языке, а не semiconsonant . Интересно, какими были бы решения, если бы они учитывали крайние случаи, такие как ⟨ch⟩, представляющий [ʃ], а не [k] ( lo chef , lo chardonnay ), вариант с французскими именами ( l'Havet, но lo Hugo ), окаменелые формы ( gli dei , per lo meno ), женщины, которых называют по фамилии ( l'Antonia, но la Antonini ) и т. д. Это было бы весьма грозной вещью для гольф-кода.
Янус Бах Жакет
1
Как итальянский, я прошу вас снять ieriконтрольный пример, потому что это наречие, а не существительное! (Кстати, это было формально правильно) Пожалуйста!
Джакомо Гарабелло
1
Мы обычно говорим: «Номера для людей , 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

Python 3,5 238 235 192 181 178 байт:

( -13 байт благодаря советам от Лаки Монахини! )

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

Чтобы вызвать его, просто дайте функции любое допустимое имя, а затем вызовите ее как обычную функцию, заключенную в оператор print. Поэтому, если вопрос должен быть назван U, просто назовите его как print(U(<String>, <Integer Gender-Plurality mapping>)).

Попробуйте онлайн! (Ideone)

Р. Кап
источник
zzz and yyy or xxx на два байта короче [xxx,yyy][bool(zzz)]
Leaky Nun
@ LeakyNun я могу это сделать? Вау, я даже не знал. Благодарность! :)
Р. Кап
Это работает до тех пор, пока yyyэто правда.
Дрянная Монахиня
@LeakyNun Да, конечно.
Р. Кап
["l'",'gli '][b%2]на 3 байта короче["l'",'gli ',"l'"][b]
Leaky Nun
4

Ява, 227 208 195 байт

-13 байт благодаря Лаки Нун

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
Р. Кап
Если бы мне пришлось принимать мои аргументы из командной строки или стандартного ввода, поверьте мне, это было бы намного дольше: P
Да, логические значения тоже принимаются. Я редактировал это в
Луис Мендо
Я думаю, что вы можете использовать 0/1вместо того, false/trueчтобы сэкономить несколько байтов.
Дрянная Монахиня
Неиспользование String e = "[^aeiou]).*";фактически экономит 5 байтов.
Утренняя монахиня
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, получая трехэлементный список с соответствующими параметрами. Индекс списка теперь выбирается путем индексации в другой вложенный список с результатами булевых выражений. Если первый символ sявляется гласным и не iсопровождается гласным, опция для vowelвозвращается через возвращение индекса 0. Иначе, булево выражение, возвращаемое Trueдля cons. Bи Falseдля cons. Aвычисляется, получая индексы 2и1 соответственно. Наконец, индекс используется для получения статьи, которая объединяется с пробелом и исходной строкой перед возвращением.

Попробуйте это на Ideone

TheBikingViking
источник
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 (проверено в обратном порядке).
  • Бит бит в операторе возврата помещает это вместе.
traktor53
источник