Fracciones Unicode

21

Dada una fracción en el formato m/n(donde myn son enteros coprimos), genera la fracción Unicode correspondiente. No se espera que su programa / función tome ninguna entrada que no corresponda a un carácter Unicode. Se aceptan matrices, por ejemplo, [2, 3]en oposición a 2/3. m / na diferencia de m/ntambién está bien. Dos entradas separadas my ntambién son válidas.

Las fracciones Unicode que deben manejarse son las siguientes:

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

Por lo tanto, las posibles entradas son las siguientes:

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

Los puntos de código Unicode de los caracteres son los siguientes:

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

Casos de prueba

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

Haga su código lo más corto posible; Este es el código de golf.

0WJYxW9FMN
fuente
¿Puedes agregar los puntos de código Unicode para cada fracción?
Rod
44
188 ¼, 189 ½, 190 ¾, 8528 ⅐, 8529 ⅑, 8530 ⅒, 8531 ⅓, 8532 ⅔, 8533 ⅕, 8534 ⅖, 8535 ⅗, 8536 ⅘, 8537 ⅙, 8538 ⅚, 8539 ⅛, 8540 ⅜, 8541 ⅝, 8542 ⅞
Leaky Nun
No se espera que permita ninguna entrada que no corresponda a un carácter unicode. ¿Eso significa que debemos detectar entradas no válidas? ¿O que se supone que esto no debe suceder?
Arnauld
@Arnauld El último.
usuario202729
¿Puede la entrada ser un objeto que representa una fracción?
Brad Gilbert b2gills

Respuestas:

14

JavaScript (Node.js) , 78 77 bytes

Guardado 1 byte gracias a @HermanLauenstein

Toma entrada en la sintaxis de curry (m)(n).

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

Pruébalo en línea!

Arnauld
fuente
@ user202729 Estoy seguro de que usé una fórmula similar en otro lugar. Sin embargo, no recuerdo para qué desafío. Ahora, podría valer la pena intentar generar los caracteres con String.fromCharCode(), pero esperaría un recuento de bytes similar.
Arnauld
-1 byte
Herman L
@HermanLauenstein Gracias! (Me lo perdí porque inicialmente solo estaba buscando el módulo más pequeño. Ya había cambiado al método XOR cuando comencé a eliminar las ranuras vacías finales).
Arnauld
Y si publica su respuesta demasiado pronto, hará que las personas usen principalmente su enfoque ...
user202729
12

Perl 6 ,  48  43 bytes

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

Intentalo

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

Intentalo

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

Tenga en cuenta que la búsqueda debe dividirse para que no devuelva otros caracteres Unicode que tengan el mismo unival. (de lo contrario sería (1..*))

Brad Gilbert b2gills
fuente
3
Espera, ¿Perl 6 tiene una función incorporada para esto exactamente?
Erik the Outgolfer
2
@EriktheOutgolfer No estoy seguro de que sea así como se ve, pero sí, puede acceder al valor numérico del punto de código reflejado en la novena columna de la Base de datos de caracteres Unicode en el archivo UnicodeData.txt. Por ejemplo, U + 109BC MEROITIC CURSIVE FRACTION ELEVEN TWELFTHStiene la propiedad de carácter nv=11/12. Hay unos 1500 puntos de código con valores numéricos no vacíos, más de lo que este pequeño desafío le pide a uno que resuelva. Estos son números enteros o racionales.
tchrist
7

JavaScript (ES6), 88 86 84 81 79 bytes

Guardado 2 bytes gracias a @Arnauld

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

No es tan corto como la otra respuesta JS, pero fue divertido calcular matemáticamente el punto de código de cada fracción.

Fragmento de prueba

Método antiguo (82 bytes):

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

Ahorré 4 bytes en este gracias a @Arnauld.

ETHproducciones
fuente
1
-2 bytes en ambas versiones con-~'3 1'[n-6]
Arnauld
7

APL (Dyalog) , 88 64 bytes

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

Pruébalo en línea!

-3 gracias a dzaima .

Usando el enfoque de 84 bytes de ETHproductions.

Lo f←incluido en TIO no se cuenta, ya que se pone allí solo para poder probar la función.

Erik el Outgolfer
fuente
2

SOGL V0.12 , 51 bytes

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

Pruébalo aquí!

usa el mapeo (m + n*5)%33%22

Explicación:

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
dzaima
fuente
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)

Una función anónima que toma datos como "1/2" y devuelve el carácter correspondiente.

Un mapeo directo de un Clojure Ratioa un carácter de fracción. comp, y el hecho de que los mapas Clojure son funciones realmente ayudó aquí. Necesitaba pasar la entrada de cadena read-stringpara evaluarla como un tipo de razón, ya que eso me permite descartar todas las comillas en el mapa. compdéjame hacer eso sin puntos, lo cual fue agradable. El código "completo" sería:

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

Después de mirar las otras respuestas, me di cuenta de que este enfoque es bastante ingenuo. Estoy buscando formas de mejorarlo.

Carcigenicate
fuente
1

Carbón , 77 48 46 bytes

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

Pruébalo en línea! El enlace es a la versión detallada del código. Editar: se guardaron 29 31 bytes mediante la asignación de caracteres ASCII a caracteres multibyte. Explicación:

    “....”                  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
Neil
fuente
0

Python 3, 97 bytes

lambda m,n:'½ ⅓⅔ ¼_¾ ⅕⅖⅗⅘ ⅙___⅚ ⅐ ⅛_⅜_⅝_⅞ ⅑ ⅒'.split()[n-2][m-1]
Ryan McCampbell
fuente
2
Esto no parece funcionar, necesitas en su [n-2][m-1]lugar.
Erik the Outgolfer
Bien, supongo que no lo probé primero ...
Ryan McCampbell
0

Vim Script, 67 bytes

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

La función funciona con los dígrafos de Vim que se ingresan después de comenzarlos ctrl-k.Aparentemente, el ctrl-kcarácter relevante después del exe'normno se representa en el bloque de código anterior.

René Nyffenegger
fuente