रूसी के लिए एक बहुवचन फ़ंक्शन लिखें


25

अंग्रेजी में, संज्ञाएं दो अलग-अलग रूपों पर ले सकती हैं, इस पर निर्भर करता है कि वे एकवचन (एक) या बहुवचन (कुछ भी) हैं। उदाहरण के लिए, हम "1 कुत्ता" कहेंगे लेकिन "2 कुत्ते", "0 कुत्ते", "57 कुत्ते" और इसके बाद।

रूसी में, तीन श्रेणियां हैं। "1 कुत्ते, 2 कुत्ते, 5 कुत्ते" के बजाय, रूसी में यह "1 собака, 2 собаки, 5 собак" होगा।

श्रेणियों को निम्नलिखित तर्क के अनुसार विभाजित किया गया है:

  • "एकवचन": 11 में समाप्त होने वाली संख्याओं को छोड़कर, 1 के लिए और 1 में समाप्त होने वाली किसी भी संख्या के लिए उपयोग किया जाता है।
    • उदाहरण: 1 собака, 21 собака, 101 собака
  • "कुछ": 12, 13 और 14 में समाप्त होने वाली संख्याओं को छोड़कर 2, 3, और 4, और 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विशेष रूप से? इसके अलावा, मैं बाहर निकलने के कोड का उपयोग क्यों नहीं कर सकता?
कैलक्यूलेटरफलाइन

6
@Phoenix जो मुझे पूरी तरह से गलत लगता है - टूटी हुई रूसी - मैंने हमेशा प्रश्न में फॉर्म का उपयोग किया है और मुझे यह सही लगता है, और जाहिर तौर पर यह है
dkudriavtsev

2
@ कैलाकेटरफलाइन यदि आप 1 से गिनना शुरू करते हैं, तो आपको 1 में एकवचन मिलता है, कुछ पहले 2 पर होता है, कई पहले 5 पर दिखाई देता है। सही अर्थ :-) बनाता है
LLLAMnYP

5
रूसी में गिनती बेहद कठिन है। यह शायद ध्यान देने योग्य है कि अंतिम अंक मामले को निर्धारित करता है । 1 = नाभिकीय एकवचन 2,3,4 = आनुवांशिक एकवचन, 5-0 जनन बहुवचन। यह वाक्यांश के मामले के साथ बदलता है, और जैसा कि 6 मामले हैं, '24' के 24 रूप हैं (जो कि मर्दाना है), 'दो' (जो कि स्त्री) के 24 रूप हैं और इसी तरह। यह कहा जाता है कि मेरे स्थानीय विश्वविद्यालय में रूसी के प्रोफेसर " 2345 कुत्तों के साथ " अनुवाद करने में सक्षम होने की संभावना नहीं होगी , क्योंकि 'के साथ' वाद्य मामले (एक कठिन) की मांग करता है।
स्मरकिंगमैन

जवाबों:


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]

लेकिन, nmodulo 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

यहाँ से, फर्श को विभाजित करके /-33 के चौकों को सही शुरुआत स्थान दिया गया है

> [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, जिसे हम स्ट्रिंग चयन के साथ करते हैं '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
कृपया समझाएँ।
कैलक्यूलेटरफलाइन

12

पायथन 2 , 45 बाइट्स

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

इसे ऑनलाइन आज़माएं!


o_O मैं उड़ गया ... मेरे पास 56 बाइट्स थे: \
मिस्टर एक्सकोडर

इसके अलावा, (s+'5'*10+s*9)110 वर्ण नहीं है ?
कैलक्यूलेटरफलाइन

@CalculatorFeline हम्म, कॉफ़ी पाने का समय @। @
रॉड

5
@Rod या एक covfefe?
निक टी

8

पर्ल 5 , 26 बाइट्स

कोड + -pध्वज के 25 बाइट्स ।

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

इसे ऑनलाइन आज़माएं!

एक और बाइट के लिए है $_=/(?<!1)[1-4]$/?2-/1$/:5

स्पष्टीकरण: (27 बाइट्स संस्करण पर; 26 काफी सममित है)
दोनों "एकवचन" और "कुछ" अंत के साथ "1 नहीं 1 अंक से 1 से 4" (परीक्षण के साथ (?<!1)[1-4]$/)। उन मामलों में, परिणाम 2, शून्य से 1 है यदि संख्या 1 ( 2-/1$/) के साथ समाप्त होती है । अन्यथा, परिणाम यदि 5।


5
tfw पर्ल एक उचित राशि द्वारा 05AB1E को हराता है।
आउट्रिकोलर

7

जावास्क्रिप्ट (ईएस 6), 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। कभी नहीं भूलना चाहिए +!
कैलक्यूलेटरफैलिन

धन्यवाद, @ कलकटरफलाइन - अच्छी तरह से पहले एक पर देखा :)
झबरा

मुझे नहीं लगता कि आपको एकतरफा जरूरत है +, एक संख्या में s%10परिवर्तित होना चाहिए s
ETHproductions

हाँ, यह भी एहसास हुआ कि @ETHproductions।
झबरा


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 अच्छी तरह से मैं बेहतर नहीं मिल सकता है; स्पष्टीकरण जोड़ा गया।
जोनाथन एलन

कौन से वर्ण एन्कोडिंग में उन 18 वर्णों को 18 बाइट्स द्वारा दर्शाया जा सकता है?
एक्सबुक

@exebook जेली
GamrCorps

3

05AB1E , 38 19 बाइट्स

रॉड के अजगर जवाब से सूचकांक-चाल का उपयोग करता है

•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
आप पर्ल से हार रहे हैं, मुझे लगता है कि यहां कुछ गलत है।
पावेल

@Penenix: हाँ। या तो यह चुनौती रेगेक्स के लिए अच्छी तरह से अनुकूल है या मैं कुछ गलत कर रहा हूं :) निष्पक्ष होने के लिए, पर्ल अक्सर सुंदर गोल्फ है।
एमिग्ना

4
@ इनिग्मा ... और पर्ल गोल्फर्स अक्सर बहुत अच्छे होते हैं, है ना? ;-)
दादा

@ दादा: बहुत सच!
एमिग्ना

कृपया स्पष्टीकरण दें।
कैलक्यूलेटरफैलिन


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

ध्यान दें:

टीआईओ इस भाषा का समर्थन नहीं करता है, जिसका उपयोग ज़ैक्ट्रोनिक्स गेम शेन्ज़ेन 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 असेंबली में प्रति कार्य नहीं है, लेकिन यह एक फ़ंक्शन के करीब है जैसा कि आप प्राप्त कर सकते हैं - यह एक प्रोग्राम है जो एकल निष्पादन नोड में फिट बैठता है, एक पोर्ट के माध्यम से इनपुट लेता है और दूसरे के माध्यम से आउटपुट करता है। नतीजतन, मैंने इसे एक फ़ंक्शन की तरह स्कोर किया है (यानी वैध MCxxxx एमुलेटर फ़ाइल बनाने के लिए आवश्यक बाइट्स की गिनती के बिना)।


2

रेटिना , 25 21 बाइट्स

1.$
5
T`d`512225
!`.$

इसे ऑनलाइन आज़माएं! -4 बाइट्स नील को धन्यवाद।


1
!`.$अंतिम अंक निकालने के लिए उपयोग करके 4 बाइट्स सहेजें । इसे ऑनलाइन आज़माएं!
नील

मुझे पता था कि एक बेहतर तरीका था!
कैलक्यूलेटरफैनलाइन

1

हास्केल , 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
दोष

मुझे नहीं पता था कि यह संभव था!
बर्तवेल्ले

1
Codegolf.stackexchange.com/questions/19255/… वास्तव में पढ़ने लायक =) में बहुत अधिक टिप्स और ट्रिक्स हैं
13

0

स्काला, 110 बाइट्स

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

0

टर्टल, 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

>कछुए में एक उद्देश्य की सेवा करता है या क्या यह एक मनमाना चरित्र है जिसे आपने इनपुट में जोड़ा है?
झबरा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.