Daftar Kasus Dua Kata Bahasa Finlandia

10

pengantar

Dalam tantangan ini, tugas Anda adalah membuat daftar kasus dua kata benda Finlandia dengan benar. Twist adalah bahwa Anda dapat menggunakan salah satu daftar sebagai panduan untuk menghasilkan yang lain.

The Nouns

Kami menggunakan dua tabel deklinasi berikut sebagai data kami. Mereka mencantumkan case dari dua kata benda, satu case per baris dalam urutan yang sama seperti pada artikel Wikipedia yang terhubung di atas, dalam bentuk singular: jamak jika dapat diterapkan.

Tabel 1: Kasus ovi ("pintu")

ovi : ovet
oven : ovien
oven : ovet
ovea : ovia
ovessa : ovissa
ovesta : ovista
oveen : oviin
ovella : ovilla
ovelta : ovilta
ovelle : oville
ovena : ovina
oveksi : oviksi
ovin
ovetta : ovitta
ovine

Tabel 2: Kasus jalka ("kaki")

jalka : jalat
jalan : jalkojen
jalan : jalat
jalkaa : jalkoja
jalassa : jaloissa
jalasta : jaloista
jalkaan : jalkoihin
jalalla : jaloilla
jalalta : jaloilta
jalalle : jaloille
jalkana : jalkoina
jalaksi : jaloiksi
jaloin
jalatta : jaloitta
jalkoine

Tugas

Tugas Anda adalah menulis dua program fdan g(mungkin dengan nama berbeda) yang mengambil satu string sebagai input, memberikan satu string sebagai output, dan memiliki properti berikut. Jika Tabel 1 diberikan fsebagai input, output Tabel 2, dan jika Tabel 2 diberikan g, output Tabel 1. Semua input lainnya menghasilkan perilaku yang tidak ditentukan. Tabel harus muncul persis seperti di atas dalam input dan output. Anda dapat secara opsional berasumsi bahwa ada baris baru yang tertinggal, tetapi kemudian harus digunakan di kedua tabel, dan dalam input dan output. Tidak ada baris sebelumnya.

Aturan dan Bonus

Anda dapat menulis fdan gsebagai salah satu fungsi atau program penuh, tetapi mereka harus dari jenis yang sama, dan mereka harus benar-benar terpisah (jika Anda menulis fungsi pembantu f, Anda harus menuliskannya kembali gjika Anda ingin menggunakannya di sana) . Jumlah total byte terendah menang, dan celah standar tidak diizinkan.

Ada bonus -25% untuk tidak menggunakan ekspresi reguler.

Beberapa Klarifikasi

Sangatlah baik untuk menulis fungsi / program fyang mengabaikan inputnya dan selalu mengembalikan Tabel 2, dan fungsi / program gyang selalu mengembalikan Tabel 1. Hanya diperlukan itu dan ; perilaku dan pada semua input lainnya tidak relevan.f(Table 1) == Table 2g(Table 2) == Table 1fg

Bagian "sepenuhnya terpisah" berarti yang berikut ini. Jawaban Anda memberikan dua bagian kode, satu untuk fdan satu untuk g, lebih disukai dalam kotak kode yang berbeda. Jika saya menaruh kode untuk fdalam file dan menjalankannya, itu berfungsi, dan sama untuk g. Skor Anda adalah jumlah jumlah byte dari dua bagian kode. Kode duplikat dihitung dua kali.

Zgarb
sumber
if Table 1 is given `f` as inputBagaimana cara seseorang memasukkan fungsi ke dalam tabel? Saya tidak mengerti bagian ini
@Reticality "Jika Tabel 1 diberikan untuk f sebagai masukan"
Zgarb

Jawaban:

5

Perl, 105 + 54 = 159

Program f(coba saya ):

#!perl -p
s/vi /vka /;s/ve/va/g;s/en/an/;s/vi/voi/;s/ov/1&34960>>$.?jalk:jal/eg;s/ii/ihi/;s/loia/lkoje/;s/oia/oja/

Program g(coba saya ):

#!perl -p
s/jalk?o?/ov/g;s/va /vi /;s/va/ve/g;s/an/en/;y/jh/i/d

Versi alternatif f, hanya 2 byte lebih lama (metode ini juga dapat diterapkan gtetapi akan terlalu lama):

#!perl -p0
ka1a1a1koj1a1a1ka1koj1a1o0a1o0kaa2koih1a1o0a1o0a1o0ka1ko0a1o0o0a1o0ko=~s!\D+!"s/ov".'.'x$'."/jal$&/"!gree

Secara teknis ini masih menggunakan regexp (untuk memecahkan kode string substitusi dan kemudian menerapkannya) jadi saya tidak bisa mengklaim bonus di sini.

nutki
sumber
Wow, kerja bagus dengan s/jalk?o?/ov/g! Yang itu kuat.
Sp3000
4

Perl, 131 + 74 = 205

Tabel 1 hingga Tabel 2

$_=join"",<>;s/ee/kaa/;s/ii/koihi/;s/i(e|a)/koj$1/g;s/i(na|ne)/koi$1/g;s/v[ie](.?a| )/vka$1/g;s/vi/voi/g;s/ve/va/g;s/ov/jal/g;print

Diperluas:

$_=join"",<>;
s/ee/kaa/;
s/ii/koihi/;
s/i(e|a)/koj$1/g;
s/i(na|ne)/koi$1/g;
s/v[ie](.?a| )/vka$1/g;
s/vi/voi/g;
s/ve/va/g;
s/ov/jal/g;
print

Tabel 2 hingga Tabel 1

$_=join"",<>;s/aan/aen/;s/jal(ka\b|oi|ko[ij]h?)/ovi/g;s/jalk?a/ove/g;print

Diperluas:

$_=join"",<>;
s/aan/aen/;
s/jal(ka\b|oi|ko[ij]h?)/ovi/g;
s/jalk?a/ove/g;
print

(Terima kasih kepada @nutki untuk beberapa tips Perl)

Terlepas dari hukuman pada regex, saya memutuskan untuk tetap melakukannya dan belajar Perl saat saya masih di sana. Saya berasumsi ada beberapa trik Perl yang mungkin membuat saya mengganti rantai, tetapi saya tidak dapat menemukannya di pencarian cepat saya secara online.

Jauh lebih sulit untuk beralih dari tabel ovi ke tabel jalka , yang saya duga adalah karena tabel jalka memiliki nuansa tambahan untuk membuat kata-kata lebih mudah diucapkan.


Ini meja pengganti tempat saya bekerja:

i <-> ka
--------
ov i               jal ka

e <-> ka
--------
ov e a             jal ka a
ov e na            jal ka na

e <-> a
-------
ov e t             jal a t
ov e n             jal a n
ov e ssa           jal a ssa
ov e sta           jal a sta
ov e lla           jal a lla
ov e lta           jal a lta
ov e lle           jal a lle
ov e ksi           jal a ksi
ov e tta           jal a tta

i <-> oi
--------
ov i ssa           jal oi ssa
ov i sta           jal oi sta
ov i lla           jal oi lla
ov i lta           jal oi lta
ov i lle           jal oi lle
ov i ksi           jal oi ksi
ov i n             jal oi n
ov i tta           jal oi tta

i <-> koi
---------
ov i na            jal koi na
ov i ne            jal koi ne

i <-> koj
---------
ov i en            jal koj en
ov i a             jal koj a

i <-> koih
------------
ov i in            jal koih in

ee <-> kaa
----------
ov ee n            jal kaa n
Sp3000
sumber
2

Python 2, 371 - 25% = 278

Ketika tabel 1 adalah input untuk berfungsi f, ia mengembalikan tabel 2. Jika input bukan tabel 1, outputnya tidak ditentukan (namun kemungkinan tetapi tidak dijamin untuk mengembalikan tabel 2). Misalnya, panggilan f(9**9**9**9)mungkin tidak akan mengembalikan tabel 2.

f=lambda a:'jalkaBatAanBkojenAanBatAkaaBkojaAassaBoissaAastaBoistaAkaanBkoihinAallaBoillaAaltaBoiltaAalleBoilleAkanaBkoinaAaksiBoiksiAoinAattaBoittaAkoine'.replace('A','\njal').replace('B',' : jal')

Logika yang sama digunakan dengan fungsi g:

g=lambda a:'oviBetAenBienAenBetAeaBiaAessaBissaAestaBistaAeenBiinAellaBillaAeltaBiltaAelleBilleAenaBinaAeksiBiksiAinAettaBittaAine'.replace('A','\nov').replace('B',' : ov')

Fungsinya independen.

Ksatria Logika
sumber
0

Python - 462 - 25% = 346.5

Program ini melakukan pendekatan langsung yang jelas kecuali beberapa trik golf data. Untuk perilaku yang tidak terdefinisi, ia mencetak tabel seperti perilaku yang didefinisikan. Benar-benar "kebetulan" yang menakjubkan! :)

x,y="""ovi:ovet
oven:ovien
oven:ovet
ovea:ovia
ovessa:ovissa
ovesta:ovista
oveen:oviin
ovella:ovilla
ovelta:ovilta
ovelle:oville
ovena:ovina
oveksi:oviksi
ovin
ovetta:ovitta
ovineXjalka:jalat
jalan:jalkojen
jalan:jalat
jalkaa:jalkoja
jalassa:jaloissa
jalasta:jaloista
jalkaan:jalkoihin
jalalla:jaloilla
jalalta:jaloilta
jalalle:jaloille
jalkana:jalkoina
jalaksi:jaloiksi
jaloin
jalatta:jaloitta
jalkoine""".replace(':',' : ').split('X')
f=lambda n:y
g=lambda n:x

Sekarang, jika seseorang mempertimbangkan kecurangan ini (ya benar), saya dapat mengikuti semangat aturan untuk 20 karakter lagi = 482 - 25% = 361.5 . Cukup ganti dua baris terakhir dengan:

f=lambda n:[x,y][n==x]
g=lambda n:[y,x][n==y]

Ini akan membuat perilaku yang tidak didefinisikan kembali bukan tabel yang benar tetapi tabel input.

Maltysen
sumber
Tidak apa-apa untuk selalu mengembalikan tabel yang sama. Namun, tantangannya menyatakan bahwa semua kode yang digunakan untuk mendefinisikan fungsi harus terpisah (ini mungkin sedikit ambigu, saya akan mencoba menjelaskannya). Secara khusus, Anda tidak dapat menentukan xdan ydalam satu ekspresi, dan menggunakan satu di fdan yang lain dalam y.
Zgarb
"in y" -> "in g"
Zgarb
0

VBA 1204 (1605 - 25%) 1191 (1587 - 25%)

Pendekatan langsung.

Sunting: Bug yang diperbaiki dan trik ganti bekas dari @Maltysen

Function f(s)
    If Replace(s, " : ", ":") = "ovi:ovet" & vbLf & "oven:ovien" & vbLf & "oven:ovet" & vbLf & "ovea:ovia" & vbLf & "ovessa:ovissa" & vbLf & "ovesta:ovista" & vbLf & "oveen:oviin" & vbLf & "ovella:ovilla" & vbLf & "ovelta:ovilta" & vbLf & "ovelle:oville" & vbLf & "ovena:ovina" & vbLf & "oveksi:oviksi" & vbLf & "ovin" & vbLf & "ovetta:ovitta" & vbLf & "ovine" Then f = Replace("jalka:jalat" & vbLf & "jalan:jalkojen" & vbLf & "jalan:jalat" & vbLf & "jalkaa:jalkoja" & vbLf & "jalassa:jaloissa" & vbLf & "jalasta:jaloista" & vbLf & "jalkaan:jalkoihin" & vbLf & "jalalla:jaloilla" & vbLf & "jalalta:jaloilta" & vbLf & "jalalle:jaloille" & vbLf & "jalkana:jalkoina" & vbLf & "jalaksi:jaloiksi" & vbLf & "jaloin" & vbLf & "jalatta:jaloitta" & vbLf & "jalkoine", ":", " : ")
End Function

Function g(s)
    If Replace(s, " : ", ":") = "jalka:jalat" & vbLf & "jalan:jalkojen" & vbLf & "jalan:jalat" & vbLf & "jalkaa:jalkoja" & vbLf & "jalassa:jaloissa" & vbLf & "jalasta:jaloista" & vbLf & "jalkaan:jalkoihin" & vbLf & "jalalla:jaloilla" & vbLf & "jalalta:jaloilta" & vbLf & "jalalle:jaloille" & vbLf & "jalkana:jalkoina" & vbLf & "jalaksi:jaloiksi" & vbLf & "jaloin" & vbLf & "jalatta:jaloitta" & vbLf & "jalkoine" Then f = Replace("ovi:ovet" & vbLf & "oven:ovien" & vbLf & "oven:ovet" & vbLf & "ovea:ovia" & vbLf & "ovessa:ovissa" & vbLf & "ovesta:ovista" & vbLf & "oveen:oviin" & vbLf & "ovella:ovilla" & vbLf & "ovelta:ovilta" & vbLf & "ovelle:oville" & vbLf & "ovena:ovina" & vbLf & "oveksi:oviksi" & vbLf & "ovin" & vbLf & "ovetta:ovitta" & vbLf & "ovine", ":", " : ")
End Function

Jalankan dari jendela Segera:

msgbox f("ovi : ovet" & vbLf & "oven : ovien" & vbLf & "oven : ovet" & vbLf & "ovea : ovia" & vbLf & "ovessa : ovissa" & vbLf & "ovesta : ovista" & vbLf & "oveen : oviin" & vbLf & "ovella : ovilla" & vbLf & "ovelta : ovilta" & vbLf & "ovelle : oville" & vbLf & "ovena : ovina" & vbLf & "oveksi : oviksi" & vbLf & "ovin" & vbLf & "ovetta : ovitta" & vbLf & "ovine")
phrebh
sumber
Bukankah Anda hanya perlu memeriksa apakah karakter pertama adalah 'o' atau 'j'?
Claudiu
@Claudiu Sebenarnya, tidak perlu memeriksa apa pun; fungsi yang mengabaikan input mereka dan selalu mengembalikan tabel yang sama adalah jawaban yang valid. Saya akan menjelaskannya dalam tantangan.
Zgarb
@Cudiudiu saya memikirkan hal itu, tetapi bagaimana jika seseorang menjalankannya dengan melewati "o"?
phrebh
@ Zgarb Sepertinya Anda berpikir fungsi saya mengabaikan input mereka, yang sebenarnya bukan (secara teknis). Tidak ada terjemahan karakter.
phrebh
Tidak, saya hanya mengatakan bahwa mereka dapat mengabaikan input mereka dan masih valid.
Zgarb
0

JavaScript (ES6) 271 (165 + 196 -25%)

Mulai dari yang sederhana. Fungsi mengabaikan parameter input sama sekali.
Menggunakan split / join alih-alih ganti untuk menghindari ekspresi reguler.

g=_=>'ovi1et0n1ien0n1et0a1ia0ssa1issa0sta1ista0en1iin0lla1illa0lta1ilta0lle1ille0na1ina0ksi1iksi\novin0tta1itta\novine'
.split(0).join('\nove').split(1).join(' : ov')
f=_=>'jalka1at0an1kojen0an1at0kaa1koja0assa1oissa0asta1oista0kaan1koihin0alla1oilla0alta1oilta0alle1oille0kana1koina0aksi1oiksi0oin0atta1oitta0koine'
.split(0).join('\njal').split(1).join(' : jal')

Uji di Firefox / konsol FireBug

console.log(f('ovi : ovet\noven : ovien\noven : ovet\novea : ovia\novessa : ovissa\novesta : ovista\noveen : oviin\novella : ovilla\novelta : ovilta\novelle : oville\novena : ovina\noveksi : oviksi\novin\novetta : ovitta\novine'))

jalka: jalat
jalan: jalkojen
jalan: jalat
jalkaa: jalkoja
jalassa: jaloissa
jalasta: jaloista
jalkaan: jalkoihin
jalalla: jaloilla
jalalta: jaloilta
jalalle: jaloille
jalkana: jalkoina
jalaksi: jaloiksi
jaloin
jalatta: jaloitta
jalkoine

console.log(g("jalka : jalat\njalan : jalkojen\njalan : jalat\njalkaa : jalkoja\njalassa : jaloissa\njalasta : jaloista\njalkaan : jalkoihin\njalalla : jaloilla\njalalta : jaloilta\njalalle : jaloille\njalkana : jalkoina\njalaksi : jaloiksi\njaloin\njalatta : jaloitta\njalkoine"))

ovi: ovet
oven: ovien
oven: ovet
ovea: ovia
ovessa: ovissa
ovesta: ovista
oveen: oviin
ovella: ovilla
ovelta: ovilta
ovelle: oville
ovena: ovina
oveksi: oviksi
ovin
ovetta: ovitta
ovine

edc65
sumber