プログラミングパズル、ゴルフのコード


21

バックグラウンド

イタリア語の定冠詞(英語theに対応)には、l 'illogliilaleの 7つの異なる形式があります。どちらを使用するかは、3つの変数に依存します。

  • 性別:男性/女性。
  • 数:単数/複数。
  • 後続の単語の頭文字:母音/子音タイプA /子音タイプB
    • 母音は、これらのいずれかである:AEIOU
    • 子音タイプBは、これらのケースのいずれかである:S-別の子音が続く、Z-gn-PN- PS-X-I-(この母音が続くiは半母音として作用します)。
    • 子音タイプAは、タイプBではない子音です。

表は、上記の3つの変数の12の組み合わせのそれぞれで使用される記事フォームを示しています。l '形式は、単一引用符でスペースなしで次の単語に付加されることに注意してください。

ここに画像の説明を入力してください

チャレンジ

単語と、性別番号を示す1つまたは2つの文字列、数字、またはブール値を入力ます。(最初の文字は、入力語から取得する必要があります)。

入力ワードは、小文字のASCII文字のシーケンスになります。アクセント付きの母音は、アクセントのない母音に置き換えられます(たとえば、realtàrealtaとして入力されます)。

性別と数値の入力は、個別の数値、ブール値または文字列、または文字列の組み合わせ数(たとえば、男性の単数の場合は1、女性の単数の場合は2など)にすることができます。

回答で指定されている限り、任意の妥当な形式と区切り記号を使用できます。

出力単語は、物品の適切な形が先行し、必要に応じてスペースまたは単一引用符で、。出力も小文字にする必要があります。末尾または先頭の空白スペースが許可されます。

コードゴルフ、最短の勝利。

テストケース

Iは、入力文字を使用して、以下にmf性別を指定するために、及びsp(これは単に1つの可能な入力形式である)数について。

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まあ、すでにこれがあります...違いはおそらく小さすぎるでしょう
ルイス・メンド

1
マイナーな技術的な揚げ足取り:/ jは/通常と呼ばれる半母音英語では、ありませんsemiconsonant。[k](lo cheflo chardonnay)ではなく[ʃ]を表す⟨ch⟩ 、フランス語の名前のバリエーション(l'Havet but lo Hugo)などのエッジケースを考慮に入れた場合、ソリューションはどうなるでしょうか。化石化されたフォーム(gli deiper lo meno)、姓(l'Antonia but la Antonini)で呼ばれる女性など。
ヤヌスバズジャケ

1
イタリア人としてieri、副詞であり名詞ではないので、テストケースを外してください。(ところでそれは正式に正しかった)お願いします!
ジャコモガラベロ16

1
通常「ペンサレ
・ア・イエーリ

回答:


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

Python 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 xxxより2バイト短いです[xxx,yyy][bool(zzz)]
漏れ修道女

@LeakyNunそれができますか?うわー、私も知りませんでした。ありがとう!:)
R. Kap

yyy真実である限り機能します。
リーキー修道女

@LeakyNunええ、もちろん。
R. Kap

["l'",'gli '][b%2]3バイトより短い["l'",'gli ',"l'"][b]
漏れ修道女

4

Javaの、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

結果を文字列で返します。

テストケースと三項演算子を使用せずにゴルフを解きます(現在のところ):

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));
    }
}

少し正規表現の魔法を使用し、指定された2つのブール値に応じて動作します。驚いたことに、インポートは必要ありません。これはコードサイズの改善に役立ちます。


1
私のものは... JAVAより長い?!私はもう少し早くゴルフをしなければなりません!いい仕事だ!+1
R. Kap

コマンドラインまたはstdinから引数を取得する必要があった場合、信じられないほど長くなりました:P

はい、ブール値も受け入れられます。編集しました
ルイスメンドー

0/1代わりにfalse/trueいくつかのバイトを節約できるはずだと思います。
リーキー修道女

String e = "[^aeiou]).*";実際に使用しないと、5バイト節約できます。
リーキー修道女

3

ルビー、147 146バイト

オンラインでお試しください?

どの記事を使用するかを決定するためにより良い方法を使用することは可能かもしれませんが、私はそれを知りません。

仕様に従って、識別子は次のような数字です。

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シフトなし)。次に、プレフィックスのリストを面倒にチェックして、使用する必要があるフォームを見つけます。_は、単語が出力されるまでスペースを表すプレースホルダーとして使用されます。


バイトを節約するために、1桁(または仕様で許可されているため必要に応じて文字)にエンコードすることもできます。すべてはバイトのためです!
値インク

@ KevinLau-notKenny数字エンコードに切り替えると、性別と番号の処理を書き換えることで、なんと56バイト節約できました!
ニール

1

Python 3、235バイト

正規表現を使わずにPythonでこれをどれだけ短時間で取得できるか興味がありました。これは最良の選択肢ではないことがわかります...

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

JavaScript 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}

2つのパラメーター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))

どこで

  • cは、s位置で子音をテストする関数iです。
  • r 母音で始まる場合は0、タイプAの子音で始まる場合は1、タイプBの子音で始まる場合は2と評価されます(逆の順序でテストされます)。
  • returnステートメントのビットバッシングは、それをまとめます。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.