เขียนรายการคำนามสองกรณีของฟินแลนด์


10

บทนำ

ในการท้าทายนี้งานของคุณคือการแสดงรายการได้อย่างถูกต้องกรณีของทั้งสองคำนามฟินแลนด์ ความบิดคือคุณอาจใช้หนึ่งในรายชื่อเป็นแนวทางในการผลิตอื่น ๆ

คำนาม

เราใช้ตารางการปฏิเสธสองตัวต่อไปนี้เป็นข้อมูลของเรา พวกเขาแสดงรายการกรณีของคำนามสองคำหนึ่งกรณีต่อบรรทัดตามลำดับเดียวกับในบทความ Wikipedia ที่ลิงก์ด้านบนในรูปแบบเอกพจน์: พหูพจน์ที่เกี่ยวข้อง

ตารางที่ 1: กรณีของovi ("ประตู")

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

ตารางที่ 2: กรณีของjalka ("เท้า")

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

งาน

งานของคุณคือการเขียนโปรแกรมสองโปรแกรมfและg(อาจมีชื่อแตกต่างกัน) ที่รับหนึ่งสตริงเป็นอินพุตให้หนึ่งสตริงเป็นเอาต์พุตและมีคุณสมบัติต่อไปนี้ หากตารางที่ 1 ถูกกำหนดให้fเป็นอินพุตเอาต์พุตจะเป็นตารางที่ 2 และหากให้ตารางที่ 2 กับgมันก็จะส่งออกตารางที่ 1 อินพุตอื่นทั้งหมดส่งผลให้เกิดพฤติกรรมที่ไม่ได้กำหนดไว้ ตารางจะต้องปรากฏว่าข้างต้นทั้งเข้าและส่งออก คุณอาจเลือกที่จะสมมติว่ามีการขึ้นบรรทัดใหม่ แต่จะต้องใช้ในทั้งสองตารางและในทั้งอินพุตและเอาต์พุต ไม่มีการขึ้นบรรทัดใหม่ก่อนหน้านี้

กฎและโบนัส

คุณสามารถเขียนfและgเป็นทั้งฟังก์ชั่นหรือโปรแกรมเต็มรูปแบบ แต่จะต้องเป็นประเภทเดียวกันและพวกเขาจะต้องแยกจากกันอย่างสมบูรณ์ (ถ้าคุณเขียนฟังก์ชั่นผู้ช่วยสำหรับfคุณต้องเขียนใหม่ในgถ้าคุณต้องการใช้ที่นั่น) . จำนวนไบต์ทั้งหมดต่ำสุดที่ชนะและช่องโหว่มาตรฐานไม่ได้รับอนุญาต

มีโบนัส -25%สำหรับการไม่ใช้นิพจน์ทั่วไป

ชี้แจงบางอย่าง

เป็นการดีที่จะเขียนฟังก์ชัน / โปรแกรมfที่ละเว้นอินพุตและส่งคืนตารางที่ 2 เสมอและฟังก์ชัน / โปรแกรมgที่ส่งกลับตารางที่ 1 เสมอมันจำเป็นเท่านั้นและ; พฤติกรรมของและในปัจจัยการผลิตอื่น ๆ ที่ไม่เกี่ยวข้องf(Table 1) == Table 2g(Table 2) == Table 1fg

ส่วน "สมบูรณ์แยก" หมายถึงสิ่งต่อไปนี้ คำตอบของคุณมีรหัสสองส่วนหนึ่งสำหรับfหนึ่งสำหรับgในรหัสกล่องที่แตกต่างกัน ถ้าฉันใส่รหัสสำหรับในแฟ้มและเรียกมันทำงานและเหมือนกันสำหรับf gคะแนนของคุณคือผลรวมของจำนวนไบต์ของโค้ดสองชิ้น รหัสซ้ำใด ๆ จะถูกนับสองครั้ง


if Table 1 is given `f` as inputหนึ่งใส่ฟังก์ชั่นลงในตารางได้อย่างไร ฉันไม่เข้าใจส่วนนี้

@R สัจนิยม "ถ้าตารางที่ 1 ถูกกำหนดให้ fเป็นอินพุต"
Zgarb

คำตอบ:


5

Perl, 105 + 54 = 159

โปรแกรมf(ลองฉัน ):

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

โปรแกรมg(ลองฉัน ):

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

อีกทางเลือกหนึ่งมีความfยาวเพียง 2 ไบต์ (วิธีนี้สามารถนำไปใช้ได้gแต่จะยาวเกินไป):

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

ในทางเทคนิคสิ่งนี้ยังคงใช้ regexp (เพื่อถอดรหัสสตริงการแทนที่แล้วนำไปใช้) ดังนั้นฉันไม่สามารถรับโบนัสได้ที่นี่


ว้าวทำงานได้ดีด้วยs/jalk?o?/ov/g! พลังอันนั้น
Sp3000

4

Perl, 131 + 74 = 205

ตารางที่ 1 ถึงตารางที่ 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

ขยาย:

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

ตารางที่ 2 ถึงตารางที่ 1

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

ขยาย:

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

(ขอบคุณ @nutki สำหรับเคล็ดลับ Perl บางส่วน)

แม้จะมีบทลงโทษจาก regexes แต่ฉันก็ตัดสินใจที่จะเล่นมันต่อไปและเรียนรู้ Perl ในขณะที่ฉันอยู่ที่นั่น ฉันสมมติว่ามีเทคนิค Perl บางอย่างซึ่งอาจทำให้ฉันเปลี่ยนโซ่ได้ แต่ฉันไม่พบสิ่งใดในการค้นหาด่วนทางออนไลน์

มันยากกว่ามากที่จะไปจากตารางoviไปยังตารางjalkaซึ่งฉันเดาว่าเป็นเพราะตารางjalkaมีความแตกต่างเพิ่มเติมเพื่อให้คำพูดออกเสียงง่ายขึ้น


นี่คือตารางการแทนที่ที่ฉันกำลังทำงานอยู่:

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

เมื่อตารางที่ 1 เป็นอินพุตของฟังก์ชัน f มันจะส่งคืนตารางที่ 2 หากอินพุตไม่ใช่ตาราง 1 แสดงว่าเอาต์พุตไม่ได้ถูกกำหนด ตัวอย่างเช่นการโทรf(9**9**9**9)อาจจะไม่ส่งคืนตารางที่ 2

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

ตรรกะเดียวกันนี้ใช้กับฟังก์ชัน g:

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

ฟังก์ชั่นอิสระ


0

Python - 462 - 25% = 346.5

โปรแกรมนี้มีวิธีการที่ชัดเจนและตรงไปตรงมายกเว้นกลเม็ดข้อมูลกอล์ฟเล็กน้อย สำหรับพฤติกรรมที่ไม่ได้กำหนดมันพิมพ์ตารางเช่นเดียวกับพฤติกรรมที่กำหนดไว้ ช่างเป็นเรื่องบังเอิญที่น่าทึ่ง! :)

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

ตอนนี้ถ้าใครจะพิจารณาโกงนี้ (ใช่ขวา) ผมสามารถทำตามจิตวิญญาณของกฎมานาน 20 ตัวอักษร= 482-25% เพียงแทนที่สองบรรทัดสุดท้ายด้วย:

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

สิ่งนี้จะทำให้พฤติกรรมที่ไม่ได้กำหนดส่งคืนไม่ใช่ตารางที่ถูกต้อง แต่เป็นตารางอินพุต


มันสมบูรณ์แบบที่จะกลับมาที่โต๊ะเดิมเสมอ อย่างไรก็ตามความท้าทายระบุว่ารหัสทั้งหมดที่ใช้เพื่อกำหนดฟังก์ชั่นจะต้องแยกจากกัน (นี่อาจจะคลุมเครือเล็กน้อยฉันจะพยายามอธิบายให้ชัดเจน) โดยเฉพาะอย่างยิ่งคุณไม่สามารถกำหนดxและyในการแสดงออกและใช้อย่างใดอย่างหนึ่งในfและอื่น y
Zgarb

"ในy" -> "ในg"
Zgarb

0

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

วิธีการโดยตรง

แก้ไข: แก้ไขข้อผิดพลาดและใช้แทนที่เคล็ดลับจาก @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

เรียกใช้จากหน้าต่างทันที:

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

คุณไม่ต้องตรวจสอบว่าตัวละครตัวแรกคือ 'o' หรือ 'j' หรือไม่?
Claudiu

@Claudiu ที่จริงแล้วไม่จำเป็นต้องตรวจสอบอะไรเลย ฟังก์ชันที่ไม่สนใจอินพุตและส่งคืนตารางเดียวกันเสมอคือคำตอบที่ถูกต้อง ฉันจะชี้แจงว่าในการท้าทาย
Zgarb

@Claudiu ฉันคิดเกี่ยวกับเรื่องนี้ แต่ถ้ามีใครวิ่งโดยผ่าน "o"?
phrebh

@Zgarb ดูเหมือนว่าคุณคิดว่าฟังก์ชั่นของฉันไม่สนใจอินพุตของพวกเขาซึ่งมันไม่ใช่ (ในทางเทคนิค) แม้ว่าจะไม่มีการแปลตัวละคร
phrebh

ไม่ฉันแค่บอกว่าพวกเขาสามารถเพิกเฉยต่ออินพุตและยังใช้ได้
Zgarb

0

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

เริ่มต้นง่ายๆ ฟังก์ชั่นละเว้นพารามิเตอร์อินพุตเลย
การใช้แบ่ง / เข้าร่วมแทนการแทนที่เพื่อหลีกเลี่ยงการแสดงออกปกติ

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

ทดสอบในคอนโซล 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
jala jaalaala
ja ja
ja ja
ja: jaloa
jala jala
ja ja
ja ja
ja
ja ja
ja ja jala jala jala jala jala jala jala jala jala jala jala jala jala jala jala jala jala jala jala jala jala jala jala jala jala jala jala jala jala jalka jalka jalka jalka jalo

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: เตาอบ ovien
: ovet
ovea: ovia
ovessa: ovissa
ovesta: ovista
oveen: oviin
ovella: ovilla
ovelta: ovilla
ovelta: ovilta
ovina
: oviksi
ovin
ovina: ovitta
ovine

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.