Ich programmiere Rätsel, il Code Golf

21

Hintergrund

Die italienischen bestimmten Artikel (entsprechend Englisch der ) haben sieben verschiedene Formen: l‘ , il , lo , gli , i , la , le . Welche zu verwenden ist, hängt von drei Variablen ab:

  • Geschlecht: männlich / weiblich.
  • Anzahl: Singular / Plural.
  • Anfangsbuchstabe des folgenden Wortes: Vokal / Konsonant Typ A / Konsonant Typ B.
    • Vokal ist einer von diesen: aeiou .
    • Konsonant - Typ B ist jeder dieser Fälle: s- von einem anderen Konsonanten gefolgt, z- , GN- , PN- , PS- , x- , i- durch Vokal folgt (dies i wirkt als semivowel).
    • Konsonant Typ A ist ein Konsonant, der nicht Typ B ist.

Die Tabelle zeigt das Artikelformular, das in jeder der zwölf Kombinationen der drei obigen Variablen verwendet werden soll. Beachten Sie, dass das l'- Formular mit einem einfachen Anführungszeichen und ohne Leerzeichen an das folgende Wort angehängt ist.

Bildbeschreibung hier eingeben

Die Herausforderung

Geben Sie ein Wort und ein oder zwei Zeichenfolgen, Zahlen oder Boolesche Werte ein, die Geschlecht und Zahl angeben . (Die Anfangsbuchstaben müssen aus dem eingegebenen Wort stammen).

Das Eingabewort ist eine Folge von ASCII-Kleinbuchstaben. Akzentuierte Vokale werden durch ihre nicht-akzentuierten Versionen ersetzt (z. B. wird " realtà" als " realta" eingegeben ).

Bei den Eingaben für Geschlecht und Anzahl kann es sich um separate Zahlen, Boolesche Werte oder Zeichenfolgen oder um eine kombinierte Anzahl von Zeichenfolgen handeln (z. B. 1 für männliche Singularzeichen, 2 für weibliche Singularzeichen usw.).

Jedes vernünftige Format und Trennzeichen kann verwendet werden, solange es in der Antwort angegeben ist.

Geben Sie das Wort aus, dem die entsprechende Form des Artikels vorangestellt ist, und geben Sie bei Bedarf ein Leerzeichen oder ein einfaches Anführungszeichen ein. Die Ausgabe sollte auch in Kleinbuchstaben erfolgen. Nachgestellte oder führende Leerzeichen sind zulässig.

Codegolf, kürzeste Gewinne.

Testfälle

Im Folgenden habe ich die eingegebenen Buchstaben verwenden m, fum anzugeben , Geschlecht und s, pfür Nummer (dies ist nur ein mögliches Eingabeformat).

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
quelle
Möglicherweise möchten Sie auch die Koniugation regulärer Verben herausfordern.
user6245072
@ user6245072 Nun, es gibt bereits diese ... der Unterschied wäre wahrscheinlich zu klein
Luis Mendo
1
Ein kleiner technischer Kniff: / j / wird im Englischen normalerweise als Semivokal und nicht als Semikonsonant bezeichnet . Ich frage mich, was die Lösungen wären, wenn sie Randfälle wie ⟨ch⟨ berücksichtigen würden, die [ʃ] und nicht [k] ( lo chef , lo chardonnay ), die Variation mit französischen Namen ( l'Havet aber lo Hugo ), versteinerte Formen ( gli dei , per lo meno ), Frauen mit Nachnamen ( l'Antonia, aber la Antonini ) usw. Das wäre für den Golf-Code ziemlich beeindruckend.
Janus Bahs Jacquet
1
Als Italiener bitte ich Sie, den ieriTestfall abzunehmen, da es sich um ein Adverb und nicht um ein Substantiv handelt! (Übrigens war es formal korrekt) Bitte!
Giacomo Garabello
1
Wir sagen normalerweise: "Non pensare a ieri, Pensa a Domani"
Giacomo Garabello

Antworten:

7

Retina, 138 133 129 113 Bytes

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

Testsuite. (Davor %(G`\nalle Testfälle gleichzeitig laufen zu lassen)

Eingabeformat: macchina f swird 2macchinastattdessen.

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

Umrechnungstabelle dank Kevin Lau .

Undichte Nonne
quelle
4

Python 3.5, 238 235 192 181 178 Bytes:

( -13 Bytes dank Tipps von 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

Eine anonyme Lambda-Funktion, die Argumente in der folgenden Form annimmt (<String>, <Integer Gender-Plurality mapping>):

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

Um es aufzurufen, geben Sie der Funktion einfach einen gültigen Namen und rufen Sie sie dann wie eine normale Funktion auf, die in eine print-Anweisung eingeschlossen ist. Wenn also die Frage benannt werden soll U, nennen Sie sie einfach so print(U(<String>, <Integer Gender-Plurality mapping>)).

Probieren Sie es online! (Ideone)

R. Kap
quelle
zzz and yyy or xxxist zwei Bytes kürzer als[xxx,yyy][bool(zzz)]
Leaky Nun
@LeakyNun kann ich das machen? Wow, ich wusste es nicht einmal. Vielen Dank! :)
R. Kap
Es funktioniert so lange yyyes wahr ist.
Undichte Nonne
@LeakyNun Ja, natürlich.
R. Kap
["l'",'gli '][b%2]ist 3 Bytes kürzer als["l'",'gli ',"l'"][b]
Leaky Nun
4

Java, 227 208 195 Bytes

-13 Bytes dank 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;}

Nimmt Ihre Zeichenfolge und ein Int auf der Grundlage der folgenden Zuordnung:

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

Gibt einen String mit dem Ergebnis zurück.

Ungolfed mit Testfällen und ohne ternäre Operatoren (fürs Erste):

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

Verwendet ein bisschen Regex-Magie und handelt in Abhängigkeit von den beiden angegebenen Booleschen Werten. Zu meiner Überraschung sind keine Importe erforderlich, was bei der Codegröße hilft!


quelle
1
Meins ist ... länger als JAVA ?! Ich muss mein Golfspiel so schnell wie möglich fortsetzen! Gute Arbeit! +1
R. Kap
Wenn ich meine Argumente aus der Kommandozeile oder stdin, glauben Sie mir nehmen musste, hätte es viel länger gewesen: P
Ja, die Booleschen haben auch zugesagt. Ich habe das in
Luis Mendo
Ich denke du kannst verwenden, 0/1stattdessen false/truesolltest du einige Bytes sparen.
Undichte Nonne
String e = "[^aeiou]).*";Wenn Sie nicht verwenden, sparen Sie tatsächlich 5 Bytes.
Undichte Nonne
3

Ruby, 147 146 Bytes

Online ausprobieren?

Es könnte möglich sein, eine bessere Methode zu verwenden, um festzustellen, welcher Artikel verwendet werden soll, aber mir sind keine bekannt.

Gemäß der Spezifikation ist die Kennung eine Zahl wie folgt:

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"' ",?'}
Wert Tinte
quelle
2

Batch, 446 390 385 380 Bytes

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

Die neue Version verwendet dieselbe 0-3Kodierung für Geschlecht und Nummer wie mehrere andere Antworten. Werke eine 1-dimensionalen Array erstellen %2.. %13von Formen, dann die erste Verschiebung aus 1+%1Elementen , so dass die Formen des Interesses %1, %5und %9(das ist das Glück als Batch nicht oben gehen %9ohne Verschiebung). Anschließend werden die Präfixlisten mühsam überprüft, um herauszufinden, welches Formular verwendet werden muss. _wird als Platzhalter verwendet, um ein Leerzeichen darzustellen, bis das Wort ausgegeben wird.

Neil
quelle
Sie können auch in eine einzelne Ziffer (oder einen Buchstaben, falls erforderlich, da die Spezifikation dies zulässt) codiert werden, um Bytes zu sparen. Alles ist um der Bytes willen!
Wert Tinte
@ KevinLau-notKenny Durch die Umstellung auf die Ziffernkodierung konnte ich durch Umschreiben des Geschlechts und der Nummernverarbeitung unglaubliche 56 Bytes einsparen!
Neil
1

Python 3, 235 Bytes

Ich war gespannt, wie kurz ich das in Python ohne Regex bekommen könnte. Es stellt sich heraus, dass dies nicht die beste Option ist ...

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

Eine anonyme Funktion, die die Eingabe über das Argument des Wortes sund den Code der Geschlechtsnummer cals Ganzzahl unter Verwendung der folgenden Zuordnung akzeptiert:

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

und gibt das Wort mit dem richtigen Artikel zurück.

Wie es funktioniert

Es wird eine Liste erstellt, die die Möglichkeiten für jede ceinzelne Liste enthält . Die Liste wird dann unter Verwendung des Werts von indiziert c, wodurch eine Liste mit 3 Elementen mit den relevanten Optionen erhalten wird. Ein Listenindex wird jetzt durch Indizieren in eine andere verschachtelte Liste mit den Ergebnissen von Booleschen Ausdrücken ausgewählt. Wenn das erste Zeichen von sein Vokal ist und nicht ivon einem Vokal gefolgt wird, vowelergibt sich die Option für durch die Rückgabe des Index 0. Andernfalls wird ein Boolescher Ausdruck ausgewertet, der Truefür cons. Bund Falsefür cons. Azurückgibt 2und die Indizes bzw. 1ergibt. Schließlich wird der Index verwendet, um den Artikel zu erhalten, der mit einem Leerzeichen und der ursprünglichen Zeichenfolge verknüpft ist, bevor er zurückgegeben wird.

Probieren Sie es auf Ideone

TheBikingViking
quelle
1

JavaScript 210 Bytes

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

Eine anonyme Funktion mit zwei Parametern s und p wo

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

Nachdem die Funktion einer Variablen zugewiesen und etwas entpackt wurde, kann sie als getestet werden

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

woher

  • cist eine Funktion zum Testen seines Konsonanten an einer Position i.
  • r ergibt 0 für den Beginn mit einem Vokal, 1 für den Beginn mit einem Konsonanten vom Typ A und 2 für den Beginn mit einem Konsonanten vom Typ B (in umgekehrter Reihenfolge getestet).
  • Ein bisschen Bashing in der return-Anweisung fügt es zusammen.
traktor53
quelle