Quão rápido posso dizer o seu programa?


26

Decidi recentemente fazer o download de algum software de ditado, a fim de ajudar na minha redação. No entanto, não funciona muito bem quando estou codificando, pois tenho que mudar de dizer palavras para símbolos e voltar. É ainda pior quando estou codificando em uma linguagem esotérica que é tudo símbolos.

Para tornar meu uso do programa de ditado mais consistente, decidi mudar para o modo de caractere, onde apenas digo o nome de cada caractere. Problema resolvido! Embora isso atrase um pouco a data de lançamento do meu romance ...

Então, supondo que quanto maior o nome de um personagem, mais tempo é necessário para dizer, quanto tempo levarei para explicar alguns dos meus programas / frases?

Especificações

Dada uma sequência que consiste apenas em ASCII imprimível, retorne a soma do nome unicode de cada caractere. Por exemplo, /é chamado SOLIDUScom 7 caracteres e Apossui LATIN CAPITAL LETTER A22 caracteres.

Mas lembre-se, eu tenho que dizer seus programas em voz alta para executá-los, portanto, a pontuação deles será baseada em quanto tempo levarei para dizê-los, ou seja, como a soma dos comprimentos do nome unicode de cada personagem.

Casos de teste:

Em formato input => outputsem espaços à direita / à esquerda na 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

Regras:

  • A entrada para o seu programa consistirá apenas em caracteres ASCII imprimíveis, ou seja, os pontos de código 32 (espaço) a 126 (til).
    • Por uma questão de conveniência, eis a lista dos comprimentos dos caracteres que você precisa manipular: [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]
  • Aqui está um programa de referência que você pode usar para pontuar seu programa.
    • Peter Taylor apontou que o programa de referência normaliza alguns caracteres unicode . Ele ainda deve funcionar para a maioria das soluções, mas fique à vontade para corrigi-lo se precisar
  • Como você está dizendo como os caracteres realmente se parecem, sua solução será pontuada pelos caracteres exibidos, não pelos bytes envolvidos. Isso é direcionado para idiomas com codificações personalizadas.
    • Você pode supor que eu memorizei toda a biblioteca Unicode e posso dizer quais caracteres estranhos você usa.
  • Desculpe Rogem, mas as respostas devem ser compostas de caracteres que podem ser exibidos. Não imprimíveis são bons, só preciso ler os caracteres em voz alta.
  • Faça o que fizer, não use no seu programa.

9
ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORMeste será o nome completo do meu filho
Quintec 16/02

1
Este programa obtém 6 pontos no modo de palavra: Experimente online!
Neil

2
O programa de referência é com erros. Considere [este teste] ( tio.run/##dY5PC4JAEMXvfYphYcNsWcrSi@Ahrx3rlB223FTSXdk/… ) em que \x[2126]é contado como \x[3a9].
Peter Taylor

Respostas:


13

Java 8, marcar 846 838 822 816

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

-8 pontos graças a @tsh substituindo o _1por .
-22 pontuação graças a @ ASCII-only substituir o with ˇe $with .

Experimente online.

Explicação:

O e ˇsão usados ​​em vez do se ceu normalmente usaria, porque letras minúsculas são 20 (ie LATIN SMALL LETTER S), mas ( TAMIL OM) é 8 e ˇ( CARON) é 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
Eu gosto de como esse material Java bate a resposta 05AB1E em termos de bytes e em termos de pontuação ...
Erik the Outgolfer

@EriktheOutgolfer Ikr. Builtins ftw eu acho. ;)
Kevin Cruijssen 16/02

@KevinCruijssen Economiza alguns bytes que você não precisa push compressed integer 87235805968599116032550323044578484972930006625267106917841: P
Quintec 17/02

1
Use em vez de _1poupar alguns pontos.
tsh 20/02

1
@KevinCruijssen Peter Taylor ( OHM SIGN) tem 8 caracteres. Também haha ​​eu não sabia que não era válido, apenas assumi que é válido em C # e Peter _1também usou ( programa para encontrar nomes curtos de variáveis , o caractere de caixa não pode ser usado)
ASCII-only


7

Japt v2.0a1 -x, pontuação 926 908 875 865 829 791 789

Recebe a entrada como uma matriz de caracteres.

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

Experimente ou execute todos os casos de teste no TIO

( APOSTROPHEé omitido do sexto caso de teste no TIO, pois o Japt não pode lidar com aspas simples e duplas na mesma sequência de entrada)


Explicação

®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

Construindo a corda

(As pontuações incluem as etapas e os caracteres extras necessários para reverter cada modificação)

  1. A matriz deu uma pontuação inicial de 2161 .
  2. Convertendo cada um em um único caractere em uma base >=23e juntando-se a uma sequência de 1832 .
  3. Substituindo ambas as execuções de me kpor um único caractere maiúsculo, com pontuação de 963 .
  4. Ainda havia muitas cartas caras, então tentei me livrar delas, reduzindo os pontos de código de todos os caracteres. 5foi o personagem com o codepoint mais baixo ( 53), então comecei com 52, que marcou 756
  5. Depois de tentar todos os números que deixaria sem cartas na seqüência, 51deu a melhor pontuação de 738
  6. Finalmente, a substituição das aspas por backticks um pouco mais baratos deu uma pontuação de 734 . Backticks em Japt são geralmente usados ​​para incluir e descomprimir uma string compactada, mas, felizmente, nenhum dos caracteres dessa string está contido na biblioteca de Shoco.

A sequência final, portanto, contém os caracteres nos seguintes pontos 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 , pontuação 963

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

Experimente online ou verifique todos os casos de teste .

Explicação:

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

Veja este 05AB1E ponta do meu (seções Como comprimir grandes inteiros? E Como listas inteiras compressa? ) Para entender por que •Fδà‚<0?9½mΣ@×ƶC₁vc-™uΔ_ε'•21вé [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 interativo do Visual C #) (pontuação 1627 1116 1096 1037 1019 902)

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

Isso não usa banco de dados interno: apenas algumas caixas especiais para letras e uma tabela de pesquisa.

Conjunto de testes online .

Ele não pode pontuar sozinho, porque a maioria dos caracteres não está no intervalo, incluindo as variáveis CARONeOHM SIGN e os símbolos do zodíaco utilizados para codificar a tabela de referência.

Obrigado ao ASCII-only por muitas sugestões.


Qual programa de pontuação você usou
somente ASCII

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

2
@ Somente ASCII, usei a resposta Python abaixo; a resposta Java também fornece 1627. O problema parece ser que a solução de referência é incorreta: Ω é U + 2126, OHM SIGN , não GREEK CAPITAL LETAL OMEGA.
Peter Taylor

1
Nome da pontuação 5: ˇ, nenhum outro nome menor que 8 que o C # aceite, também não foi verificado com o programa Java
somente ASCII

1
@ Kevin, conforme meu comentário anterior, a implementação de referência é de buggy. Eu acho que está aplicando a normalização para transformar o caractere de origem OHM SIGN em GREEK CAPITAL LETAL OMEGA.
Peter Taylor

4

R; Pontuação: 3330 1586 1443

Também desafiador em R devido à falta de built-ins.

Bem, o código agora é principalmente do Giuseppe, mas está tudo bem. Consegui fazer uma pequena edição para jogar golfe, substituindo o * por ~ e os por ponto.

Obrigado a @Nick Kennedy por reduzir isso para 1443 usando magia arcana "uma versão codificada em UTF8 da sequência numérica"

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

Experimente online


1769 pontos - faz uma tentativa mínima de compactar os valores ...
Giuseppe

2
Além disso, utf8ToInté um comando super útil para jogar golfe :-) Não estou no PPCG há um mês ou mais, então é bom ver novas pessoas jogando golfe no R!
Giuseppe

Ah, eu tinha uma maneira de compactá-lo, mas não tinha conhecimento do utf8ToInt. Vou ter que trabalhar nisso mais tarde esta noite / amanhã.
CT Hall

1
São apenas mais linhas de código no programa / snippet que não afetam o bytecount - útil para fazer alguns testes
somente ASCII

1
Até 1443: tio.run/##xc09DoIwFADgu3ShTR/… Usando uma versão codificada em UTF8 da sequência numérica.
Nick Kennedy


2

Perl 5 -pl , pontuação 723

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

Experimente online!

Explicação

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

Adido , 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]}

Experimente online!

Compactação e indexação simples.


: P parece que usar uma pesquisa mais inteligente (consulte a resposta C #) ajudaria na pontuação. Ou até mesmo usando um conjunto de caracteres que não contém letras para compactar
somente ASCII

1

C # (Compilador interativo Visual C #) , Pontuação: 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])

Sinto-me esmagado pela solução de Peter Taylor acima. Agradecemos a Peter Taylor por apontar que uma tabela de pesquisa simples era melhor que a minha solução de dicionário anterior.

Experimente online!


Isso é consideravelmente pior do que uma tabela de pesquisa direta: _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()pontuação 2786.
Peter Taylor
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.