러시아어를위한 복수형 함수 작성


25

영어에서 명사는 단수 (하나)인지 복수 (다른 것)인지에 따라 두 가지 다른 형태를 취할 수 있습니다. 예를 들어 "1 개", "2 개", "0 개", "57 개"등을 말합니다.

러시아어에는 세 가지 범주가 있습니다. "1 개, 2 개, 5 개"대신 러시아어로 "1 собака, 2 собаки, 5 собак"가됩니다.

범주는 다음 논리에 따라 구분됩니다.

  • "단일": 11로 끝나는 숫자를 제외하고 1과 1로 끝나는 숫자에 사용됩니다.
    • 예 : 1 собака, 21 собака, 101 собака
  • "몇": 2, 3 및 4에 사용되며 12, 13 및 14로 끝나는 숫자를 제외한 2, 3 또는 4로 끝나는 숫자에 사용됩니다.
    • 예 : 2 собаки, 3 собаки, 4 собаки, 32 собаки, 43 собаки, 104 собаки
  • "많은": "단수"또는 "몇 가지"로 간주되지 않는 모든 것.
    • 예 : 0 собак, 5 собак, 11 собак, 13 собак, 25 собак, 111 собак, 114 собак

도전

[0, 1000] 범위의 정수 입력이 1있으면 "단수"범주에 2속하는 경우, "몇 가지"범주에 5속하는 경우 및 "많은"범주에 속하는 경우 반환합니다.

프로그램이 기능이거나 STDIN을 사용할 수 있습니다. STDOUT으로 인쇄하거나 함수에서 값을 반환 할 수 있습니다

이것은 코드 골프 도전이므로 바이트 수가 가장 적은 솔루션이 승리합니다.



2
1, 2그리고 5특히? 또한 종료 코드를 사용할 수없는 이유는 무엇입니까?
CalculatorFeline

6
@Phoenix 그것은 나에게 완전히 잘못 들리 네요-깨진 러시아어-나는 질문에 항상 양식을 사용했으며 그것이 올바른 것으로 보입니다.
dkudriavtsev

2
@CalculatorFeline 1부터 계산을 시작하면 1에 특이점이 생기고, 2에 처음에는 거의 발생하지
않으며

5
러시아어로 계산하는 것은 매우 어렵습니다. 마지막 숫자가 사건을 결정한다는 점에 주목할 가치가 있습니다. 1 = 명칭 단수 2,3,4 = 생성 단수, 5-0 생식 복수. 이것은 문구의 경우에 따라 변하고, 6 개의 경우가 있기 때문에 24 가지 형태의 '하나'(남성), 24 가지 형태의 '2 개'(여성) 등이 있습니다. 내 지역 대학의 러시아 교수는 " with "가 도구 적 사례 (어려운 것)를 요구하기 때문에 "2345 개로 번역 할 수 없을 것"이라고 전해진다 .
smirkingman 2016 년

답변:


15

파이썬 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. 플로어 분할은 -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원하는 (5)의 출력을 제공 오른쪽으로 0 또는 1을 항상 비트 시프트.


7
설명 해주십시오.
CalculatorFeline


8

펄 5 , 26 바이트

25 바이트의 코드 + -p플래그

$_=/1.$|[5-90]$/?5:2-/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를 상당히 능가합니다.
Outgolfer Erik

7

자바 스크립트 (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-첫 번째 위치에서 잘 발견 :)
Shaggy

난 당신이 단항 필요가 있다고 생각하지 않습니다 +, 전혀를 s%10변환해야합니다 s숫자로.
ETHproductions

예, @ETHproductions도 깨달았습니다.
Shaggy

1
n%10-> n%5바이트를 절약
Johan Karlsson

4

젤리 ,  19  18 바이트

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

음이 아닌 정수를 가져오고 리턴하는 모나드 링크.

온라인으로 사용해보십시오! 또는이 테스트 스위트 에서 0에서 1000까지의 세 그룹을 참조하십시오. .

방법?

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은 여전히 ​​골프를하고 있습니다 ...
Jonathan Allan

@CalculatorFeline 잘 나는 더 잘 찾을 수 없습니다. 설명이 추가되었습니다.
Jonathan Allan

어떤 18 개의 문자를 18 바이트로 인코딩 할 수 있습니까?
exebook

@exebook Jelly는 자체 코드 페이지를
GamrCorps

3

05AB1E , 38 19 바이트

Rod의 python answer 에서 색인 트릭을 사용합니다.

•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
당신은 펄을 잃고 있습니다. 여기에 문제가 있다고 생각합니다.
Pavel

@ 피닉스 : 네. 이 도전은 정규식에 매우 적합하거나 아주 잘못하고 있습니다 :) 공정하게 말하면, Perl은 종종 골프입니다.
Emigna

4
@ Enigma ... 그리고 Perl 골퍼는 종종 매우 좋습니다. ;-)
Dada

@Dada : 매우 사실입니다!
Emigna

설명 해주세요
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 포트를 사용하면 디지털 데이터의 개별 패킷을 전송할 수 있습니다.

이 정보를 읽는 데 도움이 될 수있는 한 가지 정보 : MCxxxx 어셈블리에서 테스트 명령은 수행 할 분기를 나타내는 플래그를 설정합니다. 로 시작하는 라인 +은 가장 최근의 테스트가 true를 반환 한 경우 -에만 실행되고로 시작하는 라인 은 테스트가 false 인 경우에만 실행됩니다.

한 줄씩 :

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

하스켈 , 62 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

나는 그것이 가능하다는 것을 몰랐다!
bartavelle 2012 년

1
codegolf.stackexchange.com/questions/19255/에 더 많은 팁과 요령이 있습니다 ... 정말로 읽을만한 가치 =)
flawr

0

스칼라, 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.