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⊤⍨10⌿12)[⍵]-189⌈8539××⍵|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.