İki Fin İsminin Vakalarını Listele


10

Giriş

Bu zorlukta, göreviniz iki Fin isminin vakalarını doğru bir şekilde listelemektir . Büküm, listelerden birini diğerini üretmek için kılavuz olarak kullanabilmenizdir.

İsimler

Verilerimiz olarak aşağıdaki iki sapma tablosunu kullanıyoruz. Bunlar, her satırda bir vaka olmak üzere, yukarıda adı geçen Wikipedia makalesindekiyle aynı sırayla, tekil formda olmak üzere iki ismin vakasını listeler : varsa çoğul .

Tablo 1: Ovi vakaları ("kapı")

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

Tablo 2: Jalka vakaları ("ayak")

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

Görev

Göreviniz, girdi olarak bir dizeyi alan, bir dizeyi çıktı olarak veren ve aşağıdaki özelliğe sahip iki program fve g(muhtemelen farklı adlarla) yazmaktır . Tablo 1'e fgiriş olarak verilirse , Tablo 2'yi verir ve Tablo 2'ye verilirse g, Tablo 1'i verir. Diğer tüm girdiler tanımlanmamış davranışla sonuçlanır. Tablolar , hem giriş hem de çıkışta tam olarak yukarıdaki gibi görünmelidir . İsteğe bağlı olarak bir satırsonu satırı olduğunu varsayabilirsiniz, ancak daha sonra her iki tabloda ve hem giriş hem de çıkışta kullanılması gerekir. Önceki satırsonu yok.

Kurallar ve Bonuslar

İşlevler veya tam programlar olarak yazabilir fve gaynı türden olmaları gerekir ve tamamen ayrı olmalıdırlar (için bir yardımcı işlev fyazarsanız, gorada kullanmak istiyorsanız yeniden yazmanız gerekir ) . En düşük toplam bayt sayısı kazanır ve standart boşluklara izin verilmez.

Normal ifadeler kullanmamanız için % -25 bonus vardır .

Bazı Açıklamalar

Bu bir fonksiyon / program yazmaya herhangi bir sorun oluşturmaz fgirişini yok sayar ve hep Tablo 2 döndürür ve bir fonksiyon / program gher zaman sadece o gerekmektedir Tablo 1. döndürür ve ; diğer tüm girdilerin ve diğer girdilerin davranışı önemsizdir.f(Table 1) == Table 2g(Table 2) == Table 1fg

"Tamamen ayrı" kısım şu anlama gelir. Cevabınız, biri farklı fdiğeri gtercihen farklı kod kutularında olmak üzere iki kod parçası sağlar. Eğer kodu fbir dosyaya koyar ve çalıştırırsam, aynı şekilde çalışır g. Puanınız, iki kod parçasının bayt sayımlarının toplamıdır. Yinelenen kodlar iki kez sayılır.


if Table 1 is given `f` as inputBir tabloya nasıl fonksiyon girer? Bu kısmı anlamıyorum

"Tablo 1 verilirse @Reticality için f girdi olarak"
Zgarb

Yanıtlar:


5

Perl, 105 + 54 = 159

Programı f(deneyin beni ):

#!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(deneyin beni ):

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

Alternatif bir sürümü f, sadece 2 bayt daha uzun (bu yöntem de uygulanabilir, gancak çok uzun olurdu):

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

Teknik olarak bu hala (ikame dizesini çözmek ve sonra bunları uygulamak için) regexp kullanır, bu yüzden burada bonus talep edemez.


Vay, iyi iş çıkardın s/jalk?o?/ov/g! Bu güçlü.
Sp3000

4

Perl, 131 + 74 = 205

Tablo 1'den Tablo 2'ye

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

Expanded:

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

Tablo 2 - Tablo 1

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

Expanded:

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

(Bazı Perl ipuçları için @nutki'ye teşekkürler)

Regexes cezaya rağmen, yine de mücadele etmeye ve ben Perl öğrenmeye karar verdim. Değiştirmeleri zincirlememe izin verebilecek bazı Perl hileleri olduğunu varsayıyorum, ancak çevrimiçi hızlı aramamda herhangi bir şey bulamadım.

Bu gitmek çok daha zor ovi masaya jalka çünkü hangi ben tahmin ediyorum, masanın jalka tablo okunur kelimeler kolaylaştırmak için ek nüansları vardır.


İşte çalıştığım yedek tablo:

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

Tablo 1, f işlevinin girdisi olduğunda tablo 2'yi döndürür. Giriş tablo 1 değilse, çıktı tanımsızdır (ancak tablo 2'yi döndürmesi olasıdır, ancak garanti edilemez). Örneğin, çağrı f(9**9**9**9)büyük olasılıkla tablo 2 döndürmez.

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

Aynı mantık g fonksiyonu ile kullanılır:

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

Fonksiyonlar bağımsızdır.


0

Python - 462-25% = 346.5

Bu program, birkaç veri golf hilesi dışında bariz, doğrudan bir yaklaşım yapar. Tanımlanmamış davranış için, tabloyu tanımlanmış davranış gibi yazdırır. Ne muhteşem bir "tesadüf"! :)

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

Şimdi, bu hile yapmayı düşünürsek (evet doğru), 20 karakter daha = 482 -% 25 = 361.5 için kuralların ruhunu takip edebilirim . Son iki satırı şu şekilde değiştirin:

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

Bu, tanımlanmamış davranışın doğru tabloyu değil girdi tablosunu döndürmesini sağlar.


Her zaman aynı tabloyu iade etmek gayet iyi. Ancak, meydan okuma işlevleri tanımlamak için kullanılan tüm kod ayrı olması gerektiğini belirtir (bu biraz belirsiz olabilir, açıklığa kavuşturmak çalışacağım). Özellikle, tanımlayamazsınız xve ybir ifade ve bir tane kullanma fve diğer in y.
Zgarb

"in y" -> "in g"
Zgarb

0

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

Doğrudan yaklaşım.

Düzenleme: Düzeltildi hata ve @Maltysen gelen hile yerine kullanılır

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

Anlık pencereden çalıştır:

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

Sadece ilk karakterin 'o' ya da 'j' olup olmadığını kontrol etmeniz gerekmez mi?
Claudiu

@Claudiu Aslında, hiçbir şeyi kontrol etmeye gerek yok; girişlerini yok sayan ve her zaman aynı tabloyu döndüren fonksiyonlar geçerli cevaplardır. Bunu meydan okumada açıklığa kavuşturacağım.
Zgarb

@Claudiu Bunu düşündüm, ama eğer birisi "o" 'yu ​​geçerek çalıştırırsa?
phrebh

@Zgarb Görünüşe göre işlevlerim (teknik olarak) olmayan girdilerini görmezden geliyorlar. Yine de karakter çevirisi yok.
phrebh

Hayır, sadece girdilerini görmezden gelebileceklerini ve hala geçerli olabileceklerini söylüyorum .
Zgarb

0

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

Basit başlangıç. Fonksiyonlar giriş parametresini hiç dikkate almaz.
Normal ifadelerden kaçınmak için, yerine split / join komutunu kullanın.

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

Firefox / FireBug konsolunda test edin

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
jalkaan: jalkoihin
jalalla: jaloilla
jalalta: jaloilta
jalalle: jaloille
jalkkaan: jalkoihin
jalalla: jaloilla
jalalta:
jaloilta
jalalle: jaloille
jalkkaan : jalkoihin

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
fırın: ovien
fırın: ovet
ovea: ovia
ovessa: ovissa
ovesta: ovista
oveen: oviin
ovella: ovilla
ovelta: ovilta
ovelle: oville
fırın: ovina
oveksi: oviksi
ovin
ovetta: ovitta
ovine

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.