Rusça için çoğulculuk işlevi yaz


25

İngilizce'de isimler tekil (bir) veya çoğul (başka bir şey) olmalarına bağlı olarak iki farklı formda olabilir. Örneğin, "1 köpek" ama "2 köpek", "0 köpek", "57 köpek" ve benzerlerini söyleyebiliriz.

Rusçada üç kategori var. "1 köpek, 2 köpek, 5 köpek" yerine, Rusçada "1 собака, 2 собаки, 5 собак" olur.

Kategoriler aşağıdaki mantığa göre ayrılmıştır:

  • "Tekil": 11 ile biten sayılar hariç, 1 ve 1 ile biten herhangi bir sayı için kullanılır.
    • Örnekler: 1 собака, 21 собака, 101 собака
  • "Az": 2, 3 ve 4 için ve 12, 13 ve 14 ile biten sayılar hariç, 2, 3 veya 4 ile biten herhangi bir sayı için kullanılır.
    • Örnekler: 2 собаки, 3 собаки, 4 собаки, 32 собаки, 43 собаки, 104 собаки
  • “Çok”: “Tekil” veya “Az” olarak kabul edilmeyen her şey.
    • Örnekler: 0 собак, 5 собак, 11 собак, 13 собак, 25 собак, 111 собак, 114 собак

Meydan okuma

[0, 1000] aralığında bir tamsayı girişi verildiğinde 1, "tekil" kategorisine 2aitse, "az" kategorisine aitse geri dönün ve5 aitse ve "çok" kategorisine .

Programınız bir fonksiyon olabilir veya STDIN kullanabilir. STDOUT'a yazdırabilir veya işlevden bir değer döndürebilirsiniz

Bu bir kod golf mücadelesidir, bu yüzden en az bayt sayısına sahip olan çözüm kazanır.



2
Neden 1, 2ve 5özellikle? Ayrıca, neden çıkış kodlarını kullanamıyorum?
CalculatorFeline

6
@Phoenix Bu bana tamamen yanlış geliyor - Rusça kırılmış - Her zaman sorudaki formu kullandım ve doğru buldum ve görünüşe göre öyle
dkudriavtsev

2
Eğer 1'den saymaya başlarsanız @CalculatorFeline, sen 1 de tekil olsun, birkaç ilk 2'de oluşur 5. birçok birinci gösterisi yukarı :-) mükemmel mantıklı
LLlAMnYP

5
Rusçada saymak son derece zor. Son rakamın olayı belirlediğine dikkat etmek belki de değer . 1 = Nominal olan tekil 2,3,4 = Genel tekil, 5-0 Genel çoğul. Bu durum, cümlenin durumunda değişir ve 6 vaka olduğu gibi, 24 'bir' formunu (erildir), 24 'iki' formunu (kadınsıdır) vb. Vardır. "Tercüme edebilmek pek mümkün olurdu benim yerel üniversitede Rusça profesörü söylenir ile enstrümantal durum (sert bir) talep 'ile' çünkü, 2345 köpekler".
smirkingman

Yanıtlar:


15

Python 2,36 bayt

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

Çevrimiçi deneyin!

Aritmetik olarak aynı uzunluk:

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

Önce gençleri hesaba katmayan daha basit koda bakalım.

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

Burada, birinin basamağının gibi çalışan bir çıktıya eşlenmesini istiyoruz.

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

Ancak, nmodulo 10 ( %10) almak yerine , kalanları vermek n%-10için aralıklarla [-9..0]eşlenen yapabiliriz:

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

Bu umut verici çünkü ilk iki giriş 0ve -9birbirinden ayrı ve farklı çıktılara gönderilmeleri gerekiyor. Ayrıca, -10kısaltılabilir~9 .

Buradan, kat /-3bölü 3 ile topaklara doğru başlangıç ​​noktası verilir.

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

İstenilen çıktıyı elde etmek için, şimdi sadece 0->5, 1->5, 2->2, 1->1dize seçimi ile yaptığımız eşlememiz gerekir '5521'[_].

Şimdi, her zaman vermek için 11 ile 15 arasında biten sayılara da ihtiyacımız var 5. Bunu ilk önce onlarca rakam olup olmadığını tespit ederek yapıyoruz 1. n/10Son basamağı alarak %~9, sonuçları almak için önceki gibi uygularız .

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

ilgili son rakamlar için. Algılamak istediğimiz 1 rakamı en uç değerle eşleştirilir -9. Zemine bölme işlemi -91'e ve her şey 0'a döner.

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

Son olarak, bu göstergenin 1her zaman 5 çıktısını vermesini sağlıyoruz n%~9/-3. Her 0,1,2,3zaman bit değişiminin sonucu 0 veya 1'e çıkar ve bu da istenildiği gibi 5 çıkışı verir.


7
Lütfen açıkla.
CalculatorFeline


8

Perl 5 , 26 bayt

25 baytlık kod + -pbayrak.

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

Çevrimiçi deneyin!

Bir bayt daha var $_=/(?<!1)[1-4]$/?2-/1$/:5.

Açıklamalar: (27 bayt sürümünde, 26 oldukça simetriktir)
Hem "tekil" hem de "az", "1" değil, ardından 1 ile 4 arasında bir rakam ("ile test edilir") biter (?<!1)[1-4]$/. Bu durumda, sayı 1 ( 2-/1$/) ile bitiyorsa sonuç 2, eksi 1'dir . Aksi takdirde, sonuç 5 ise.


5
tfw Perl 05AB1E'yi adil bir miktarda yener.
Outgolfer Erik

7

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

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

Dene

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]olabilir 1.ve /1$/.test(s)olabilir +s%10==1. Asla unary unutma +!
Hesap MakinesiFeline

Teşekkürler, @CalculatorFeline - ilkinde iyi tespit edildi :)
Shaggy

Birliğe ihtiyacın olduğunu sanmıyorum +, bir sayıya s%10dönüştürmelisin s.
ETHProductions

Yup, sadece şunu da farkettim, @ETHproductions.
Shaggy

1
n%10-> n%5Bir bayt kazandırır
Johan Karlsson

4

Jöle ,  19  18 bayt

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

Negatif olmayan tamsayıları alıp geri veren monadik bir bağlantı.

Çevrimiçi deneyin! veya bu test takımında 0 ila 1000 arasında bulunan üç grubu görün.

Nasıl?

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
Açıklama lütfen.
Hesap MakinesiFeline

@CalculatorFeline hala golf üzerinde çalışıyor ...
Jonathan Allan

@CalculatorFeline iyi Daha iyi bulamıyorum; açıklama eklendi.
Jonathan Allan

Hangi karakteri kodlayan bu 18 karakter 18 bayt ile temsil edilebilir?
exebook

@exebook Jelly kendi kod sayfasını kullanıyor
GamrCorps

3

05AB1E , 38 19 bayt

Rod's python cevabından index-hile kullanır

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

Çevrimiçi deneyin!

açıklama

•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'e kaybediyorsun, bence burada bir şeyler yanlış.
Pavel

@Phoenix: Evet. Ya bu zorluk regex için çok uygun ya da çok yanlış bir şey yapıyorum :) Adil olmak gerekirse, Perl genellikle oldukça golf oynuyor.
Emigna

4
@Enigma ... ve Perl golfçüler genelde çok iyi, değil mi? ;-)
Dada

@Dada: Çok doğru!
Emigna

Açıklama lütfen.
Hesap MakinesiFeline


2

MCxxxx Meclisi , 123 Bayt

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

Not:

TiO, Zachtronics oyunu Shenzhen I / O oyununda kullanılan bu dili desteklemiyor , bu yüzden bunu test edecek bir bağlantı yok.

Açıklama:

Bu, XBus portu x0 üzerinden giriş alan ve x1 portu üzerinden çıkan bir fonksiyondur. Bir MC4000'de yürütmek çok uzun, ancak bir MC6000'in belleğine çok iyi uyuyor. XBus portları, bilinmeyenler için, ayrı ayrı dijital veri paketlerinin iletilmesine izin verir.

Bunu okumakta yardımcı olabilecek bir bilgi parçası: MCxxxx düzeneğinde test talimatları, hangi dalın alınması gerektiğini belirten bir bayrak belirler. Başlayan satırlar +, yalnızca en son testin doğru -olması durumunda gerçekleştirilir ve başlanan satırlar , yalnızca test yanlışsa uygulanır.

Satır satır:

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

Puanlama ile ilgili bir not: MCxxxx düzeneği kendi başına fonksiyonlara sahip değildir, ancak bu sizin alabileceğiniz bir fonksiyona yakındır - tek bir yürütme düğümüne uyan, bir porttan giriş alan ve diğerinden çıkan bir programdır. Sonuç olarak, bunu bir fonksiyon gibi puanladım (yani geçerli bir MCxxxx öykünme dosyası yapmak için gereken baytları saymadan).



1

Haskell , 62 58 bayt

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

Çevrimiçi deneyin!

açıklama

Bu, aşağıdaki dize oluşturur:

5122255555555555555551222555555122255555512225555551222555555122255555512225555551222555555122255555 ...

Hangi sayının ncevabını içeren hücrenin bulunduğu tablo nth. Tablo sadece ilk 100 eleman için doğrudur, dolayısıyla mod.


Burada neler olduğunu açıklayabilir misin? Kullanarak kesinlikle kısaltabilirsinizf n|s<-"5122255555"=(s++('5'<$[0..9])++cycle s)!!mod n 100
kusur

Bunun mümkün olduğunu bilmiyordum!
bartavelle

1
Codegolf.stackexchange.com/questions/19255/… adresinde gerçekten çok fazla ipucu ve püf noktaları var =)
kusur

0

Scala, 110 bayt

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

0

Turtlèd, 35 bayt

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

Çevrimiçi deneyin!

Bu işlev, girişin bir> ile başlamasını gerektirir, çünkü bence tamam, python2 düzenli olarak girdi yarılarını kullanır ve bunun için tırnak gerekir.

Açıklama:

!             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'de bir amaca hizmet ediyor mu , yoksa girdiye eklediğiniz keyfi bir karakter mi?
Shaggy,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.