Liệt kê các trường hợp của hai danh từ Phần Lan


10

Giới thiệu

Trong thử thách này, nhiệm vụ của bạn là liệt kê chính xác các trường hợp của hai danh từ Phần Lan. Vấn đề là bạn có thể sử dụng một trong các danh sách làm hướng dẫn để tạo danh sách khác.

Danh từ

Chúng tôi sử dụng hai bảng từ chối sau đây làm dữ liệu của chúng tôi. Họ liệt kê các trường hợp của hai danh từ, một trường hợp trên mỗi dòng theo thứ tự như trong bài viết Wikipedia được liên kết ở trên, dưới dạng số ít: số nhiều khi áp dụng.

Bảng 1: Các trường hợp ovi ("cửa")

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

Bảng 2: Các trường hợp của jalka ("chân")

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

Nhiệm vụ

Nhiệm vụ của bạn là viết hai chương trình fg(có thể với các tên khác nhau) lấy một chuỗi làm đầu vào, đưa ra một chuỗi làm đầu ra và có thuộc tính sau. Nếu Bảng 1 được đưa vào flàm đầu vào, nó sẽ xuất Bảng 2 và nếu Bảng 2 được đưa ra g, nó sẽ xuất Bảng 1. Tất cả các đầu vào khác dẫn đến hành vi không xác định. Các bảng phải xuất hiện chính xác như trên trong cả đầu vào và đầu ra. Bạn có thể tùy ý giả định rằng có một dòng mới, nhưng sau đó nó phải được sử dụng trong cả hai bảng và trong cả đầu vào và đầu ra. Không có dòng mới trước.

Quy tắc và tiền thưởng

Bạn có thể viết fglà một trong hai chức năng hoặc chương trình đầy đủ, nhưng chúng phải cùng loại và chúng phải hoàn toàn tách biệt (nếu bạn viết một hàm trợ giúp cho f, bạn phải viết lại gnếu bạn muốn sử dụng nó ở đó) . Tổng số byte chiến thắng thấp nhất và các sơ hở tiêu chuẩn không được phép.

phần thưởng -25% cho việc không sử dụng biểu thức thông thường.

Một số làm rõ

Hoàn toàn ổn khi viết một hàm / chương trình fbỏ qua đầu vào của nó và luôn trả về Bảng 2, và một hàm / chương trình gluôn trả về Bảng 1. Chỉ yêu cầu điều đó và ; hành vi của và trên tất cả các đầu vào khác là không liên quan.f(Table 1) == Table 2g(Table 2) == Table 1fg

Phần "hoàn toàn riêng biệt" có nghĩa như sau. Câu trả lời của bạn cung cấp hai đoạn mã, một cho fvà một cho g, tốt nhất là trong các hộp mã khác nhau. Nếu tôi đặt mã cho fmột tệp và chạy nó, nó sẽ hoạt động và tương tự cho g. Điểm của bạn là tổng số byte của hai đoạn mã. Bất kỳ mã trùng lặp được tính hai lần.


if Table 1 is given `f` as inputLàm thế nào để một đầu vào một chức năng vào một bảng? Tôi không hiểu phần này

@Raticsity "Nếu Bảng 1 được đưa vào f làm đầu vào"
Zgarb 24/2/2015

Câu trả lời:


5

Perl, 105 + 54 = 159

Chương trình f(thử tôi ):

#!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/

Chương trình g(thử tôi ):

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

Một phiên bản thay thế f, chỉ dài hơn 2 byte (phương pháp này cũng có thể được áp dụng gnhưng nó sẽ quá dài):

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

Về mặt kỹ thuật, điều này vẫn sử dụng một biểu thức chính quy (để giải mã chuỗi thay thế và sau đó áp dụng chúng) vì vậy tôi không thể yêu cầu phần thưởng ở đây.


Wow, làm việc tốt với s/jalk?o?/ov/g! Đó là một người mạnh mẽ.
Sp3000

4

Perl, 131 + 74 = 205

Bảng 1 đến Bảng 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

Mở rộng:

$_=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

Bảng 2 đến Bảng 1

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

Mở rộng:

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

(Cảm ơn @nutki về một số mẹo Perl)

Bất chấp hình phạt về regexes, tôi vẫn quyết định giải quyết nó và học Perl khi tôi ở đó. Tôi giả sử có một số thủ thuật Perl có thể cho phép tôi thay thế chuỗi, nhưng tôi không thể tìm thấy bất kỳ thủ thuật tìm kiếm trực tuyến nào.

Việc chuyển từ bảng ovi sang bảng jalka khó hơn nhiều , điều mà tôi đoán là do bảng jalka có thêm các sắc thái để làm cho các từ dễ phát âm hơn.


Đây là bảng thay thế tôi đang làm việc:

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

2

Python 2, 371 - 25% = 278

Khi bảng 1 là đầu vào cho hàm f, nó trả về bảng 2. Nếu đầu vào không phải là bảng 1, thì đầu ra của nó không được xác định (tuy nhiên có thể nhưng không được đảm bảo để trả về bảng 2). Ví dụ, gọi f(9**9**9**9)có thể sẽ không trả về bảng 2.

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

Logic tương tự được sử dụng với hàm g:

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

Các chức năng là độc lập.


0

Con trăn - 462 - 25% = 346,5

Chương trình này thực hiện cách tiếp cận trực tiếp, rõ ràng ngoại trừ một vài thủ thuật đánh gôn dữ liệu. Đối với hành vi không xác định, nó in bảng giống như hành vi được xác định. Thật là một "sự trùng hợp" đáng kinh ngạc! :)

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

Bây giờ, nếu người ta xem xét sự gian lận này (đúng rồi), tôi có thể tuân theo tinh thần của các quy tắc để có thêm 20 ký tự = 482 - 25% = 361,5 . Chỉ cần thay thế hai dòng cuối cùng bằng:

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

Điều này sẽ làm cho hành vi không xác định trả về không phải là bảng chính xác mà là bảng đầu vào.


Hoàn toàn ổn khi luôn trả lại cùng một bảng. Tuy nhiên, thách thức nói rằng tất cả các mã được sử dụng để xác định các hàm phải tách biệt (điều này có thể hơi mơ hồ, tôi sẽ cố gắng làm rõ nó). Cụ thể, bạn không thể xác định xytrong một biểu thức, và sử dụng một trong fvà một biểu thức khác trong y.
Zgarb

"trong y" -> "trong g"
Zgarb

0

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

Cách tiếp cận trực tiếp.

Chỉnh sửa: Sửa lỗi và sử dụng thủ thuật thay thế từ @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

Chạy từ cửa sổ ngay lập tức:

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

Bạn sẽ không phải kiểm tra xem ký tự đầu tiên là 'o' hay 'j'?
Claudiu

@Claudiu Thật ra, không cần phải kiểm tra gì cả; các hàm bỏ qua đầu vào của chúng và luôn trả về cùng một bảng là các câu trả lời hợp lệ. Tôi sẽ làm rõ điều đó trong thử thách.
Zgarb

@Claudiu Tôi đã nghĩ về điều đó, nhưng nếu ai đó chạy nó bằng cách vượt qua "o" thì sao?
phrebh

@Zgarb Có vẻ như bạn nghĩ rằng các chức năng của tôi đang bỏ qua đầu vào của chúng, mà chúng không (về mặt kỹ thuật). Không có bản dịch của các nhân vật, mặc dù.
phrebh

Không, tôi chỉ nói rằng họ có thể đơn giản bỏ qua đầu vào của họ và vẫn hợp lệ.
Zgarb

0

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

Bắt đầu đơn giản. Các chức năng bỏ qua tham số đầu vào ở tất cả.
Sử dụng chia / nối thay vì thay thế để tránh các biểu thức thông thường.

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

Kiểm tra trong bảng điều khiển Firefox / 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
lò: ovien
lò: ovet
ovea: ovia
ovessa: ovissa
ovesta: ovista
oveen: oviin
ovella: Ovilla
ovelta: ovilta
ovelle: oville
ovena: ovina
oveksi: oviksi
ovin
ovetta: ovitta
cừu

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.