핀란드어 명사 2 건 나열


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 : 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가 g출력 되고 , 표 2가로 제공되면 표 1이 출력됩니다. 다른 모든 입력은 정의되지 않은 동작을 초래합니다. 테이블은 입력 및 출력 모두에서 위와 동일 하게 표시되어야합니다 . 선택적으로 후행 줄 바꿈이 있다고 가정 할 수 있지만 두 테이블과 입력 및 출력 모두에서 사용해야합니다. 선행 줄 바꿈이 없습니다.

규칙 및 보너스

당신은 쓸 수 있습니다 fg중 하나의 기능 또는 전체 프로그램으로, 그러나 동일한 유형이어야합니다, 그들은 완전히 분리해야합니다 (당신을위한 도우미 함수를 작성하는 경우 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테이블에 함수를 어떻게 입력합니까? 이 부분을 이해하지 못합니다

@Reticality "표 1이 입력 으로 제공 f 되는 경우"
Zgarb

답변:


5

펄, 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

대체 버전 인 f2 바이트 만 더 길다 (이 방법도 적용 할 수 g있지만 너무 길다).

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

기술적으로 이것은 여전히 ​​정규 표현식을 사용하여 (대체 문자열을 디코딩 한 다음 적용) 보너스를 여기에서 주장 할 수 없습니다.


와, 잘 했어 s/jalk?o?/ov/g! 그 사람은 강력합니다.
Sp3000

4

펄, 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

(Perl 팁에 대해서는 @nutki에게 감사합니다)

정규 표현식에 대한 형벌에도 불구하고, 나는 어쨌든 그것을 다루고 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

파이썬 2, 371-25 % = 278

테이블 1이 함수 f에 대한 입력 인 경우 테이블 2를 리턴합니다. 입력이 테이블 1이 아닌 경우 출력이 정의되지 않습니다 (그러나 테이블 2를 리턴 할 가능성은 있지만 보장되지는 않음). 예를 들어, 호출 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

파이썬-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 % = 361.5 에 대해 규칙의 정신을 따를 수 있습니다 . 마지막 두 줄을 다음과 같이 바꾸십시오.

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

이렇게하면 정의되지 않은 동작이 올바른 테이블이 아니라 입력 테이블을 반환하게됩니다.


항상 같은 테이블을 반환하는 것이 좋습니다. 그러나 도전 과제는 함수를 정의하는 데 사용 된 모든 코드가 분리되어야한다고 말합니다 (약간 모호했을 수도 있습니다. 명확하게하려고 노력할 것입니다). 특히, 당신은 정의 할 수 없습니다 xy하나 개의 표현, 그리고에서 하나를 사용 f하고 다른의를 y.
Zgarb

"in y"-> "in 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 February

아니요, 단순히 입력을 무시하고 여전히 유효하다고 말할 있습니다.
Zgarb

0

자바 스크립트 (ES6) 271 (165 + 196-25 %)

간단하게 시작합니다. 이 함수는 입력 매개 변수를 전혀 무시합니다.
정규 표현식을 피하기 위해 바꾸기 대신 split / join을 사용하십시오.

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
잘란 : jalkojen
잘란 : 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
오븐 : ovien
오븐 : ovet
ovea : ovia
ovessa : ovissa
ovesta : ovista
oveen : oviin
ovella : ovilla
ovelta : ovilta
ovelle : oville
ovena : 라 부르고
oveksi : oviksi
ovin
ovetta : ovitta의
양의

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.