ロシア語の複数形関数を書く


25

英語では、名詞は単数形(1つ)か複数形(それ以外)かによって2つの異なる形式をとることができます。たとえば、「1犬」と言いますが、「2犬」、「0犬」、「57犬」などです。

ロシア語には、3つのカテゴリがあります。「1犬、2犬、5犬」の代わりに、ロシア語では「1собака、2собаки、5собак」となります。

カテゴリは、次のロジックに従って分割されます。

  • 「単数形」:1と、1で終わる数字に使用されます。ただし、11で終わる数字は除きます。
    • 例:1собака、21собака、101собака
  • 「少数」:2、3、および4、および2、3、または4で終わる番号に使用されます。ただし、12、13、および14で終わる番号は除きます。
    • 例:2собаки、3собаки、4собаки、32собаки、43собаки、104собаки
  • 「多数」:「特異」または「少数」と見なされないもの。
    • 例:0собак、5собак、11собак、13собак、25собак、111собак、114собак

チャレンジ

[0、1000]の範囲の整数入力が与えられた1場合、それが「特異」カテゴリ2に属する場合、「少数」カテゴリ5に属する場合、および「多」カテゴリに属する場合を返します。

プログラムは関数であるか、STDINを使用できます。STDOUTに出力するか、関数から値を返すことができます

これはコードゴルフの課題であるため、バイト数が最も少ないソリューションが優先されます。



2
なぜ125特に?また、終了コードを使用できないのはなぜですか?
CalculatorFeline

6
@Phoenixそれは私にはまったく間違っているように聞こえます-壊れたロシア語-私はいつも質問でフォームを使用してきましたが、正しいと思います
-dkudriavtsev

2
@CalculatorFeline 1からカウントを開始すると、1で特異になり、2で最初に発生するものはほとんどなく、5で最初に表示されます。完全に理にかなっています:
LLlAMnYP

5
ロシア語でのカウントは非常に困難です。最終桁がケースを決定することはおそらく注目に値します。1 =主格の単数2,3,4 =単数の主格、5-0の主格の複数。これはフレーズの大文字小文字によって変わります。6つの場合があるため、「1」(男性)の24の形式、「2」(女性)の24の形式などがあります。私の地元の大学のロシアの教授は、「with」が器械的ケース(難しいケース)を要求するため、「with 2345 dogs」を翻訳できないと言われています。
スマイキングマン

回答:


15

Python 2、36バイト

lambda n:'5521'[n%~9/-3>>n/10%~9/-9]

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

算術的に同じ長さ:

lambda n:5/(n%~9/-3>>n/10%~9/-9or 1)

最初に、10代を考慮しないより単純なコードを見てみましょう。

lambda n:'5521'[n%~9/-3]

ここでは、次のように機能する出力への数字のマッピングが必要です。

[5, 1, 2, 2, 2, 5, 5, 5, 5, 5][n%10]

しかし、nモジュロ10(%10)をとるのではなく、を実行しn%-10て、区間[-9..0]にマッピングして剰余を与えます:

> [n%~9 for n in range(10)]
[0, -9, -8, -7, -6, -5, -4, -3, -2, -1]

これは、最初の2つのエントリので、約束している0-9遠く離れている、と彼らは異なる出力に送信する必要があります。また、-10に短縮できます~9

ここから、フロア分割により/-3、正しい開始点で3つのチャンクが得られます

> [n%~9/-3 for n in range(10)]
[0, 3, 2, 2, 2, 1, 1, 1, 0, 0]

目的の出力を取得するに0->5, 1->5, 2->2, 1->1は、文字列selectionを使用してmapするだけです'5521'[_]

また、常にを与えるには、11から15で終わる数字も必要5です。まず、10桁がであるかどうかを検出することでこれを行います1。取ってn/10最後の桁を削除するには、我々はその後、適用%~9結果を得るために、以前のように

[0, -9, -8, -7, -6, -5, -4, -3, -2, -1]

それぞれの最終桁に対して。検出する1の数字は、極値にマッピングされます-9。によるフロア分割は-91に、その他はすべて0になります。

> [k%~9/-9 for k in range(10)]
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0]

最後に、この1インディケーターに常に出力5を与えるようにします。これは、インn%~9/-3ディケーターによって右の結果をビットシフトすることにより行われます。0,1,2,3常に0または1に右にビットシフトした結果、必要に応じて5の出力が得られます。


7
説明してください。
CalculatorFeline


8

Perl 5、26バイト

25バイトのコード+ -pフラグ。

$_=/1.$|[5-90]$/?5:2-/1$/

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

もう1バイトは、です$_=/(?<!1)[1-4]$/?2-/1$/:5

説明:(27バイトバージョンでは、26は非常に対称的です)
「単数形」と「少数」の両方が「1ではなく、1から4の数字が続く」で終わります(テスト済み(?<!1)[1-4]$/)。これらの場合、数値が1(2-/1$/)で終わる場合、結果は2-1 です。それ以外の場合、5の場合の結果。


5
tfw Perlが05AB1Eをかなり上回る。
エリックアウトゴルファー

7

JavaScript(ES6)、53 49 48 40 39 38 37 36バイト

n=>/[05-9]$|1.$/.test(n)?5:1+(n%5>1)

それを試してみてください

f=
n=>/[05-9]$|1.$/.test(n)?5:1+(n%5>1)
oninput=_=>o.innerText=f(+i.value);o.innerText=f(i.value=0)
<input id=i type=number><pre id=o>


1[1-4]可能1./1$/.test(s)なり得ます+s%10==1。単項を決して忘れないでください+
CalculatorFeline

おかげで、@ CalculatorFeline-最初のものによく見られます:)
シャギー

私はあなたが単項を必要としないと思う+、すべてでs%10変換する必要がありs数に。
ETHproductions

うん、それも@ETHproductionsに気付いた。
シャギー

1
n%10-> n%5バイトを保存
ヨハンカールソン

4

ゼリー 19  18 バイト

DµṖṚi1’ȧṪị“M;ọ6’D¤

負でない整数を取り、返す単項リンク。

オンラインでお試しください!または、これに含まれる0〜1000の3つのグループを参照してください。テストスイートで確認します

どうやって?

DµṖṚi1’ȧṪị“M;ọ6’D¤ - Main link: non-negative number, n  e.g. 301      311      313
D                  - cast to decimal list                [3,0,1]  [3,1,1]  [1,3,3]
 µ                 - monadic chain separation, call that d
  Ṗ                - pop d                               [3,0]      [3,1]    [1,3]
   Ṛ               - reverse                             [0,3]      [1,3]    [3,1]
     1             - literal 1
    i              - first index of (0 if not found)      0          1        2      
      ’            - decrement                           -1          0        1
        Ṫ          - tail d                               1          1        3
       ȧ           - logical and                          1          0        3
                 ¤ - nilad followed by link(s) as a nilad:
          “M;ọ6’   -   base 250 literal = 1222555555
                D  -   cast to decimal list [1,2,2,2,5,5,5,5,5,5]
         ị         - index into (1-based and modular)     1          5        2

1
説明してください。
CalculatorFeline

まだゴルフに取り組ん@CalculatorFeline ...
ジョナサン・アラン

@CalculatorFelineよくわかりません。説明を追加しました。
ジョナサンアラン

これらの18文字をどの文字エンコードで18バイトで表すことができますか?
exebook

@exebook Jellyは独自のコードページを
-GamrCorps

3

05AB1E38 19バイト

Rodのpython answerの index-trickを使用します

•1rꢰ•©5T×®9×JIт%è

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

説明

•1rꢰ•              # push the number 5122255555
       ©             # store a copy in register
        5T×          # push 5 repeated 10 times
           ®         # retrieve the first number from register
            9×       # repeat it 9 times
              J      # join everything to string
               Iт%   # push input mod 100
                  è  # use this to index into the string of digits

8
あなたはPerlに負けている、ここで何かがおかしいと思う。
パベル

@フェニックス:うん。この挑戦は正規表現に非常に適しているか、私がひどく間違ったことをしている:)公平を期すために、Perlはしばしばかなりゴルフ好きです。
エミグナ

4
@エニグマ...そしてPerlゴルファーはしばしば非常に良いですよね?;-)
ダダ

@ダダ:非常に真実です!
エミグナ

説明してください。
CalculatorFeline


2

MCxxxxアセンブリ、123バイト

e:slx x0
mov x0 acc
dst 2 0
tlt acc 11
-tgt acc 14
-jmp v
+dgt 0
teq acc 1
+mov 1 x1
+jmp e
tlt acc 5
+mov 2 x1
v:-mov 5 x1

注意:

TiOは、この言語をサポートしていません。この言語は、ZachtronicsゲームのShenzhen I / Oで使用されているため、これをテストするためのリンクはありません。

説明:

これは、XBusポートx0を介して入力を受け取り、ポートx1を介して出力する関数です。MC4000で実行するには長すぎますが、MC6000のメモリにうまく収まります。XBusポートは、慣れていない人のために、デジタルデータの個別のパケットの送信を許可します。

これを読むのに役立つかもしれない情報の1つ:MCxxxxアセンブリでは、テスト命令は、どの分岐を取るべきかを示すフラグを設定します。で始まる行は、+最新のテストがtrueを返した場合に-のみ実行され、始まる行はテストがfalseであった場合にのみ実行されます。

1行ずつ:

e:slx x0    # Label this line e, then sleep until input is available on XBus port x0
mov x0 acc  # Move the input into register acc 
dst 2 0     # Set the leftmost digit of the input to 0
tlt acc 11  # Test if the value in acc is less than 11
-tgt acc 14 # If it's not, check if it's greater than 14
-jmp v      # If it's not, jump to the line labeled v (the last line)
+dgt 0      # If either of the previous tests returned true,
            #     set acc to the value of acc's rightmost digit
teq acc 1   # Test if acc equals 1
+mov 1 x1   # If it does, return 1
+jmp e      # Then jump to label e, which ends execution
tlt acc 5   # Test if acc is less than 5
+mov 2 x1   # If it is, return 2
v:-mov 5 x1 # If the previous test is false, return 5

スコアリングに関する注意:MCxxxxアセンブリにはそれ自体機能はありませんが、これはあなたが得ることができる機能に近いです-それは単一の実行ノードに適合し、あるポートを介して入力を受け取り、別のポートを介して出力します。結果として、私はこれを関数のように採点しました(つまり、有効なMCxxxxエミュレーターファイルを作成するのに必要なバイト数をカウントしません)。



1

Haskell62 58バイト

f n|s<-"5122255555"=(s++('5'<$[0..9])++cycle s)!!mod n 100

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

説明

これにより、次の文字列が作成されます。

5122255555555555555551222555555122255555512225555551222555555122255555512225555551222555555122255555 ...

これは、セルnnth番号の答えが含まれているテーブルです。テーブルは最初の100要素に対してのみ正しいため、modです。


ここで何が起こっているのか説明できますか?確実に短くすることができますf n|s<-"5122255555"=(s++('5'<$[0..9])++cycle s)!!mod n 100
-flawr

それが可能だとは知りませんでした!
バルタヴェル

1
でより多くのヒントやトリックがありますcodegolf.stackexchange.com/questions/19255/...本当に読む価値=)
flawr

0

Scala、110バイト

n=>Stream.iterate("512225555555555555555")(_=>"1222555555").flatMap(_.toCharArray).map(_.toInt).take(n-1).head

0

Turtlèd、35バイト

!--.(1#0#)+.@3(1@1)(2@2)(3@2)(4@2),

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

この関数では、入力が>で始まる必要がありますが、python2は入力を半定期的に使用し、引用符が必要なため、これは問題ないと思います。

説明:

!             input the number as a string, complete with the >
 --.          wrap around to the end of the string, and then move one back. if this
              is a single digit, we end up on the >,
              otherwise we end up on the second to last digit. write the digit/>

    (1#0#)    if it is 1, set the string to 0. this way it will always write 3 at the end.



          +.       write the last digit (or 0 if the second last digit was 1)
            @3      set the character variable to 3. this means if what was written was not
                       in (1, 2, 3, 4), then it will write 3 at the end
              (1@1)    if the character written was a 1, set the character to be written
                       at the end to 1
                   (2@2)(3@2)(4@2)
                     if it is any of 2,3,4, set the character to be written at the end to 2
                                  ,    write the character that was set

>Turtledで目的を果たすか、それはあなたが入力に追加した任意の文字ですか?
シャギー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.