Viết hàm số nhiều cho tiếng Nga


25

Trong tiếng Anh, danh từ có thể có hai dạng khác nhau tùy thuộc vào việc chúng là số ít (một) hay số nhiều (bất cứ thứ gì khác). Ví dụ: chúng tôi sẽ nói "1 con chó" nhưng "2 con chó", "0 con chó", "57 con chó" và vv.

Trong tiếng Nga, có ba loại. Thay vì "1 con chó, 2 con chó, 5 con chó", trong tiếng Nga nó sẽ là "1 hình ảnh, 2 hình ảnh, 5 hình ảnh".

Các loại được chia theo logic sau:

  • "Số ít": được sử dụng cho 1 và bất kỳ số nào kết thúc bằng 1, ngoại trừ các số kết thúc bằng 11.
    • Ví dụ: 1 hình ảnh, 21 hình ảnh, 101 hình ảnh
  • "Few": được sử dụng cho 2, 3 và 4 và bất kỳ số nào kết thúc bằng 2, 3 hoặc 4 ngoại trừ các số kết thúc bằng 12, 13 và 14.
    • Ví dụ: 2 hình ảnh, 3 hình ảnh, 4 hình ảnh, 32 hình ảnh, 43 hình ảnh, 104 hình ảnh
  • "Nhiều": bất cứ điều gì không được coi là "Số ít" hoặc "Rất ít".
    • Ví dụ: 0 hình ảnh, 5 hình ảnh, 11 hình ảnh, 13 hình ảnh, 25 hình ảnh, 111 hình ảnh, 114 hình ảnh

Các thách thức

Đưa ra một đầu vào số nguyên trong phạm vi [0, 1000], trả về 1nếu nó thuộc danh mục "số ít", 2nếu thuộc về loại "vài" và 5nếu thuộc về loại "nhiều".

Chương trình của bạn có thể là một chức năng hoặc nó có thể sử dụng STDIN. Bạn có thể in ra STDOUT hoặc trả về giá trị từ hàm

Đây là một thử thách golf mã , vì vậy giải pháp có số byte ít nhất sẽ thắng.



2
Tại sao 1, 25đặc biệt? Ngoài ra, tại sao tôi không thể sử dụng mã thoát?
Máy

6
@Phoenix Điều đó nghe có vẻ hoàn toàn sai đối với tôi - tiếng Nga bị hỏng - Tôi đã luôn sử dụng mẫu đơn trong câu hỏi và tôi thấy nó chính xác, và rõ ràng là
dkudriavtsev

2
@CalculatorFeline Nếu bạn bắt đầu đếm từ 1, bạn nhận được số ít ở 1, một số ít xuất hiện đầu tiên ở 2, nhiều lần đầu tiên xuất hiện ở 5. Tạo cảm giác hoàn hảo :-)
LLlAMnYP

5
Đếm bằng tiếng Nga là vô cùng khó khăn. Có lẽ đáng lưu ý rằng chữ số cuối cùng xác định trường hợp . 1 = Số ít danh nghĩa 2,3,4 = Số ít về gen, 5-0 Số nhiều về gen. Điều này thay đổi với trường hợp của cụm từ và vì có 6 trường hợp, có 24 dạng 'một' (là nam tính), 24 dạng 'hai' (là nữ tính), v.v. Người ta nói rằng giáo sư tiếng Nga tại trường đại học địa phương của tôi sẽ khó có thể dịch " với 2345 con chó", bởi vì 'với' yêu cầu trường hợp công cụ (một trường hợp khó).
smirkingman

Câu trả lời:


15

Python 2 , 36 byte

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

Hãy thử trực tuyến!

Cùng chiều dài một cách hợp lý:

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

Trước tiên chúng ta hãy xem mã đơn giản hơn không dành cho thanh thiếu niên.

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

Ở đây, chúng tôi muốn ánh xạ chữ số của một thành một đầu ra hoạt động như

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

Nhưng, thay vì dùng nmodulo 10 ( %10), chúng ta có thể thực hiện n%-10, ánh xạ tới các khoảng [-9..0]để đưa ra phần còn lại:

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

Điều này đầy hứa hẹn vì hai mục đầu tiên 0-9cách xa nhau, và chúng cần được gửi đến các đầu ra khác nhau. Ngoài ra, -10có thể được rút ngắn để ~9.

Từ đây, phân chia tầng bằng cách /-3cho các khối 3 với điểm bắt đầu bên phải

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

Để có được đầu ra mong muốn, bây giờ chúng ta chỉ cần ánh xạ 0->5, 1->5, 2->2, 1->1, mà chúng ta làm với lựa chọn chuỗi '5521'[_].

Bây giờ, chúng ta cũng cần các số kết thúc từ 11 đến 15 để luôn luôn cung cấp 5. Trước tiên chúng tôi làm điều này bằng cách phát hiện xem sau đó hàng chục chữ số 1. Lấy n/10để xóa chữ số cuối cùng, sau đó chúng tôi áp dụng %~9như trước để có kết quả

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

cho các chữ số cuối cùng tương ứng. Chữ số 1 mà chúng tôi muốn phát hiện được ánh xạ tới giá trị cực trị -9. Chia tầng bằng cách -9biến nó thành 1 và mọi thứ khác thành 0.

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

Cuối cùng, chúng ta làm cho chỉ báo này 1luôn luôn cho đầu ra 5. Điều này được thực hiện bằng cách dịch chuyển bit kết quả của n%~9/-3quyền bởi chỉ báo. Kết quả của việc 0,1,2,3luôn chuyển bit sang 0 hoặc 1, cho ra đầu ra 5 như mong muốn.


7
Vui lòng giải thích.
Máy


8

Perl 5 , 26 byte

25 byte mã + -pcờ.

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

Hãy thử trực tuyến!

Đối với một byte nữa, có $_=/(?<!1)[1-4]$/?2-/1$/:5.

Giải thích: (trên phiên bản 27 byte; 26 khá đối xứng)
Cả hai "số ít" và "vài" kết thúc bằng "không phải là 1 theo sau là một chữ số từ 1 đến 4" (được thử với (?<!1)[1-4]$/). Trong những trường hợp đó, kết quả là 2, trừ 1 nếu số kết thúc bằng 1 ( 2-/1$/). Nếu không, kết quả nếu 5.


5
tfw Perl đánh bại 05AB1E bằng một số tiền hợp lý.
Erik the Outgolfer

7

JavaScript (ES6), 53 49 48 40 39 38 37 36 byte

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

Thử nó

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]có thể 1./1$/.test(s)có thể +s%10==1. Đừng bao giờ quên unary +!
Máy

Cảm ơn, @CalculatorFeline - được phát hiện tốt trên cái đầu tiên :)
Shaggy

Tôi không nghĩ rằng bạn cần unary +cả, s%10nên chuyển đổi sthành một số.
Sản phẩm ETH

Yup, chỉ cần nhận ra rằng, @ETHproductions.
Xù xì

1
n%10-> n%5tiết kiệm một byte
Johan Karlsson

4

Thạch ,  19  18 byte

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

Một liên kết đơn lấy và trả về số nguyên không âm.

Hãy thử trực tuyến! hoặc xem ba nhóm từ 0 đến 1000 đã bao gồm trong bộ thử nghiệm này .

Làm sao?

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
Xin giải thích.
Máy

@CalculatorFeline vẫn đang chơi golf ...
Jonathan Allan

@CalculatorFeline tốt Tôi không thể tìm thấy tốt hơn; giải thích thêm.
Jonathan Allan

Trong ký tự nào mã hóa 18 ký tự đó có thể được biểu thị bằng 18 byte?
exebook

@exebook Jelly sử dụng trang mã
GamrCorps

3

05AB1E , 38 19 byte

Sử dụng thủ thuật đánh lừa từ câu trả lời trăn của Rod

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

Hãy thử trực tuyến!

Giải trình

•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
Bạn đang thua Perl, tôi nghĩ có gì đó không đúng ở đây.
Pavel

@Phoenix: Vâng. Thử thách này rất phù hợp với regex hoặc tôi đang làm điều gì đó cực kỳ sai lầm :) Công bằng mà nói, Perl thường chơi golf khá giỏi.
Emigna

4
@Enigma ... và những người chơi golf Perl thường rất giỏi, phải không? ;-)
Dada

@Dada: Rất đúng!
Emigna

Xin giải thích.
Máy


2

MCxxxx hội , 123 byte

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

Chú thích:

TiO không hỗ trợ ngôn ngữ này, được sử dụng trong trò chơi Zachtronics Thâm Quyến I / O , vì vậy không có liên kết để kiểm tra ngôn ngữ này.

Giải trình:

Đây là chức năng nhận đầu vào thông qua cổng XBus x0 và đầu ra thông qua cổng x1. Quá lâu để thực hiện trên MC4000, nhưng vừa vặn với bộ nhớ của MC6000. Các cổng XBus, đối với những người không quen thuộc, cho phép truyền các gói dữ liệu kỹ thuật số riêng biệt.

Một thông tin có thể hữu ích trong việc đọc này: trong lắp ráp MCxxxx, hướng dẫn kiểm tra đặt cờ cho biết nhánh nào sẽ được lấy. Các dòng bắt đầu +chỉ được thực hiện nếu thử nghiệm gần đây nhất trả về true và các dòng bắt đầu -chỉ được thực hiện nếu thử nghiệm sai.

Từng dòng:

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

Lưu ý về cách tính điểm: Lắp ráp MCxxxx không có chức năng mỗi lần, nhưng điều này gần với chức năng mà bạn có thể nhận được - đó là một chương trình phù hợp với một nút thực thi, đưa đầu vào qua một cổng và xuất qua cổng khác. Kết quả là, tôi đã ghi điểm này giống như một hàm (tức là không tính các byte cần thiết để tạo tệp giả lập MCxxxx hợp lệ).



1

Haskell , 62 58 byte

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

Hãy thử trực tuyến!

Giải trình

Điều này xây dựng chuỗi sau:

5122255555555555555551222555555122255555512225555551222555555122255555512225555551222555555122255555 ...

Đó là một bảng trong đó ô nchứa câu trả lời cho nthsố. Bảng chỉ đúng cho 100 phần tử đầu tiên, do đó mod.


Bạn có thể giải thích những gì đang xảy ra ở đây? Bạn chắc chắn có thể rút ngắn nó bằng cách sử dụngf n|s<-"5122255555"=(s++('5'<$[0..9])++cycle s)!!mod n 100
flawr

Tôi không biết điều đó là có thể!
bartavelle

1
Có rất nhiều mẹo và thủ thuật khác trong codegolf.stackexchange.com/questions/19255/NH thực sự đáng đọc =)
flawr

0

Scala, 110 byte

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

0

Turtlèd, 35 byte

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

Hãy thử trực tuyến!

Hàm này yêu cầu đầu vào bắt đầu bằng a>, mà tôi đoán là ok vì python2 sử dụng semi input thường xuyên và cần báo giá.

Giải trình:

!             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

>phục vụ mục đích trong Turtled hay đó là một ký tự tùy ý bạn đã thêm vào đầu vào?
Shaggy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.