Saya pemrograman teka-teki, golf kode il

21

Latar Belakang

Artikel yang pasti Italia (sesuai dengan bahasa Inggris yang ) memiliki tujuh bentuk yang berbeda: l' , il , lo , gli , i , la , le . Yang mana yang akan digunakan tergantung pada tiga variabel:

  • Jenis kelamin: maskulin / feminin.
  • Nomor: tunggal / jamak.
  • huruf awal dari kata berikutnya: vokal / konsonan tipe A / konsonan tipe B.
    • Vokal adalah salah satunya: aeiou .
    • Konsonan tipe B adalah setiap kasus ini: S- diikuti oleh konsonan lain, z , gn- , pn- , ps , x- , i- diikuti oleh vokal (ini saya bertindak sebagai semivokal).
    • Konsonan tipe A adalah konsonan yang bukan tipe B.

Tabel menunjukkan bentuk artikel yang akan digunakan dalam masing-masing dua belas kombinasi dari tiga variabel di atas. Perhatikan bahwa formulir l terlampir pada kata berikut dengan kutipan tunggal dan tanpa spasi.

masukkan deskripsi gambar di sini

Tantangan

Masukkan kata dan satu atau dua string, angka atau Boolean yang menunjukkan jenis kelamin dan angka . (Huruf awal harus diperoleh dari kata input).

Kata input akan menjadi urutan huruf ASCII huruf kecil. Vokal beraksen akan diganti dengan versi non-aksennya (misalnya, realtà akan dimasukkan sebagai realta ).

Input gender dan angka dapat berupa angka terpisah, Boolean atau string, atau gabungan jumlah string (misalnya, 1 untuk maskulin singular, 2 untuk feminin singular, dll).

Format dan pemisah yang masuk akal dapat digunakan, selama itu ditentukan dalam jawabannya.

Keluarkan kata yang didahului dengan bentuk artikel yang sesuai , dengan spasi atau kutipan tunggal sesuai kebutuhan. Outputnya juga harus huruf kecil. Trailing atau ruang kosong dibolehkan.

Golf kode, kemenangan terpendek.

Uji kasus

Berikut ini saya menggunakan huruf input m, funtuk menentukan jenis kelamin, dan s, puntuk angka (ini hanya satu format input yang mungkin).

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
sumber
Anda mungkin ingin juga membuat tantangan pada koniugasi kata kerja reguler.
user6245072
@ user6245072 Yah, sudah ada ini ... perbedaannya mungkin terlalu kecil
Luis Mendo
1
Niggle teknis minor: / j / biasanya disebut semivowel dalam bahasa Inggris, bukan semikonsonan . Saya bertanya-tanya apa solusinya jika mereka menjadi faktor dalam kasus tepi seperti ⟨ch⟩ mewakili [ʃ] daripada [k] ( lo chef , lo chardonnay ), variasi dengan nama-nama Perancis ( l'Havet tapi lo Hugo ), bentuk-bentuk fosil ( gli dei , per lo meno ), wanita yang disebut dengan nama belakang mereka ( l'Antonia tetapi la Antonini ), dll. Itu akan menjadi hal yang cukup hebat untuk kode golf.
Janus Bahs Jacquet
1
Sebagai orang Italia saya meminta Anda melepas ieritest case karena kata keterangan dan bukan kata benda! (BTW itu secara resmi benar) Tolong!
Giacomo Garabello
1
Kami biasanya berkata: "Non pensare a ieri, Pensa a Domani"
Giacomo Garabello

Jawaban:

7

Retina, 138 133 129 113 byte

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

Suite uji. (diawali %(G`\nuntuk menjalankan semua uji sekaligus)

Format input: macchina f smenjadi 2macchinagantinya.

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

Tabel konversi berkat Kevin Lau .

Biarawati Bocor
sumber
4

Python 3.5, 238 235 192 181 178 byte:

( -13 bytes berkat tips dari 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

Fungsi lambda anonim yang mengambil argumen dalam bentuk (<String>, <Integer Gender-Plurality mapping>), di mana pemetaannya adalah sebagai berikut:

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

Untuk memanggilnya, cukup berikan fungsi nama yang valid, lalu panggil seperti fungsi normal yang dibungkus dalam pernyataan cetak. Karena itu, jika pertanyaan itu ingin disebutkan U, cukup sebut saja seperti print(U(<String>, <Integer Gender-Plurality mapping>)).

Cobalah secara Online! (Ideone)

R. Kap
sumber
zzz and yyy or xxxlebih pendek dua byte dari[xxx,yyy][bool(zzz)]
Leaky Nun
@ LeakyNun saya bisa melakukan itu? Wow, saya bahkan tidak tahu. Terima kasih! :)
R. Kap
Ini berfungsi asalkan yyybenar.
Leaky Nun
@ LeakyNun Ya, tentu saja.
R. Kap
["l'",'gli '][b%2]lebih pendek 3 byte dari["l'",'gli ',"l'"][b]
Leaky Nun
4

Java, 227 208 195 byte

-13 byte berkat 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;}

Mengambil string dan int Anda berdasarkan pemetaan berikut:

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

Mengembalikan string dengan hasilnya.

Tidak digabungkan dengan kasus uji dan tanpa operator ternary (sekarang nyata):

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

Menggunakan sedikit sihir regex dan bertindak tergantung pada dua boolean yang ditentukan. Yang mengejutkan saya, tidak ada impor yang diperlukan, yang membantu dengan ukuran kode!


sumber
1
Milik saya ... lebih lama dari JAWA ?! Saya harus golf saya turun sedikit lebih cepat! Kerja bagus! +1
R. Kap
Jika saya harus mengambil argumen saya dari command line atau stdin, percayalah, itu akan jauh lebih lama: P
Ya, Boolean juga diterima. Saya telah mengeditnya di
Luis Mendo
Saya pikir Anda dapat menggunakan 0/1alih-alih false/trueyang seharusnya menghemat beberapa byte.
Leaky Nun
Tidak menggunakan String e = "[^aeiou]).*";sebenarnya menghemat 5 byte.
Leaky Nun
3

Ruby, 147 146 byte

Coba online?

Mungkin dimungkinkan untuk menggunakan metode yang lebih baik untuk menentukan artikel mana yang akan digunakan, tetapi saya tidak mengetahui adanya.

Sesuai spek, pengenal adalah angka, sebagai berikut:

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"' ",?'}
Nilai Tinta
sumber
2

Batch, 446 390 385 380 byte

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

Versi baru menggunakan 0-3pengodean yang sama untuk jenis kelamin dan angka seperti beberapa jawaban lainnya. Bekerja dengan menciptakan array 1 dimensi %2.. %13dari bentuk, kemudian menggeser 1+%1elemen pertama sehingga bentuk yang menarik menjadi %1, %5dan %9(yang beruntung karena Batch tidak akan pergi ke atas %9tanpa bergeser). Kemudian dengan susah payah memeriksa daftar awalan untuk mencari tahu formulir mana yang perlu digunakan. _digunakan sebagai pengganti untuk mewakili spasi sampai kata tersebut ditampilkan.

Neil
sumber
Mungkin mereka juga dikodekan menjadi satu digit (atau huruf jika diperlukan, karena spec memungkinkannya) untuk menyimpan byte. Semuanya demi byte!
Nilai Tinta
@ KevinLau-notKenny Beralih ke pengkodean angka memungkinkan saya untuk menyimpan 56 byte kekalahan dengan menulis ulang penanganan gender dan angka!
Neil
1

Python 3, 235 byte

Saya tertarik untuk melihat seberapa pendek saya bisa mendapatkan ini dengan Python tanpa regex. Ternyata ini bukan pilihan terbaik ...

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

Fungsi anonim yang mengambil input melalui argumen kata sdan kode nomor gender csebagai bilangan bulat, menggunakan pemetaan berikut:

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

dan mengembalikan kata dengan artikel yang benar.

Bagaimana itu bekerja

Daftar yang berisi kemungkinan untuk masing-masing csebagai daftar terpisah dibuat. Daftar ini kemudian diindeks menjadi menggunakan nilai c, menghasilkan daftar 3-elemen dengan opsi yang relevan. Indeks daftar sekarang dipilih dengan mengindeks ke daftar bersarang lain dengan hasil ekspresi Boolean. Jika karakter pertama sadalah vokal dan tidak idiikuti oleh vokal, opsi untuk voweldihasilkan melalui kembalinya indeks 0. Lain, ekspresi Boolean kembali Trueuntuk cons. Bdan Falseuntuk cons. Adievaluasi, menghasilkan indeks 2dan 1masing-masing. Akhirnya, indeks digunakan untuk menghasilkan artikel, yang digabungkan dengan spasi dan string asli sebelum dikembalikan.

Cobalah di Ideone

TheBikingViking
sumber
1

JavaScript 210 byte

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

Fungsi anonim mengambil dua parameter s dan p di mana

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

Setelah menetapkan fungsi ke variabel dan beberapa membongkar), itu dapat diuji sebagai

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

dimana

  • cadalah fungsi untuk menguji skonsonan pada posisi i.
  • r mengevaluasi ke 0 untuk memulai dengan vokal, 1 untuk memulai dengan konsonan tipe A dan 2 untuk memulai dengan konsonan tipe B (diuji dalam urutan terbalik).
  • Sedikit bashing dalam pernyataan pengembalian menyatukannya.
traktor53
sumber