Frações Unicode


21

Dada uma fração no formato m/n(onde m e n são números inteiros de coprime), imprima a fração Unicode correspondente. Não se espera que seu programa / função receba nenhuma entrada que não corresponda a um caractere Unicode. Matrizes, por exemplo [2, 3], ao contrário 2/3, são aceitas. m / nao contrário m/ntambém é bom. Duas entradas separadas me ntambém são válidas.

As frações Unicode que devem ser tratadas são as seguintes:

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

Assim, as entradas possíveis são as seguintes:

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

Os pontos de código Unicode dos caracteres são os seguintes:

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

Casos de teste

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

Faça seu código o mais curto possível; isso é código de golfe.


Você pode adicionar os pontos de código unicode para cada fração?
Rod

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

Você não deverá permitir nenhuma entrada que não corresponda a um caractere unicode. Isso significa que devemos detectar entradas inválidas? Ou que isso não deveria acontecer?
Arnauld

@ Arnauld O último.
user202729

A entrada pode ser um objeto que representa uma fração?
Brad Gilbert b2gills

Respostas:


14

JavaScript (Node.js) , 78 77 bytes

Guardado 1 byte graças a @HermanLauenstein

Recebe entrada na sintaxe de currying (m)(n).

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

Experimente online!


@ user202729 Tenho certeza de que usei uma fórmula semelhante em outro lugar. Não me lembro para qual desafio, no entanto. Agora, pode valer a pena tentar gerar os caracteres String.fromCharCode(), mas eu esperaria uma contagem de bytes semelhante.
Arnauld


@HermanLauenstein Thanks! (Eu perdi aquele porque eu estava inicialmente apenas procurando o menor módulo I já tinha mudado para o método XOR quando eu comecei a remover arrastando espaços vazios..)
Arnauld

E se você postar sua resposta muito cedo, isso fará com que as pessoas usem sua abordagem principalmente ... #
user202729

12

Perl 6 ,  48  43 bytes

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

Tente

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

Tente

Expandido:

{  # 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
      )
}

Observe que a pesquisa precisa ser dividida para que não retorne outros caracteres Unicode que tenham o mesmo unival. (caso contrário, seria (1..*))


3
Espere, o Perl 6 tem um built-in para esta coisa exata?
Erik the Outgolfer

2
@EriktheOutgolfer Não tenho certeza de que é bem assim, mas sim, você pode acessar o valor numérico do ponto de código refletido na 9ª coluna do banco de dados de caracteres Unicode no arquivo UnicodeData.txt. Por exemplo, U + 109BC MEROITIC CURSIVE FRACTION ELEVEN TWELFTHStem a propriedade de caractere nv=11/12. Existem cerca de 1500 pontos de código com valores numéricos não vazios - muito mais do que esse pequeno desafio exige que se resolva. Estes são números inteiros ou racionais.
tchrist

7

JavaScript (ES6), 88 86 84 81 79 bytes

Guardado 2 bytes graças a @Arnauld

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

Não é tão curto quanto a outra resposta do JS, mas foi divertido calcular matematicamente o ponto de código de cada fração.

Snippet de teste

Método antigo (82 bytes):

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

Economizei 4 bytes neste arquivo graças a @Arnauld.


1
-2 bytes em ambas as versões com-~'3 1'[n-6]
Arnauld

7

APL (Dyalog) , 88 64 bytes

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

Experimente online!

-3 graças a dzaima .

Usando a abordagem de 84 bytes da ETHproductions.

O f←incluído no TIO não é contado, pois é colocado lá apenas para poder testar a função.


2

SOGL V0.12 , 51 bytes

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

Experimente aqui!

usa o mapeamento (m + n*5)%33%22

Explicação:

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 bytes

(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)

Uma função anônima que recebe entrada como "1/2"e retorna o caractere correspondente.

Um mapeamento direto de um Clojure Ratiopara um caractere de fração. compe o fato de os mapas de Clojure serem funções realmente ajudaram aqui. Eu precisava passar a entrada da string read-stringpara avaliá-la como um tipo de proporção, pois isso me permite descartar todas as aspas inchadas no mapa. compdeixe-me fazer isso sem pontos, o que foi legal. O código "completo" seria:

(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)))

Depois de examinar as outras respostas, percebi que essa abordagem é bastante ingênua. Estou procurando maneiras de melhorá-lo.



1

Carvão , 77 48 46 bytes

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

Experimente online! Link é a versão detalhada do código. Edit: Salvo 29 31 bytes, mapeando de caracteres ASCII para caracteres de vários bytes. Explicação:

    “....”                  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 bytes

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

2
Isso não parece funcionar, você precisa [n-2][m-1].
Erik the Outgolfer

Certo, eu acho que eu não testá-lo primeiro ...
Ryan McCampbell

0

Script do Vim, 67 bytes

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

A função trabalha com os digrafos do Vim que são inseridos após iniciá-los. ctrl-k.Aparentemente, o ctrl-kcaractere relevante após o exe'normnão é renderizado no bloco de código acima.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.