태그 보관물: natural-language

natural-language

러시아어를위한 복수형 함수 작성 다른 형태를 취할 수 있습니다. 예를

영어에서 명사는 단수 (하나)인지 복수 (다른 것)인지에 따라 두 가지 다른 형태를 취할 수 있습니다. 예를 들어 “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 , 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을 항상 비트 시프트.


답변

파이썬 2 , 45 바이트

lambda n,s='5122255555':(s+'5'*10+s*8)[n%100]

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


답변

펄 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입니다.


답변

자바 스크립트 (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>

답변

젤리 ,  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

답변

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

답변

PHP> = 7.1, 44 바이트

<?=$argn[-2]!=1&($m=($argn+9)%10)<4?2-!$m:5;

온라인 버전