เขียนฟังก์ชั่นเป็นพหูพจน์สำหรับภาษารัสเซีย


25

ในภาษาอังกฤษคำนามสามารถใช้สองรูปแบบที่แตกต่างกันขึ้นอยู่กับว่าพวกเขาเป็นเอกพจน์ (หนึ่ง) หรือพหูพจน์ (สิ่งอื่น) ตัวอย่างเช่นเราจะพูดว่า "1 สุนัข" แต่ "สุนัข 2 ตัว", "0 สุนัข", "57 สุนัข" เป็นต้น

ในรัสเซียมีสามประเภท แทนที่จะเป็น "สุนัข 1 ตัว, สุนัข 2 ตัว, สุนัข 5 ตัว" ในภาษารัสเซียมันจะเป็น "1 собака, 2 собаки, 5 собак"

หมวดหมู่จะถูกแบ่งตามตรรกะต่อไปนี้:

  • "เอกพจน์": ใช้สำหรับ 1 และหมายเลขใด ๆ ที่ลงท้ายด้วย 1 ยกเว้นตัวเลขที่ลงท้ายด้วย 11
    • ตัวอย่าง: 1 собака, 21 собака, 101 собака
  • "Few": ใช้สำหรับ 2, 3 และ 4 และหมายเลขใด ๆ ที่ลงท้ายด้วย 2, 3 หรือ 4 ยกเว้นตัวเลขที่ลงท้ายด้วย 12, 13 และ 14
    • ตัวอย่าง: 2 собаки, 3 собаки, 4 собаки, 32 собаки, 43 собаки, 104 собаки
  • "หลายคน": สิ่งใดก็ตามที่ไม่ถือว่าเป็น "เอกพจน์" หรือ "ไม่กี่"
    • ตัวอย่าง: 0 собак, 5 собак, 11 собак, 13 собак, 25 собак, 111 собак, 111 собак, 114 собак

ความท้าทาย

กำหนดอินพุตจำนวนเต็มในช่วง [0, 1,000] ส่งคืน1หากเป็นของหมวดหมู่ "เอกพจน์" 2หากเป็นของหมวดหมู่ "ไม่กี่" และ5หากอยู่ในหมวดหมู่ "จำนวนมาก"

โปรแกรมของคุณอาจเป็นฟังก์ชันหรือสามารถใช้ STDIN ได้ คุณอาจพิมพ์ไปที่ STDOUT หรือคืนค่าจากฟังก์ชั่น

นี่เป็นความท้าทายของการเล่นกอล์ฟดังนั้นการแก้ปัญหาที่มีจำนวนไบต์น้อยที่สุดจึงเป็นทางออก



2
ทำไม1, 2และ5โดยเฉพาะอย่างยิ่ง? นอกจากนี้ทำไมฉันไม่สามารถใช้รหัสออกได้
เครื่องคิดเลขคำนวณ

6
@ ฟีนิกซ์นั่นฟังดูผิดมากสำหรับฉัน - ภาษารัสเซียพัง - ฉันมักจะใช้แบบฟอร์มในคำถามและฉันคิดว่ามันถูกต้องและเห็นได้ชัดว่ามันเป็น
dkudriavtsev

2
@CalculatorFeline หากคุณเริ่มนับจาก 1 คุณจะได้รับเอกพจน์ที่ 1 ไม่กี่ครั้งแรกที่เกิดขึ้นที่ 2 หลายครั้งแรกปรากฏขึ้นที่ 5 ทำให้รู้สึกที่สมบูรณ์แบบ :-)
LLlAMnYP

5
การนับเป็นภาษารัสเซียนั้นยากมาก มันอาจจะเป็นที่น่าสังเกตว่าตัวเลขหลักสุดท้ายเป็นตัวกำหนดกรณีและปัญหา 1 = เอกพจน์เชิงเสนอ 2,3,4 = เอกพจน์เชิงซ้อน, 5-0 พหูพจน์เชิงซ้อน การเปลี่ยนแปลงนี้กับกรณีของวลีและเนื่องจากมี 6 กรณีมี 24 รูปแบบ 'หนึ่ง' (ซึ่งเป็นผู้ชาย), 24 รูปแบบของ 'สอง' (ซึ่งเป็นผู้หญิง) และอื่น ๆ ได้มีการกล่าวถึงศาสตราจารย์ชาวรัสเซียในมหาวิทยาลัยท้องถิ่นของฉันว่าไม่น่าจะแปลได้ " กับสุนัข 2345 ตัว" เพราะ 'กับ' เรียกร้องกรณีที่เป็นเครื่องมือ (ยาก)
smirkingman

คำตอบ:


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]

เพื่อให้ได้ผลลัพธ์ที่ต้องการตอนนี้เราเพียงแค่ต้อง map ซึ่งเราจะทำอย่างไรกับตัวเลือกสตริง0->5, 1->5, 2->2, 1->1'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การเลื่อนบิตเสมอไปที่ 0 หรือ 1 ซึ่งให้เอาต์พุต 5 ตามต้องการ


7
กรุณาอธิบาย.
เครื่องคิดเลข


8

Perl 5 , 26 ไบต์

25 ไบต์ของรหัส + -pธง

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

ลองออนไลน์!

$_=/(?<!1)[1-4]$/?2-/1$/:5สำหรับอีกหนึ่งไบต์มี

คำอธิบาย: (ในรุ่น 27 bytes; 26 ค่อนข้างสมมาตร)
ทั้ง "เอกพจน์" และ "น้อย" จบด้วย "ไม่ใช่ 1 ตามด้วยตัวเลขจาก 1 ถึง 4" (ทดสอบด้วย(?<!1)[1-4]$/) ในกรณีเหล่านั้นผลลัพธ์คือ 2 ลบ 1 ถ้าตัวเลขลงท้ายด้วย 1 ( 2-/1$/) มิฉะนั้นผลลัพธ์จะเท่ากับ 5


5
tfw Perl ชนะ 05AB1E ด้วยราคายุติธรรม
Erik the Outgolfer

7

JavaScript (ES6), 53 49 48 40 39 38 37 36 ไบต์

n=>/[05-9]$|1.$/.test(n)?5:1+(n%5>1)
  • ที่บันทึกไว้ 8 ไบต์ขอบคุณที่CalculatorFeline
  • ที่บันทึกไว้ 1 ไบต์ขอบคุณที่ETHproductions
  • บันทึกแล้ว 1 ไบต์ขอบคุณJohan

ลองมัน

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 - ดีเห็นในครั้งแรกหนึ่ง :)
ปุย

ฉันไม่คิดว่าคุณต้องการเอกภาพ+เลยs%10ควรแปลงsเป็นตัวเลข
ETHproductions

ใช่เพิ่งรู้เช่นกันว่า @ETHproductions
Shaggy

1
n%10-> n%5บันทึกไบต์
Johan Karlsson

4

เยลลี่ ,  19  18 ไบต์

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

ลิงก์ monadic ที่รับและส่งคืนจำนวนเต็มที่ไม่เป็นลบ

ลองออนไลน์! หรือดูสามกลุ่มตั้งแต่ 0 ถึง 1,000 รวมอยู่ในชุดทดสอบนี้

อย่างไร?

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

•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 ฉันคิดว่ามีบางอย่างผิดปกติที่นี่
Pavel

@Phoenix: ใช่ ความท้าทายนี้เหมาะกับการจดจ่อหรือฉันทำอะไรผิดไปมาก :) เพื่อความยุติธรรม Perl มักจะเล่นกอล์ฟได้สวย
Emigna

4
@Enigma ... และ Perl golfers มักจะดีมากใช่มั้ย ;-)
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 คำแนะนำการทดสอบจะตั้งค่าสถานะเพื่อระบุว่าควรจะใช้สาขาใด บรรทัดที่ขึ้นต้นด้วย+จะถูกดำเนินการเฉพาะเมื่อการทดสอบล่าสุดส่งคืนจริงและบรรทัดที่ขึ้นต้นด้วย-จะดำเนินการเฉพาะในกรณีที่การทดสอบเป็นเท็จ

ทีละบรรทัด:

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 ไม่มีฟังก์ชั่นต่อ se แต่นี่ใกล้เคียงกับฟังก์ชั่นที่คุณจะได้รับมันเป็นโปรแกรมที่เหมาะกับโหนดเรียกใช้งานเดียวใช้อินพุตผ่านพอร์ตหนึ่งและส่งผ่านอีกพอร์ต เป็นผลให้ฉันได้รับคะแนนเช่นนี้เป็นฟังก์ชั่น (เช่นโดยไม่นับไบต์ที่จำเป็นในการสร้างไฟล์จำลอง MCxxxx ที่ถูกต้อง)



1

Haskell , 62 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
flawr

ฉันไม่รู้ว่ามันเป็นไปได้!
bartavelle

1
มีเคล็ดลับอื่น ๆ อีกมากมายและเทคนิคในการเป็นcodegolf.stackexchange.com/questions/19255/...คุ้มค่าจริงๆอ่าน =)
flawr


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 หรือมันเป็นตัวละครโดยพลการที่คุณได้เพิ่มการป้อนข้อมูลหรือไม่
Shaggy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.