나는 프로그래밍 퍼즐, IL 코드 골프


21

배경

이탈리아어로 정의 된 기사 (영어에 해당 )는 7 가지 형태가 있습니다 : l ' , il , lo , gli , i , la , le . 사용할 변수는 세 가지 변수에 따라 다릅니다.

  • 성별 : 남성 / 여성.
  • 수 : 단수 / 복수
  • 다음 단어의 첫 글자 : 모음 / 자음 A 형 / 자음 B 형
    • 모음은 다음 중 하나입니다 : aeiou .
    • 자음 타입 B는, 어느 쪽의 경우이다 S- 다른 자음 다음 Z- , gn- , pn- , PS- , X- , I-가 모음 뒤에 (이 반모음 역할).
    • 자음 유형 A는 B 유형이 아닌 자음입니다.

표는 위의 세 가지 변수의 12 가지 조합 각각에 사용되는 기사 양식을 보여줍니다. 있습니다 L ' 형태가 하나의 견적 및 공백없이 다음 단어에 연결되어 있습니다.

여기에 이미지 설명을 입력하십시오

도전

입력 단어 하나 또는 두 개의 문자열 나타내는 숫자 또는 부울 번호 . (초기 문자는 입력 단어에서 가져와야합니다).

입력 단어는 소문자 ASCII 문자 시퀀스입니다. 악센트 모음은 악센트가없는 버전으로 바뀝니다 (예 : realtàrealta 로 입력 ).

성별 및 숫자 입력은 별도의 숫자, 부울 또는 문자열 또는 조합 된 문자열 (예 : 남성 단수의 경우 1, 여성 단수의 경우 2 등) 일 수 있습니다.

답변에 지정된 경우 적절한 형식과 구분 기호를 사용할 수 있습니다.

필요에 따라 공백이나 작은 따옴표를 사용 하여 기사의 적절한 형식 앞에 단어를 출력하십시오 . 출력도 소문자 여야합니다. 후행 또는 선행 공백이 허용됩니다.

코드 골프, 가장 짧은 승리.

테스트 사례

내가 입력 문자를 사용 다음에 m, f성별을 지정하고 s, p(이것은 단지 하나의 가능한 입력 형식입니다) 번호.

Input               Output              Comment

macchina f s        la macchina         Initial letter is cons. A
zio m s             lo zio              Initial letter is cons. B
libri m p           i libri             Initial letter is cons. A
ieri m s            lo ieri             Initial letter is cons. B
aquile f p          le aquile           Initial letter is vowel
spagnoli m p        gli spagnoli        Initial letter is cons. B
golf m s            il golf             Initial letter is cons. A
ombra f s           l'ombra             Initial letter is vowel
impossibili m p     gli impossibili     Initial letter is vowel

규칙적인 동사의 구성에 도전 할 수도 있습니다.
user6245072

@ user6245072 음, 이미 거기에 ... 차이는 아마 너무 작은 것
루이스 Mendo

1
사소한 기술적 하찮은 일로 괴로워 : / j는 / 보통이라고 반모음 영어가 아닌 semiconsonant . [k] ( lo chef , lo chardonnay )가 아닌 ʃch⟩ ( lo chef , lo chardonnay ), 프랑스어 이름 ( l' Havet but lo Hugo ) 과 같은 casesch⟩와 같은 엣지 케이스를 고려할 경우 솔루션이 어떻게 될지 궁금 합니다 . 화석화 된 형태 ( gli dei , per meno ), 성 (란 토니아 , 라 안토니 니 )으로 언급 된 여성 등. 골프 코드에는 매우 강력한 일이 될 것입니다.
Janus Bahs Jacquet

1
이탈리아어로 나는 당신 ieri이 명사가 아닌 부사이기 때문에 테스트 케이스를 벗도록 요청합니다 ! (BTW 공식적으로 정확했습니다) 제발!
Giacomo Garabello

1
우리 공식적으로 말합니다 : "Non pensare a ieri, Pensa a Domani"
Giacomo Garabello

답변:


7

망막 138 133 129 113 바이트

^.(s[^aeiou]|z|gn|pn|ps|x|i[aeiou])
B$&
^.[aeiou]
V$&
^\d.
A$&
V[02]
l'
A0
il 
B0
lo 
A1
i 
.1
gli 
.2
la 
.3
le 

테스트 스위트. ( %(G`\n모든 테스트 사례를 한 번에 실행하기 위해 미리 추가됨 )

입력 형식은 : macchina f s가됩니다 2macchina대신.

0: Masculine Singular
1: Masculine Plural
2: Feminine Singular
3: Feminine Plural

덕분에 변환 테이블 Kevin Lau .


4

파이썬 3.5, 238 (235) 192 181 178 바이트 :

( Leaky Nun의 팁 덕분에 -13 바이트! )

import re;R=re.match;lambda a,b:(R('s[^aeiou]|(z|gn|pn|ps|x|i)[aeiou]',a)and['lo ','gli ','la '][b]or R('[aeiou]',a)and["l'",'gli '][b%2]or['il ','i ','la '][b]if b<3else'le ')+a

의 형식으로 인수를 취하는 익명의 람다 함수 (<String>, <Integer Gender-Plurality mapping>) . 매핑은 다음과 같습니다.

0 -> Masculine Singular
1 -> Masculine Plural
2 -> Feminine Singular
3 -> Feminine Plural

이를 호출하려면 함수에 유효한 이름을 지정한 다음 print 문 안에 랩핑 된 일반 함수처럼 호출하십시오. 따라서 질문의 이름을 지정해야한다면U 과 같이 간단히 호출하십시오 print(U(<String>, <Integer Gender-Plurality mapping>)).

온라인으로 사용해보십시오! (아이디어)


zzz and yyy or xxx2 바이트보다 짧습니다[xxx,yyy][bool(zzz)]
Leaky Nun

@LeakyNun 내가 할 수 있습니까? 와우, 나는 몰랐다. 감사! :)
R. Kap

yyy진실한 한 작동합니다 .
Leaky Nun

@LeakyNun 물론입니다.
R. Kap

["l'",'gli '][b%2]3 바이트보다 짧습니다["l'",'gli ',"l'"][b]
Leaky Nun

4

자바, 227 208 195 바이트

Leaky Nun 덕분에 -13 바이트

String f(String a,int o){boolean v=a.matches("^([aeou]|i[^aeiou]).*"),b=a.matches("^([ixz]|gn|pn|ps|s[^aeiou]).*");return(o>1?o>2?"le ":v?"l'":"la ":o>0?v||b?"gli ":"i ":v?"l'":b?"lo ":"il ")+a;}

다음 매핑을 기반으로 문자열과 int를 가져옵니다.

0: Masculine Singular
1: Masculine Plural
2: Feminine Singular
3: Feminine Plural

결과가 포함 된 문자열을 반환합니다.

테스트 사례와 3 진 연산자가없는 (실제로) :

class Test {

    public static String f(String a, int o) {
        boolean v = a.matches("^([aeou]|i[^aeiou]).*");
        boolean b = a.matches("^([ixz]|gn|pn|ps|s[^aeiou]).*");
        String r;
        if(o > 1)
            if(o > 2)
                r = "le ";
            else
                if(v)
                    r = "l'";
                else
                    r = "la ";
        else
            if(o > 0)
                if(v || b)
                    r = "gli ";
                else
                    r = "i ";
            else
                if(v)
                    r = "l'";
                else if(b)
                    r = "lo ";
                else
                    r = "il ";
        return r + a;
    }

    public static void main(String[] args) {
        System.out.println(f("macchina", 2));
        System.out.println(f("zio", 0));
        System.out.println(f("libri", 1));
        System.out.println(f("ieri", 0));
        System.out.println(f("aquile", 3));
        System.out.println(f("spagnoli", 1));
        System.out.println(f("golf", 0));
        System.out.println(f("ombra", 2));
        System.out.println(f("impossibili", 1));
    }
}

약간의 정규식 마술을 사용하고 지정된 두 부울에 따라 작동합니다. 놀랍게도 가져 오기가 필요하지 않으므로 코드 크기에 도움이됩니다!


1
광산은 ... 자바보다 더 깁니다! 나는 좀 더 빨리 내 골프를해야합니다! 그래도 잘 했어! +1
R. Kap

명령 행이나 stdin에서 내 주장을 취해야한다면, 훨씬 오래

예, 부울도 허용됩니다. 내가 그것을 편집했습니다
Luis Mendo

0/1대신 false/true바이트를 절약 해야하는 대신 사용할 수 있다고 생각합니다 .
Leaky Nun

String e = "[^aeiou]).*";실제로 사용하지 않으면 5 바이트가 절약됩니다.
Leaky Nun

3

루비, 147146 바이트

온라인으로 사용해보십시오?

사용할 기사를 결정하기 위해 더 나은 방법을 사용하는 것이 가능할 수도 있지만, 잘 모르겠습니다.

사양에 따라 식별자는 다음과 같이 숫자입니다.

0: Masculine Singular
1: Masculine Plural
2: Feminine Singular
3: Feminine Plural

->w,i{(%w"lo gli la le l' gli l' le il i la le"[(0..2).find{|r|[/^(i[aeiou]|s[^aeiou]|z|x|[gp]n|ps)/,/^[aeiou]/,//][r]=~w}*4+i]+' '+w).sub"' ",?'}

2

배치, 446 390 385 380 바이트

@echo off
set w=%2
call:l %1 l' gli_ l' le_ il_ i_ la_ le_ lo_ gli_ le_ le_
exit/b
:l
for /l %%a in (0,1,%1)do shift
set o=%5
for %%a in (gn pn ps)do if %%a==%w:~,2% set o=%9
for %%a in (s z x)do if %%a==%w:~,1% set o=%9
for %%a in (a e i o u)do if %%a==%w:~,1% set o=%1
for %%a in (a e i o u)do if i%%a==%w:~,2% (set o=%9)else if s%%a==%w:~,2% set o=%1
echo %o:_= %%w%

새 버전은 0-3다른 답변과 성별 및 숫자에 동일한 인코딩을 사용합니다 . 1 차원 배열을 생성하는 방식으로 작동 %2.. %13이어서, 형태를 제 밖으로 이동 1+%1관심 형태가되도록 요소를 %1, %5그리고 %9(일괄 이상 이동하지 않으므로 운 인 %9이동없이). 그런 다음 접두사 목록을 검사하여 어떤 형식을 사용해야하는지 확인합니다. _단어가 출력 될 때까지 공백을 나타내는 자리 표시 자로 사용됩니다.


바이트를 저장하기 위해 단일 숫자 (또는 필요한 경우 문자로)로 인코딩 할 수도 있습니다. 모든 것은 바이트를위한 것입니다!
가치 잉크

@ KevinLau-notKenny 숫자 인코딩으로 전환하면 성별과 숫자 처리를 다시 작성하여 무려 56 바이트를 절약 할 수있었습니다!
Neil

1

파이썬 3, 235 바이트

정규 표현식없이 파이썬에서 이것을 얼마나 짧게 얻을 수 있는지 알고 싶었습니다. 이것이 최선의 선택이 아니라는 것이 밝혀졌습니다 ...

lambda s,c,v='aeiou':[["l'",'il','lo'],['gli','i','gli'],["l'",'la','la'],['le']*3][c][[[1,2][s[0]=='s'and s[1]not in v or s[0]in'zx'or s[:2]in['gn','pn','ps']or s[0]=='i'and s[1]in v],0][s[0]in v and not(s[0]=='i'and s[1]in v)]]+' '+s

다음 맵핑을 사용하여 단어의 인수 s및 성별 번호 코드 c를 정수로 입력하는 익명 함수입니다 .

0 - Masculine Singular
1 - Masculine Plural
2 - Feminine Singular
3 - Feminine Plural

올바른 기사와 함께 단어를 반환합니다.

작동 원리

각각 c별도의 목록으로 가능성을 포함하는 목록이 작성됩니다. 그런 다음 목록은의 값을 사용하여 색인화되어 c관련 옵션이 포함 된 3 요소 목록을 생성합니다. 부울 식의 결과를 사용하여 다른 중첩 목록으로 인덱싱하여 목록 인덱스를 선택합니다. 의 첫 문자 s가 모음이고 i뒤에 모음이 없으면 vowel, index의 반환을 통해 옵션 이 산출됩니다 0. 그밖에, 반환하는 부울 표현 True을 위해 cons. BFalse위해이 cons. A인덱스 산출, 평가 2하고 1, 각각을. 마지막으로, 색인은 기사를 생성하는 데 사용되며, 기사를 반환하기 전에 공백과 원래 문자열로 연결됩니다.

Ideone에서 사용해보십시오


1

자바 스크립트 210 바이트

(s,p)=>{var c=i=>!("aeiou".indexOf(s[i])+1),r=["z","gn","pn","ps","x"].some(t=>!s.indexOf(t))||(c(1)?s[0]=="s":s[0]=="i")?2:c(0)?1:0;return (p&1?(p&2?"le ":r&1?"i ":"gli "):!r?"l'":p&2?"la ":r&1?"il ":"lo ")+s}

두 개의 매개 변수 s와 p를 사용하는 익명 함수

s  is the input string
p  is plurality (bit 0, set=plural) and gender (bit 1, set=f) combined as
    0 = masculine singular
    1 = masculine plural
    2 = feminine singular
    3 = feminine plural

함수를 변수에 할당하고 압축을 풀면 다음과 같이 테스트 할 수 있습니다

var f=(s,p)=>{
    var c = i=>!("aeiou".indexOf(s[i])+1),
        r = ["z","gn","pn","ps","x"].some(t=>!s.indexOf(t))
             || ( c(1)? s[0]=="s":s[0]=="i" )
             ?   2 : c(0) ? 1 : 0;

     return (p&1?(p&2?"le ":r&1?"i ":"gli "):!r?"l'":p&2?"la ":r&1?"il ":"lo ")+s;
}

console.log("%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n",
 f("macchina",2),
 f("zio",0),
 f("libri",1),
 f("ieri", 0),
 f("aquile",3),
 f("spagnoli",1),
 f("golf",0),
 f("ombra",2),
 f("impossibili",1))

어디에

  • cs위치에서 자음 을 테스트하는 기능 i입니다.
  • r 모음으로 시작하는 경우 0, 유형 A 자음으로 시작하는 경우 1, 유형 B 자음으로 시작하는 경우 2 (역순으로 테스트)로 평가됩니다.
  • return 문에 비트 bash를 사용하면이를 조합 할 수 있습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.