¿Qué tan rápido puedo decir su programa?


26

Recientemente decidí descargar un software de dictado, para ayudar con mi escritura. Sin embargo, no funciona muy bien cuando estoy codificando, ya que tengo que cambiar de decir palabras a símbolos y viceversa. Es aún peor cuando estoy codificando en un lenguaje esotérico que son todos símbolos.

Para que mi uso del programa de dictado sea más coherente, decidí cambiarlo al modo de caracteres, donde solo digo el nombre de cada personaje. ¡Problema resuelto! Aunque esto retrasa un poco la fecha de lanzamiento de mi novela ...

Entonces, suponiendo que cuanto más largo sea el nombre de un personaje, más tiempo tomará decir, ¿cuánto tiempo me tomará deletrear algunos de mis programas / oraciones?

Presupuesto

Dada una cadena que consiste solo en ASCII imprimible, devuelve la suma del nombre unicode de cada carácter. Por ejemplo, /se llama SOLIDUScon 7 caracteres y Atiene LATIN CAPITAL LETTER A22 caracteres.

Pero recuerde, tengo que decir sus programas en voz alta para ejecutarlos, por lo que su puntaje se basará en cuánto tiempo me tome decirlos, es decir, como la suma de las longitudes del nombre unicode de cada personaje.

Casos de prueba:

En formato input => outputsin espacios finales / iniciales en la entrada.

A      => 22
/      => 7
Once upon a time...           => 304
slurp.uninames>>.comb.sum.say => 530
JoKing => 124
!" #$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~        =>  1591
Double-check your \s on the last test case ;)   => 755
<say "<$_>~~.EVAL">~~.EVAL     => 388
,[.,]  => 58
19     => 19

Reglas:

  • La entrada a su programa solo consistirá en caracteres ASCII imprimibles, es decir, los puntos de código 32 (espacio) a 126 (tilde).
    • Por conveniencia, aquí está la lista de longitudes de los caracteres que debe manejar: [5,16,14,11,11,12,9,10,16,17,8,9,5,12,9,7,10,9,9,11,10,10,9,11,11,10,5,9,14,11,17,13,13,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,19,15,20,17,8,12,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,18,13,19,5]
  • Aquí hay un programa de referencia que puede usar para calificar su programa.
    • Peter Taylor ha señalado que el programa de referencia normaliza algunos caracteres unicode . Todavía debería funcionar para la mayoría de las soluciones, pero siéntase libre de corregirlo si lo necesita
  • Como está diciendo cómo son realmente los caracteres, su solución será puntuada por los caracteres que se muestran, no por los bytes involucrados. Esto está dirigido a idiomas con codificaciones personalizadas.
    • Puede suponer que he memorizado toda la biblioteca Unicode y puedo decir cualquier personaje extraño que use.
  • Lo siento, Rogem, pero las respuestas deben estar compuestas de caracteres que se puedan mostrar. Los no imprimibles están bien, solo tengo que poder leer los caracteres en voz alta.
  • Hagas lo que hagas, no lo uses en tu programa.

99
ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORMeste será el nombre completo de mi hijo
Quintec

1
Este programa puntúa 6 en modo palabra: ¡ Pruébelo en línea!
Neil

2
El programa de referencia tiene errores. Considere [esta prueba] ( tio.run/##dY5PC4JAEMXvfYphYcNsWcrSi@Ahrx3rlB223FTSXdk/… ) donde \x[2126]se cuenta como \x[3a9].
Peter Taylor

Respuestas:


13

Java 8, puntaje 846 838 822 816

ௐ->ௐ.map(ˇ->Character.getName(ˇ).length()).sum()

-8 puntos gracias a @tsh reemplazando el _1con .
-22 puntaje gracias a @ ASCII solo reemplazando el con ˇy $con .

Pruébalo en línea.

Explicación:

El y ˇse usan en lugar del sy cque normalmente usaría, porque las letras minúsculas son todas 20 (es decir LATIN SMALL LETTER S), pero ( TAMIL OM) es 8 y ˇ( CARON) es 5.

ௐ->                         // Method with IntStream parameter and integer return-type
  ௐ.map(ˇ->                 //  Map each character to:
      Character.getName(ˇ)  //   Get the name of the character
               .length())   //   Get the length of that name
   .sum()                   //  And after the map: sum all lengths together,
                            //  and return it as result

1
Me gusta cómo este material de Java supera la respuesta 05AB1E tanto en términos de bytes como en términos de puntuación ...
Erik the Outgolfer

@EriktheOutgolfer Ikr. Construido por cierto, supongo. ;)
Kevin Cruijssen

@KevinCruijssen Ahorra un par de bytes que no tiene que push compressed integer 87235805968599116032550323044578484972930006625267106917841: P
Quintec

1
Usar en lugar de _1ahorraría algunos puntos.
tsh

1
@KevinCruijssen Peter Taylor ( OHM SIGN) tiene 8 caracteres de longitud. También, jaja, no sabía que no era válido, solo asumí que es válido en C # y Peter _1también lo usó ( programa para encontrar nombres de variables cortos , el carácter de cuadro no se puede usar)
solo ASCII


7

Japt v2.0a1 -x, Score 926 908 875 865 829 791 789

Toma la entrada como una matriz de caracteres.

®cg`061742//0.450./..//.2/5117385`c+51 r\A_p26}  n# 

Pruébelo o ejecute todos los casos de prueba en TIO

( APOSTROPHEse omite del sexto caso de prueba en TIO ya que Japt no puede manejar tanto comillas simples como dobles en la misma cadena de entrada)


Explicación

®cg`...`c+51 r\A_p26}  n#      :Implicit input of character array
®                              :Map
 c                             :  Character code
  g                            :  Index into (0-based, with wrapping)
   `...`                       :    The string described below
        c+51                   :    Increment the codepoint of each by 51 (="8cKidj55gebbc9agh895c97a99baa9bba59ebhddMjfkh")
                               :    (Space closes the above method)
             r                 :    Replace
              \A               :      RegEx /[A-Z]/g
                _              :      Pass each match through a function
                 p26           :        Repeat 26 times
                    }          :      End function
                               :    (Space closes the replace method)
                               :  (Space closes the indexing method)
                       n       :  Convert to integer
                        #      :    From base 32 (note the trailing space)
                               :Implicitly reduce by addition and output

Construyendo la cadena

(Las puntuaciones incluyen los pasos y los caracteres adicionales necesarios para revertir cada modificación)

  1. La matriz dio una puntuación de referencia de 2161 .
  2. Convirtiendo cada uno en un solo personaje en una base >=23y uniéndolos a una cadena obtuvo 1832 .
  3. Reemplazar ambas carreras de my kcon un solo carácter en mayúscula obtuvo 963 .
  4. Todavía había demasiadas letras caras, así que luego intenté deshacerme de ellas reduciendo los puntos de código de todos los caracteres. 5era el personaje con el punto de código más bajo ( 53), así que comencé con 52, que obtuvo 756
  5. Después de probar todos los números que dejarían sin cartas en la cadena, 51dio la mejor puntuación de 738
  6. Finalmente, reemplazar las comillas con backticks ligeramente más baratos dio un puntaje de 734 . Los backticks en Japt generalmente se usan para encerrar y descomprimir una cadena comprimida pero, afortunadamente, ninguno de los caracteres en esta cadena está contenido en la biblioteca de Shoco

La cadena final, por lo tanto, contiene los caracteres en los siguientes puntos de código:

[5,48,24,54,49,55,2,2,52,50,47,47,48,6,46,52,53,5,6,2,48,6,4,46,6,6,47,46,46,6,47,47,46,2,6,50,47,53,49,49,26,55,51,56,53]

4

05AB1E , puntaje 963

Îv•Fδà‚<0?9½mΣ@×ƶC₁vc-™uΔ_ε'•21вεD3‹i22α₂и}}˜yÇ32-è+

Pruébelo en línea o verifique todos los casos de prueba .

Explicación:

Î               # Push 0 and the input-string
 v              # Loop `y` over the characters of this input-string:
  Fδà‚<0?9½mΣ@×ƶCvc-™uΔ_ε'•
               '#  Push compressed integer 87235805968599116032550323044578484972930006625267106917841
   21в          #  Converted to Base-21 as list: [5,16,14,11,11,12,9,10,16,17,8,9,5,12,9,7,10,9,9,11,10,10,9,11,11,10,5,9,14,11,17,13,13,0,19,15,20,17,8,12,2,18,13,19,5]
    ε           #  Map over this list:
     D3i       #   If the value is smaller than 3:
         22α    #    Take the absolute difference of this value with 22
            ₂и  #    Repeat it 26 times as list
    }}          #  Close the if-statement and map
      ˜         #  Flatten the list
       yÇ       #  Get the unicode value of the current character
         32-    #  Subtract 32
            è   #  Index it into the list of integers
             +  #  And add it to the sum
                # (and output the sum implicitly as result after the loop)

Ver este consejo 05AB1E mío (secciones Cómo comprimir grandes números enteros? Y ¿Cómo listas de números enteros comprimir? ) Para entender por qué •Fδà‚<0?9½mΣ@×ƶC₁vc-™uΔ_ε'•21вes [5,16,14,11,11,12,9,10,16,17,8,9,5,12,9,7,10,9,9,11,10,10,9,11,11,10,5,9,14,11,17,13,13,0,19,15,20,17,8,12,2,18,13,19,5].


4

C # (compilador interactivo de Visual C #) (puntaje 1627 1116 1096 1037 1019902 )

Ω=>Ω.Sum(ˇ=>(31&-ˇ)>5&ˇ>62?22-ˇ/91*2:"♁♌♊♇♇♈♅♆♌♍♄♅♁♈♅♃♆♅♅♇♆♆♅♇♇♆♁♅♊♇♍♉♉♏♋♐♍♄♈♎♉♏♁"[ˇ-6-ˇ/33*26]-9788)

Esto no utiliza una base de datos incorporada: solo algunas carcasas especiales para letras y una tabla de búsqueda.

Conjunto de pruebas en línea .

No se puede marcar en sí, porque la mayoría de los personajes no están dentro del alcance, incluyendo las variables CARONy OHM SIGNy los símbolos del zodiaco utilizados para codificar la tabla de búsqueda.

Gracias a ASCII-only por muchas sugerencias.


¿Qué programa de puntaje usaste?
Solo ASCII

tio.run/##NZDrdpNAFIX/z1OMY0wgwhCg0NAEanpT22jVaquGiAQnYbgMhIHWGJO36gv0xSJrBf@cdS57r72@E3A54HR3UbFgyMuCsoVEWenM7d3To@08PeKbKhU82xG2suDJdgd2xLauikPNbLc9R9eONU32FFPtakeI5CyOExrly5CShC4iSuMoonEcEcriZZryrFyGSZFygiZebdP1rmZOZcsUdwMwzwriB6Fw7xfQh5RBRh4m0zVAIyRBRYGaBpCybw8BumYBgVWesVpb0pRgjPc3vXcAEE@qIscVo8xPCXccHGTpDPMqxdxf7XWG3gPoMruqifcLVauNz1wEn7detDuC2H0pyVjpqZp@YJiHfetoMLSd41ejk9Oz84vXb95eXo3fvb/@8PHTzecvt3dfv32fuO70h/fTnwW/yHwR0ihOUpbly4KX1f3D79Wf9d/NtskyLBWgs6yaJUQOQhLEcJVVBXRdDmukMiQw8XkJS1KXwOcEDsQG3TAAGtYU0EXDludst/j8djR20f@u@UK/D5A0wdK0oa1H1WrCLbARwV1BSzKmjAgttPYly9hAaDsQrueCL26QONj9Aw
ASCII de sólo

2
@ Solo ASCII, utilicé la respuesta de Python a continuación; la respuesta de Java también da 1627. El problema parece ser que la solución de referencia tiene errores: Ω es U + 2126, SIGNO OHM , no LETRA DE CAPITAL GRIEGA OMEGA.
Peter Taylor

1
Nombre de puntaje 5: ˇ, ningún otro nombre más corto que 8 que C # acepta, tampoco verificado con el programa Java
solo ASCII

1
@ Kevin, según mi comentario anterior, la implementación de referencia tiene errores. Creo que está aplicando la normalización para convertir el carácter fuente OHM SIGN en GREEK CAPITAL LETTER OMEGA.
Peter Taylor

4

R; Puntuación: 3330 1586 1443

También desafiante en R debido a la falta de elementos integrados.

Bueno, el código ahora es principalmente de @ Giuseppe, pero está bien. Pude hacer una pequeña edición para golf aún más al reemplazar el * con el ~, y el s con el punto.

Gracias a @Nick Kennedy por bajar esto a 1443 usando magia arcana "una versión codificada en UTF8 de la secuencia numérica"

function(.)sum((c(+",752230178/0,30.1002110221,052844",61~26,+":6;8/3",59~26,+"94:,")-39)[+.-31]);`+`=utf8ToInt;`~`=rep

Pruébalo en línea


1769 puntos - hace un intento mínimo de comprimir los valores ...
Giuseppe

2
también, utf8ToIntes un comando súper útil para jugar golf :-) No he estado en PPCG durante un mes más o menos, ¡así que es agradable ver a gente nueva jugando al golf en R!
Giuseppe

Ah, tenía una forma de comprimirlo, pero no estaba al tanto de utf8ToInt. Tendré que trabajar en esto más tarde esta noche / mañana.
CT Hall

1
Es sólo más líneas de código dentro del programa / fragmento que no afecta a ByteCount - útil para hacer algunas pruebas en
ASCII de sólo

1
Hasta 1443: tio.run / ##xc09DoIwFADgu3ShTR/... Usando una versión codificada en UTF8 de la secuencia numérica.
Nick Kennedy


2

Perl 5 -pl , puntaje 723

s,\N{OX}*.,_charnames'viacode ord$&,ge,$_=y,,,c

Pruébalo en línea!

Explicación

s,        ,                        ,ge  # Replace globally
  \N{OX}*   # zero or more OX characters 🐂, loads the
            # _charnames module as side effect,
         .  # any character
           _charnames'viacode ord$&  # with its Unicode character name
                                     # (using old package delimiter).
                                      ,$_=y,,,c  # Set $_ to its length

2

Agregado , 1934

Sum@{ToBase[FromBase[Ords@"!ZByru=#9fBYb$a3Si0^pU,ZP#3$cd'(c-_lhu]h(]5;!W|?M4:<_^sU;N&XFN`t:u"-32,95],23][Ords@_-32]}

Pruébalo en línea!

Compresión simple e indexación.


: P parece que usar una búsqueda más inteligente (ver respuesta de C #) ayudaría con la puntuación. O incluso simplemente usando un juego de caracteres que no contiene letras para comprimir
solo ASCII

1

C # (compilador interactivo de Visual C #) , puntaje: 4007 3988 3759 3551 2551

ˇ=>ˇ.Sum(_=>new[]{5,16,14,11,11,12,9,10,16,17,8,9,5,12,9,7,10,9,9,11,10,10,9,11,11,10,5,9,14,11,17,13,13,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,19,15,20,17,8,12,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,18,13,19,5}[_-32])

Me siento aplastado por la solución de Peter Taylor arriba. Gracias a Peter Taylor por señalar que una tabla de búsqueda simple era mejor que mi solución de diccionario anterior.

Pruébalo en línea!


Esto es considerablemente peor que una tabla de búsqueda directa: _1=>_1.Select(_2=>new int[]{5,16,14,11,11,12,9,10,16,17,8,9,5,12,9,7,10,9,9,11,10,10,9,11,11,10,5,9,14,11,17,13,13,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,19,15,20,17,8,12,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,18,13,19,5}[_2-32]).Sum()puntajes 2786.
Peter Taylor
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.