À quelle vitesse puis-je dire votre programme?

26

J'ai récemment décidé de télécharger un logiciel de dictée afin de m'aider à écrire. Cependant, cela ne fonctionne pas très bien lorsque je code, car je dois changer de dire des mots en symboles et inversement. C'est encore pire quand je code dans un langage ésotérique qui est tous des symboles.

Afin de rendre mon utilisation du programme de dictée plus cohérente, j'ai décidé de le passer en mode caractère, où je dis simplement le nom de chaque personnage à la place. Problème résolu! Bien que cela retarde un peu la date de sortie de mon roman ...

Donc, en supposant que plus le nom d'un personnage est long, plus il faut de temps pour le dire, combien de temps me faudra-t-il pour épeler certains de mes programmes / phrases?

Caractéristiques

Étant donné une chaîne composée uniquement d'ASCII imprimable, renvoyez la somme du nom unicode de chaque caractère. Par exemple, /est appelé SOLIDUSavec 7 caractères, et Aest LATIN CAPITAL LETTER Aavec 22 caractères.

Mais rappelez-vous, je dois dire vos programmes à haute voix pour les exécuter, donc leur score sera basé sur le temps qu'il me faut pour les dire, c'est-à-dire comme la somme des longueurs du nom unicode de chaque personnage.

Cas de test:

Au format input => outputsans espaces de fin / de début en entrée.

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

Règles:

  • L'entrée dans votre programme se composera uniquement de caractères ASCII imprimables, c'est-à-dire les points de code 32 (espace) à 126 (tilde).
    • Par souci de commodité, voici la liste des longueurs des caractères que vous devez gérer: [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]
  • Voici un programme de référence que vous pouvez utiliser pour noter votre programme.
    • Peter Taylor a souligné que le programme de référence normalise certains caractères unicode . Cela devrait toujours fonctionner pour la plupart des solutions, mais n'hésitez pas à le corriger si vous en avez besoin
  • Puisque vous dites à quoi ressemblent réellement les caractères, votre solution sera évaluée par les caractères affichés, et non par les octets impliqués. Cela concerne les langues avec des encodages personnalisés.
    • Vous pouvez supposer que j'ai mémorisé toute la bibliothèque Unicode et pouvez dire tous les caractères étranges que vous utilisez.
  • Désolé Rogem, mais les réponses doivent être composées de caractères affichables. Les non imprimables sont bien, je dois juste pouvoir lire les caractères à haute voix.
  • Quoi que vous fassiez, ne l'utilisez pas dans votre programme.
Jo King
la source
9
ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORMce sera le nom complet de mon enfant
Quintec
1
Ce programme obtient 6 en mode Word: essayez-le en ligne!
Neil
2
Le programme de référence est buggé. Considérez [ce test] ( tio.run/##dY5PC4JAEMXvfYphYcNsWcrSi@Ahrx3rlB223FTSXdk/… ) où \x[2126]est compté comme \x[3a9].
Peter Taylor

Réponses:

13

Java 8, score 846 838 822 816

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

-8 score grâce au remplacement de @tsh_1 par .
-22 score grâce à @ ASCII uniquement en remplaçant le avec ˇet $avec .

Essayez-le en ligne.

Explication:

Le et ˇsont utilisés à la place du set cj'utiliserais normalement, car les lettres minuscules sont toutes 20 (ie LATIN SMALL LETTER S), mais ( TAMIL OM) est 8 et ˇ( CARON) est 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
Kevin Cruijssen
la source
1
J'aime la façon dont ce truc Java bat la réponse 05AB1E à la fois en termes d'octets et en termes de score ...
Erik the Outgolfer
@EriktheOutgolfer Ikr. Builtins ftw je suppose. ;)
Kevin Cruijssen
@KevinCruijssen Il enregistre quelques octets que vous n'avez pas à push compressed integer 87235805968599116032550323044578484972930006625267106917841: P
Quintec
1
Utiliser au lieu de _1sauverait quelques points.
tsh
1
@KevinCruijssen Peter Taylor ( OHM SIGN) comporte 8 caractères. Aussi haha, je ne savais pas que ce n'était pas valide, supposé juste car il est valide en C # et Peter utilisé _1aussi ( programme pour trouver des noms de variables courts , le caractère de la boîte ne peut pas être utilisé)
ASCII uniquement le
11

Perl 6 , score 337

+*.uninames.&[~].ords

Essayez-le en ligne!

nwellnhof
la source
Au .&[~]lieu de cela, .joinc'est une astuce intéressante. Je ne me souviens jamais quels opérateurs de réduction peuvent être appliqués par cette méthode
Jo King
7

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

Prend l'entrée comme un tableau de caractères.

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

Essayez-le ou exécutez tous les cas de test sur TIO

( APOSTROPHEest omis du 6ème cas de test sur TIO car Japt ne peut pas gérer les guillemets simples et doubles dans la même chaîne d'entrée)


Explication

®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

Construire la chaîne

(Les scores incluent les étapes et les caractères supplémentaires nécessaires pour annuler chaque modification)

  1. Le tableau a donné un score de base de 2161 .
  2. Convertir chacun en un seul caractère dans une base >=23et le joindre à une chaîne notée 1832 .
  3. Remplacer les deux séries de met kpar un seul caractère majuscule a marqué 963 .
  4. Il y avait encore trop de lettres chères, alors j'ai essayé de m'en débarrasser en réduisant les points de code de tous les caractères. 5était le personnage avec le point de code le plus bas ( 53) donc j'ai commencé avec 52, qui ont marqué 756
  5. Après avoir essayé tous les chiffres qui ne laisseraient aucune lettre dans la chaîne, a 51donné le meilleur score de 738
  6. Enfin, le remplacement des guillemets par des retours en arrière légèrement moins chers a donné un score de 734 . Les backticks dans Japt sont généralement utilisés pour entourer et décompresser une chaîne compressée mais, heureusement, aucun des caractères de cette chaîne n'est contenu dans la bibliothèque de Shoco

La chaîne finale contient donc les caractères aux points de code suivants:

[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]
Hirsute
la source
4

05AB1E , score 963

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

Essayez-le en ligne ou vérifiez tous les cas de test .

Explication:

Î               # 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)

Voir cette astuce de mes 05AB1E (sections Comment compresser les grands entiers? Et comment les listes entières Compresser? ) Pour comprendre pourquoi •Fδà‚<0?9½mΣ@×ƶC₁vc-™uΔ_ε'•21вest [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].

Kevin Cruijssen
la source
4

C # (Visual C # Interactive Compiler) (score 1627 1116 1096 1037 1019 902)

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

Cela n'utilise pas de base de données intégrée: juste un boîtier spécial pour les lettres et une table de recherche.

Suite de tests en ligne .

Il ne peut pas se marquer, parce que la plupart des personnages ne sont pas dans la gamme, y compris les variables CARONet OHM SIGNet les symboles du zodiaque utilisés pour coder la table de consultation.

Merci à ASCII uniquement pour de nombreuses suggestions.

Peter Taylor
la source
Quel programme de notation avez-vous utilisé
ASCII uniquement le
tio.run/##NZDrdpNAFIX/z1OMY0wgwhCg0NAEanpT22jVaquGiAQnYbgMhIHWGJO36gv0xSJrBf@cdS57r72@E3A54HR3UbFgyMuCsoVEWenM7d3To@08PeKbKhU82xG2suDJdgd2xLauikPNbLc9R9eONU32FFPtakeI5CyOExrly5CShC4iSuMoonEcEcriZZryrFyGSZFygiZebdP1rmZOZcsUdwMwzwriB6Fw7xfQh5RBRh4m0zVAIyRBRYGaBpCybw8BumYBgVWesVpb0pRgjPc3vXcAEE@qIscVo8xPCXccHGTpDPMqxdxf7XWG3gPoMruqifcLVauNz1wEn7detDuC2H0pyVjpqZp@YJiHfetoMLSd41ejk9Oz84vXb95eXo3fvb/@8PHTzecvt3dfv32fuO70h/fTnwW/yHwR0ihOUpbly4KX1f3D79Wf9d/NtskyLBWgs6yaJUQOQhLEcJVVBXRdDmukMiQw8XkJS1KXwOcEDsQG3TAAGtYU0EXDludst/j8djR20f@u@UK/D5A0wdK0oa1H1WrCLbARwV1BSzKmjAgttPYly9hAaDsQrueCL26QONj9Aw
ASCII seulement
2
@ ASCII uniquement, j'ai utilisé la réponse Python ci-dessous; la réponse Java donne également 1627. Le problème semble être que la solution de référence est boguée: Ω est U + 2126, OHM SIGN , pas GREEK CAPITAL LETTER OMEGA.
Peter Taylor
1
Score 5 nom: ˇ, aucun autre nom inférieur à 8 que C # accepte, également non vérifié avec le programme Java
ASCII uniquement
1
@Kevin, selon mon commentaire précédent, l'implémentation de référence est boguée. Je pense qu'il applique la normalisation pour transformer le caractère source OHM SIGN en lettre grecque majuscule oméga.
Peter Taylor
4

R; Résultat: 3330 1586 1443

Également difficile en R en raison du manque de fonctions intégrées.

Eh bien, le code est maintenant principalement de @ Giuseppe, mais ça va. J'ai pu apporter une petite modification au golf en remplaçant le * par le ~ et le s par le point.

Merci à @Nick Kennedy d'avoir réduit cela à 1443 en utilisant la magie des arcanes "une version encodée en UTF8 de la séquence de nombres"

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

Essayez-le en ligne

CT Hall
la source
1769 points - fait une tentative minimale pour compresser les valeurs ...
Giuseppe
2
aussi, utf8ToIntest une commande super utile pour jouer au golf :-) Je n'ai pas été sur PPCG depuis un mois environ, donc c'est agréable de voir de nouvelles personnes jouer au golf dans R!
Giuseppe
Ah, j'avais un moyen de le compresser, mais je n'étais pas au courant d'utf8ToInt. Je devrai y travailler plus tard ce soir / demain.
CT Hall
1
Ce sont juste plus de lignes de code sous le programme / extrait de code qui n'affectent pas le bytecount - utile pour faire quelques tests dans
ASCII uniquement le
1
Jusqu'à 1443: tio.run/##xc09DoIwFADgu3ShTR/… Utilisation d'une version codée UTF8 de la séquence de nombres.
Nick Kennedy
3

Python 3 , score de 993

lambda _:len(''.join(map(__import__('unicodedata').name,_)))

Essayez-le en ligne!

En dessous de 1000 maintenant, tous les conseils sont toujours appréciés.

-16 grâce à Kirill L.

nedla2004
la source
2
993
Kirill L.
1
Vous pouvez remplacer _par ˇpour 987.
Lynn
2

Perl 5 -pl , score 723

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

Essayez-le en ligne!

Explication

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
nwellnhof
la source
2

Attaché , 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]}

Essayez-le en ligne!

Compression et indexation simples.

Conor O'Brien
la source
: P semble utiliser une recherche plus intelligente (voir la réponse C #) aiderait avec le score. Ou même simplement en utilisant un jeu de caractères qui ne contient pas de lettres à compresser
ASCII uniquement
1

C # (Visual C # Interactive Compiler) , Score: 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])

Je me sens écrasé par la solution de Peter Taylor au-dessus. Merci à Peter Taylor d'avoir souligné qu'une table de recherche simple était meilleure que ma solution de dictionnaire précédente.

Essayez-le en ligne!

Incarnation de l'ignorance
la source
C'est bien pire qu'une table de recherche directe: _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()note 2786.
Peter Taylor