Unicode Kesirler


21

Biçimdeki bir kesir göz önüne alındığında m/n(m ve n'nin eşzamanlı tamsayılar olduğu), karşılık gelen Unicode kesirini verin. Programınızın / fonksiyonunuzun Unicode karakteriyle uyuşmayan herhangi bir giriş yapması beklenmez. Diziler, örneğin [2, 3], aksine 2/3, kabul edilir. m / naksine olarak m/nda iyidir. İki ayrı giriş mve nayrıca geçerlidir.

Ele alınması gereken Unicode fraksiyonları aşağıdaki gibidir:

½, ⅓, ⅔, ¼, ¾, ⅕, ⅖, ⅗, ⅘, ⅙, ⅚, ⅐, ⅛, ⅜, ⅝, ⅞, ⅑, ⅒

Böylece, olası girişler aşağıdaki gibidir:

1/2, 1/3, 2/3, 1/4, 3/4, 1/5, 2/5, 3/5, 4/5, 1/6, 5/6, 1/7, 1/8, 3/8, 5/8, 7/8, 1/9, 1/10

Karakterlerin Unicode kod noktaları aşağıdaki gibidir:

188 ¼
189 ½
190 ¾
8528 ⅐
8529 ⅑
8530 ⅒
8531 ⅓
8532 ⅔
8533 ⅕
8534 ⅖
8535 ⅗
8536 ⅘
8537 ⅙
8538 ⅚
8539 ⅛
8540 ⅜
8541 ⅝
8542 ⅞

Test Kılıfları

1/2 -> ½
1/3 -> ⅓
2/3 -> ⅔
1/4 -> ¼
3/4 -> ¾
3/8 -> ⅜
1/10 -> ⅒

Kodunuzu mümkün olduğunca kısa yapın; bu kod golf.


Her kesir için unicode kod noktalarını ekleyebilir misiniz?
Rod,

4
188 ¼, 189 ½, 190 ¾, 8528 ⅐, 8529 ⅑, 8530 ⅒, 8531 ⅓, 8532 ⅔, 8533 ⅕, 8534 ⅖, 8535 ⅗, 8536 ⅘, 8537 ⅙, 8538 ⅚, 8539 ⅛, 8540 ⅜, 8541 ⅝, 8542 ⅞
Sızdıran Rahibe

Unicode karakterlerle uyuşmayan herhangi bir girişe izin vermeniz beklenmez. Bu, geçersiz girdileri saptamamız gerektiği anlamına mı geliyor? Ya da bunun olmaması gerekiyordu?
Arnauld,

@Arnauld İkincisi.
user202729,

Giriş, bir kesriyi temsil eden bir nesne olabilir mi?
Brad Gilbert

Yanıtlar:


14

JavaScript (Node.js) , 78 77 bayt

@HermanLauenstein sayesinde 1 bayt kaydedildi

Körleme sözdiziminde girdi alır (m)(n).

m=>n=>'¾⅗  ⅜    ⅞⅘½⅓¼⅕⅙⅐⅛⅑⅒⅚⅔⅝⅖'[(m*9+n)%31]

Çevrimiçi deneyin!


@ user202729 Eminim başka bir yerde benzer bir formül kullandım. Yine de hangi meydan okuma için hatırlamıyorum. Şimdi, karakterleri birlikte oluşturmaya çalışmak faydalı olabilir String.fromCharCode(), ancak benzer bir bayt sayısı beklerdim.
Arnauld,


@HermanLauenstein Teşekkürler! (Ben bunu kaçırdım çünkü başlangıçta sadece en küçük modülü arıyordum. Sondaki boş yuvaları çıkarmaya başladığımda XOR yöntemine geçmiştim.)
Arnauld

Ve cevabınızı çok erken gönderirseniz, insanların yaklaşımınızı çoğunlukla kullanmalarını sağlayacak ...
user202729

12

Perl 6 ,  48  43 bayt

{chr first *.unival==$^m/$^n,(|^191,|(8528..*))}

Dene

{chr first *.unival==$_,(|^191,|(8528..*))}

Dene

Expanded:

{  # bare block lambda with implicit parameter 「$_」
  chr

    first               # find the first value

      *.unival ==       # which has a unicode value that matches
          $_,           # the input fraction (as a Rational)

      (
        |^191,     # ¼(189) ½(188) ¾(190)
        |(8528..*) # all of the rest
      )
}

Aramanın, aynı birliğe sahip olan diğer Unicode karakterleri döndürmeyecek şekilde bölünmesi gerektiğini unutmayın. (aksi takdirde olur (1..*))


3
Bekle, Perl 6 bu kesin şey için yerleşik mi?
Outgolfer Erik

2
@EriktheOutgolfer Buna nasıl bakacağımı bilmiyorum ama evet, dosyadaki Unicode Karakter Veritabanından 9. sütunda yansıyan kod noktasının sayısal değerine erişebilirsiniz UnicodeData.txt. Örneğin, U + 109BC MEROITIC CURSIVE FRACTION ELEVEN TWELFTHSkarakter özelliğine sahiptir nv=11/12. Boş olmayan sayısal değerlere sahip 1500 kod noktası var; bu küçük zorluktan çok, çözülmesi gerekenlerden daha fazla. Bunlar tam sayılar veya rasyonellerdir.
tristrist

7

JavaScript (ES6), 88 86 84 81 79 bayt

@Arnauld sayesinde 2 bayt kaydedildi

m=>n=>String.fromCharCode((4%n?8528:188)|"  130470912"[n]*1.3+~-m/-~"3 1"[n-6])

Diğer JS cevapları kadar kısa değil, ama her kesirin kod noktasını matematiksel olarak hesaplamak eğlenceliydi.

Test pasajı

Eski yöntem (82 bayt):

m=>n=>String.fromCharCode((4%n?8539:189)-("0x"+"  08162b0a9"[n])+~-m/-~"3 1"[n-6])

@Arnauld sayesinde bu seferinde 4 bayt kaydedildi.


1
Her iki sürümde de -2 bayt-~'3 1'[n-6]
Arnauld

7

APL (Dyalog) , 88 64 bayt

{⎕UCS(⌊(⍺-1)÷(1+⍵≡8)⌈4×⍵≡6)-(291194049⊤⍨1012)[⍵]-1898539××⍵|4}

Çevrimiçi deneyin!

-3 dzaima sayesinde .

ETHproductions'un 84 baytlık yaklaşımını kullanarak.

f←Sadece işlevini test edebilmek için oraya koymak beri TIO dahil, sayılmaz.


2

SOGL V0.12 , 51 bayt

5*+'æ%'⁵%"∫}ΣS“LI─{"#!“+ζ}¹"¾ŗŗŗŗŗŗ⅛ŗ⅜½⅝ŗ⅞ ⅓⅔ŗ  ¼”W

Burada dene!

haritalamayı kullanır (m + n*5)%33%22

Açıklama:

5*                        multiply the 1st input by 5
  +                       add to the 2nd input
   'æ%                    modulo 33
      '⁵%                 module 22

"∫}ΣS“                    push 2153527158
      LI─                 base 11 decode that - [10 0 5 6 7 8 9 1 2]
         {     }          for each of that
          "#!“+             add 8528
               ζ            and convert to a character
                "...”     push "¾ŗŗŗŗŗŗ⅛ŗ⅜½⅝ŗ⅞ ⅓⅔ŗ  ¼", replacing ŗ with each character of the above array
                     W    and get the (m + n*5)%33%22th item from that

2

Clojure, 127 bayt

(comp{2/3\⅔ 4/5\⅘ 1/3\⅓ 1/2\½ 5/6\⅚ 1/5\⅕ 1/4\¼ 3/5\⅗ 1/7\⅐ 3/4\¾ 2/5\⅖ 1/6\⅙ 1/9\⅑ 1/8\⅛ 3/8\⅜ 1/10\⅒ 5/8\⅝ 7/8\⅞}read-string)

Girdi olarak alan "1/2"ve karşılık gelen karakteri döndüren adsız bir işlev .

Bir Clojure'den Ratiokesir karakterine kadar düz bir eşleme . compve Clojure haritalarının fonksiyonlar olduğu gerçeği burada gerçekten yardımcı oldu. read-stringHaritadaki tüm şişirici tırnakları atmama izin verdiğinden, oran türünü değerlendirmek için dize girişini geçirmem gerekiyordu . compbu noktaya değinmeme izin ver, güzeldi. "Dolu" kodu şöyle olacaktır:

(defn to-unicode-fraction [frac]
  (get {2/3\⅔ 4/5\⅘ 1/3\⅓ 1/2\½ 5/6\⅚ 1/5\⅕ 1/4\¼ 3/5\⅗ 1/7\⅐,
        3/4\¾ 2/5\⅖ 1/6\⅙ 1/9\⅑ 1/8\⅛ 3/8\⅜ 1/10\⅒ 5/8\⅝ 7/8\⅞}
       (read-string frac)))

Diğer cevapları inceledikten sonra, bu yaklaşımın oldukça naif olduğunu anladım. Bunu iyileştirmenin yollarını arıyorum.



1

Kömür , 77 48 46 bayt

F§§⪪“YW³⦄Eν~vγ@⊖Xμ~?Iw⸿M➙b℅¦⦃”,NN℅⁺℅ι×⁹⁰∨№βι⁹⁴

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Düzenleme: ASCII karakterlerinden çok baytlı karakterlere eşleme yaparak 29 31 bayt kaydedildi . Açıklama:

    “....”                  Compressed string `R,EFcGbIMDO,H J,K  Pd,L,N Q,`
   ⪪      ,                 Split on commas
           N                First input
  §                         Circularly index
            N               Second input
 §                          Circularly index
F                           "Loop over" character (loop variable `i`)
                     №βι    Count of `i`s in lowercase letters
                    ∨   ⁹⁴  Replace zero result with 94
                 ×⁹⁰        Multiply by 90
               ℅ι           Take ordinal of `i`
              ⁺             Sum
             ℅              Convert back to character
                            Implicitly print


0

Python 3, 97 bayt

lambda m,n:'½ ⅓⅔ ¼_¾ ⅕⅖⅗⅘ ⅙___⅚ ⅐ ⅛_⅜_⅝_⅞ ⅑ ⅒'.split()[n-2][m-1]

2
Bu işe yaramadı, [n-2][m-1]bunun yerine ihtiyacınız var .
Outgolfer Erik

Doğru, sanırım önce test etmedim ...
Ryan McCampbell

0

Vim Komut Dosyası, 67 bayt

fu!F(m,n)
if a:n==10|norm a⅒ 
else|exe'norm a'.a:m.a:n
endif
endfu

İşlev, Vim'in kendilerine başladıktan sonra girilen digraph'ları ile çalışır. ctrl-k.Anlaşılan, yukarıdaki kod bloğunda gösterilmedikten ctrl-ksonra ilgili karakter exe'norm.

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.