为俄语写一个复数函数


25

在英语中,名词可以采用两种不同的形式,具体取决于它们是单数(一个)还是复数(其他)。例如,我们说“ 1条狗”,但说“ 2条狗”,“ 0条狗”,“ 57条狗”等等。

在俄语中,分为三类。代替俄语中的“ 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
为什么12以及5特别?另外,为什么我不能使用退出代码?
CalculatorFeline

6
@Phoenix对我来说听起来太不对头了-坏了的俄语-我一直在问题中使用表格,但我发现它是正确的,显然是
dkudriavtsev

2
@CalculatorFeline如果从1开始计数,则在1处会出现奇数,在2处会出现一些首次出现,在5处会出现很多首次出现。
十分合理

5
用俄语计数非常困难。也许值得注意的是,最后一位数字决定了案件。1 =名词单数2,3,4 =遗传单数,5-0遗传复数。这随着短语的大小写而变化,因为有6种情况,所以有24种形式的“一个”(男性),24种形式的“ 2”(女性)等等。据说我当地大学的俄语教授不太可能翻译“ 2345条狗”,因为“ with”需要工具箱(很难)。
smirkingman

Answers:


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)

首先让我们看一下不适合青少年的更简单的代码。

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]

这是有希望的,因为前两个条目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 进行映射'5521'[_]

现在,我们还需要以11到15结尾的数字始终给出5。我们首先通过检测十位数是否为来做到这一点1。以n/10除去最后一个数字,我们再申请%~9作为之前得到的结果

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

对于各个最终数字。我们要检测的数字1映射到极值-9。按楼层划分,-9将其变为1,其他所有值都变为0。

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

最后,我们使该指标1始终提供输出5。这是n%~9/-3通过将指标的right 结果右移一位来完成的。的结果0,1,2,3始终位移权利0或1,如所期望其给出5的输出。


7
请解释。
CalculatorFeline


8

Perl 5,26个字节

25个字节的代码+ -p标志。

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

在线尝试!

再多一个字节 $_=/(?<!1)[1-4]$/?2-/1$/:5

说明:(在27字节的版本上; 26是相当对称的)
“单数”和“很少”都以“不是1,后跟1到4的数字”结尾(已通过进行测试(?<!1)[1-4]$/)。在这种情况下,结果为2,如果数字以1(2-/1$/)结尾则减1 。否则,结果为5。


5
tfw Perl击败了05AB1E。
暴民埃里克(Erik the Outgolfer)'17年

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 '17

是的,@ ETHproductions也意识到这一点。
毛茸茸的

1
n%10-> n%5保存一个字节
Johan Karlsson

4

果冻 19  18 字节

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

单元链接,获取并返回非负整数。

在线尝试!或查看此测试套件中从0到1000(含0)的三个组

怎么样?

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 '17

@exebook Jelly使用自己的代码页
GamrCorps,2015年

3

05AB1E38 19字节

使用Rod的python答案中的索引技巧

•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经常表现得很好。
Emigna '17

4
@Enigma ...和Perl高尔夫球手通常都很好,对吧?;-)
Dada's

@Dada:非常正确!
Emigna '17

请解释。
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游戏“ 深圳I / O”中使用的这种语言,因此没有链接可以对其进行测试。

说明:

该功能通过XBus端口x0接受输入,并通过端口x1输出。在MC4000上执行所需的时间太长,但恰好适合MC6000的内存。对于不熟悉的XBus端口,可以传输离散的数字数据包。

一条可能有助于阅读的信息:在MCxxxx程序集中,测试说明设置了一个标志,指示应采用哪个分支。打头的行+,如果最近的测试返回真只是执行,打头的行-如果测试是假的只是执行。

逐行:

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 ...

这是一个表格,其中单元格n包含该nth数字的答案。该表格仅适用于前100个元素,因此是mod


您能解释一下这里发生了什么吗?您肯定可以使用f n|s<-"5122255555"=(s++('5'<$[0..9])++cycle s)!!mod n 100
瑕疵

我不知道那是可能的!
bartavelle


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中达到目的,还是将其添加到输入中的任意字符?
毛茸茸的
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.