Programuję puzzle, golf kod

21

tło

Włoski określony artykuł (odpowiadające angielskim z ) ma siedem różnych formach: l” , IL , lo , GLI , I , la , le . Wybór jednego zależy od trzech zmiennych:

  • Płeć: męska / żeńska.
  • Liczba: liczba pojedyncza / mnoga.
  • Pierwsza litera następnego słowa: samogłoska / spółgłoska typu A / spółgłoska typu B.
    • Vowel jest jednym z tych: aeiou .
    • Konsonant typu B to dowolny z tych przypadków: s- po nim następna spółgłoska, z- , gn- , pn- , ps- , x- , i- po nim samogłoska (to i działa jak półpółka).
    • Spółgłoska typu A jest spółgłoską, która nie jest typem B.

Tabela pokazuje formularz artykułu do zastosowania w każdej z dwunastu kombinacji trzech powyższych zmiennych. Zauważ, że formularz l ' jest dołączony do następującego słowa z pojedynczym cudzysłowiem i bez spacji.

wprowadź opis zdjęcia tutaj

Wyzwanie

Wpisz słowo i jeden lub dwa ciągi, cyfry lub booleany wskazujące płeć i liczbę . (Pierwsze litery będą musiały zostać uzyskane ze słowa wejściowego).

Słowo wejściowe będzie ciągiem małych liter ASCII. Akcentowane samogłoski zostaną zastąpione ich nieakcentowanymi wersjami (na przykład realtà zostanie wprowadzone jako realta ).

Dane dotyczące płci i liczby mogą być osobnymi liczbami, logarytmami lub ciągami znaków lub połączoną liczbą ciągów znaków (na przykład 1 dla liczby pojedynczej rodzaju męskiego, 2 dla liczby pojedynczej rodzaju żeńskiego itp.).

Można użyć dowolnego rozsądnego formatu i separatora, o ile jest on określony w odpowiedzi.

Wpisz słowo poprzedzone odpowiednią formą artykułu , w razie potrzeby ze spacją lub pojedynczym cytatem. Dane wyjściowe powinny być również pisane małymi literami. Dozwolone jest końcowe lub wiodące puste miejsce.

Code golf, najkrótsze wygrane.

Przypadki testowe

W dalszej części używać liter wejściowych m, faby określić płeć, i s, pdla numeru (jest tylko jeden możliwy format wejściowy).

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
Luis Mendo
źródło
Możesz także rzucić wyzwanie koniugacji czasowników regularnych.
user6245072
@ user6245072 Cóż, już jest to ... różnica prawdopodobnie byłaby zbyt mała
Luis Mendo
1
Niewielki techniczny niggle: / j / jest zwykle nazywany półwąglówką w języku angielskim, a nie półprzewodnikiem . Zastanawiam się, jakie byłyby rozwiązania, gdyby uwzględnić czynniki takie jak „ch⟩ reprezentujące [⟩] zamiast [k] ( lo chef , lo chardonnay ), odmiana z francuskimi nazwami ( l'Havet ale lo Hugo ), skamieniałe formy ( gli dei , per lo meno ), kobiety określane ich nazwiskiem ( l'Antonia ale la Antonini ) itp. To byłaby budząca grozę gra w golfa.
Janus Bahs Jacquet
1
Jako włoski proszę was o zdejmowanie ieriskrzynki testowej, ponieważ jest przysłówkiem, a nie rzeczownikiem! (BTW to było formalnie poprawne) Proszę!
Giacomo Garabello,
1
Zwykle mówimy: „Non pensare a ieri, Pensa a Domani”
Giacomo Garabello,

Odpowiedzi:

7

Retina, 138 133 129 113 bajtów

^.(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 

Zestaw testowy. (przygotowane %(G`\ndo uruchomienia wszystkich przypadków testowych jednocześnie)

Format wejściowy: zamiast tego macchina f sstaje się 2macchina.

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

Tabela konwersji dzięki Kevinowi Lau .

Leaky Nun
źródło
4

Python 3.5, 238 235 192 181 178 bajtów:

( -13 bajtów dzięki poradom 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

Anonimowa funkcja lambda, która przyjmuje argumenty w postaci (<String>, <Integer Gender-Plurality mapping>), gdzie mapowanie jest następujące:

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

Aby go wywołać, wystarczy nadać tej funkcji dowolną prawidłową nazwę, a następnie wywołać ją jak normalną funkcję zawartą w instrukcji print. Dlatego, jeśli pytanie ma zostać nazwane U, po prostu nazwij to tak print(U(<String>, <Integer Gender-Plurality mapping>)).

Wypróbuj online! (Ideone)

R. Kap
źródło
zzz and yyy or xxxjest dwa bajty krótszy niż[xxx,yyy][bool(zzz)]
Leaky Nun
@LeakyNun Mogę to zrobić? Wow, nawet nie wiedziałem. Dzięki! :)
R. Kap
Działa tak długo, jak yyyto jest prawdą.
Leaky Nun
@LeakyNun Tak, oczywiście.
R. Kap
["l'",'gli '][b%2]jest o 3 bajty krótszy niż["l'",'gli ',"l'"][b]
Leaky Nun
4

Java, 227 208 195 bajtów

-13 bajtów dzięki 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;}

Pobiera ciąg i int na podstawie następującego mapowania:

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

Zwraca ciąg z wynikiem.

Niegolfowany z przypadkami testowymi i bez operatorów trójskładnikowych (na razie):

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));
    }
}

Wykorzystuje odrobinę magii wyrażeń regularnych i działa w zależności od dwóch określonych booleanów. Ku mojemu zdziwieniu, import nie jest potrzebny, co pomaga w rozmiarze kodu!


źródło
1
Mój jest ... dłuższy niż JAVA ?! Muszę trochę pograć w golfa! Dobra robota! +1
R. Kap.
Gdybym miał wziąć moje argumenty z wiersza poleceń lub standardowego wejścia, uwierz mi, byłoby to o wiele dłużej: P
Tak, booleanie też się zgodzili. Zredagowałem to w
Luis Mendo
Myślę, że możesz użyć 0/1zamiast tego, false/trueaby zaoszczędzić trochę bajtów.
Leaky Nun
Nieużywanie String e = "[^aeiou]).*";faktycznie oszczędza 5 bajtów.
Leaky Nun
3

Ruby, 147 146 bajtów

Wypróbuj online?

Może być możliwe użycie lepszej metody w celu ustalenia, którego artykułu użyć, ale nie znam żadnego.

Zgodnie ze specyfikacją identyfikator jest liczbą, jak następuje:

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"' ",?'}
Wartość tuszu
źródło
2

Partia, 446 390 385 380 bajtów

@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%

Nowa wersja używa tego samego 0-3kodowania dla płci i liczby, co kilka innych odpowiedzi. Dzieła stworzenia 1-wymiarową tablicę %2.. %13form, a następnie przesuwa się pierwsze 1+%1elementy tak, że tworzy to stać %1, %5i %9(co jest szczęście jako partia nie pójdzie powyżej %9bez przesunięcia). Następnie mozolnie sprawdza listy prefiksów, aby dowiedzieć się, który formularz należy użyć. _jest używany jako symbol zastępczy do reprezentowania spacji, dopóki słowo nie zostanie wypisane.

Neil
źródło
Równie dobrze może być zakodowany w postaci jednej cyfry (lub litery, jeśli jest to konieczne, ponieważ specyfikacja na to pozwala), aby zaoszczędzić bajty. Wszystko ze względu na bajty!
Wartość tuszu
@ KevinLau-notKenny Przejście na kodowanie cyfrowe pozwoliło mi zaoszczędzić aż 56 bajtów, przepisując płeć i obsługę liczb!
Neil
1

Python 3, 235 bajtów

Byłem zainteresowany, aby zobaczyć, jak krótko mogę uzyskać to w Pythonie bez wyrażeń regularnych. Okazuje się, że nie jest to najlepsza opcja ...

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

Anonimowa funkcja, która pobiera dane wejściowe za pomocą argumentu słowa si kodu liczby płci cjako liczby całkowitej, przy użyciu następującego odwzorowania:

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

i zwraca słowo z poprawnym artykułem.

Jak to działa

Tworzona jest lista zawierająca możliwości dla każdej z nich cjako osobne listy. Lista jest następnie indeksowana przy użyciu wartości c, co daje 3-elementową listę z odpowiednimi opcjami. Indeks listy jest teraz wybierany poprzez indeksowanie do innej listy zagnieżdżonej z wynikami wyrażeń boolowskich. Jeśli pierwszym znakiem sjest samogłoska, ipo której nie następuje samogłoska, opcja dla voweljest uzyskiwana poprzez zwracanie indeksu 0. W przeciwnym razie obliczane jest wyrażenie logiczne zwracające się Trueza cons. Bi Falsedla cons. A, uzyskując odpowiednio wskaźniki 2i 1. Wreszcie indeks służy do otrzymania artykułu, który przed zwróceniem jest łączony spacją i ciągiem znaków.

Wypróbuj na Ideone

TheBikingViking
źródło
1

JavaScript 210 bajtów

(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}

Anonimowa funkcja przyjmująca dwa parametry si p gdzie

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

Po przypisaniu funkcji do zmiennej i pewnym rozpakowaniu) można ją przetestować jako

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))

gdzie

  • cjest funkcją sprawdzania sspółgłoski w pozycji i.
  • r ocenia się na 0 dla rozpoczynania od samogłoski, 1 dla rozpoczynania od spółgłoski typu A i 2 dla rozpoczynania od spółgłoski typu B (testowane w odwrotnej kolejności).
  • Walenie bitów w instrukcji return łączy to razem.
traktor53
źródło