영어에서 명사는 단수 (하나)인지 복수 (다른 것)인지에 따라 두 가지 다른 형태를 취할 수 있습니다. 예를 들어 “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
. 플로어 분할은 -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
인디케이터에 의해 올바른 결과를 비트 시프트하여 수행됩니다 . 결과 0,1,2,3
원하는 (5)의 출력을 제공 오른쪽으로 0 또는 1을 항상 비트 시프트.
답변
답변
펄 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)
- CalculatorFeline 덕분에 8 바이트가 절약되었습니다 .
- ETHproductions 덕분에 1 바이트를 절약했습니다 .
- Johan 덕분에 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