Quanto velocemente posso dire il tuo programma?


26

Di recente ho deciso di scaricare alcuni software di dettatura, al fine di aiutare con la mia scrittura. Tuttavia, non funziona molto bene quando sto programmando, dal momento che devo cambiare dal dire parole ai simboli e viceversa. È ancora peggio quando sto codificando in un linguaggio esoterico che è tutti simboli.

Al fine di rendere il mio uso del programma di dettatura più coerente, ho deciso di passare alla modalità personaggio, dove invece dico semplicemente il nome di ciascun personaggio. Problema risolto! Anche se questo ritarda un po 'la data di uscita del mio romanzo ...

Quindi, supponendo che più lungo è il nome di un personaggio, più tempo ci vorrà per dire, quanto tempo ci vorrà per scrivere alcuni dei miei programmi / frasi?

specificazioni

Data una stringa composta solo da ASCII stampabile, restituisce la somma del nome unicode di ciascun carattere. Ad esempio, /viene chiamato SOLIDUScon 7 caratteri, ed Aè LATIN CAPITAL LETTER Acon 22 caratteri.

Ma ricorda, devo dire ad alta voce i tuoi programmi per eseguirli, quindi il loro punteggio si baserà su quanto tempo ci vorrà per dirli, cioè come la somma delle lunghezze del nome unicode di ogni personaggio.

Casi test:

In formato input => outputsenza spazi finali / iniziali in input.

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

Regole:

  • L'input per il tuo programma consisterà solo di caratteri ASCII stampabili, ovvero i punti di codice da 32 (spazio) a 126 (tilde).
    • Per comodità, ecco l'elenco delle lunghezze dei caratteri che devi gestire: [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]
  • Ecco un programma di riferimento che puoi usare per assegnare un punteggio al tuo programma.
    • Peter Taylor ha sottolineato che il programma di riferimento normalizza alcuni caratteri unicode . Dovrebbe funzionare ancora per la maggior parte delle soluzioni, ma sentiti libero di correggerlo se ne hai bisogno
  • Dal momento che stai dicendo che aspetto hanno effettivamente i personaggi, la tua soluzione verrà segnata dai personaggi visualizzati, non dai byte coinvolti. Questo è diretto alle lingue con codifiche personalizzate.
    • Puoi presumere che io abbia memorizzato l'intera libreria Unicode e possa dire qualunque strano personaggio tu usi.
  • Scusa Rogem, ma le risposte devono essere composte da caratteri visualizzabili. Gli non stampabili vanno bene, devo solo essere in grado di leggere i personaggi ad alta voce.
  • Qualunque cosa tu faccia, non utilizzare nel tuo programma.

9
ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORMquesto sarà il nome completo di mio figlio
Quintec,

1
Questo programma segna 6 in modalità parola: provalo online!
Neil,

2
Il programma di riferimento è difettoso. Considera [questo test] ( tio.run/##dY5PC4JAEMXvfYphYcNsWcrSi@Ahrx3rlB223FTSXdk/… ) dove \x[2126]viene conteggiato come \x[3a9].
Peter Taylor,

Risposte:


13

Java 8, punteggio 846 838 822 816

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

-8 punteggio grazie a @tsh sostituendo _1con .
-22 punteggio grazie a @ ASCII sostituendo solo con ˇe $con .

Provalo online.

Spiegazione:

Gli e ˇsono usati al posto di se cio userei normalmente, perché le lettere minuscole sono tutte 20 (cioè LATIN SMALL LETTER S), ma ( 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
Mi piace come questa roba Java batte la risposta 05AB1E sia in termini di byte sia in termini di punteggio ...
Erik the Outgolfer

@EriktheOutgolfer Ikr. Builtins ftw immagino. ;)
Kevin Cruijssen,

@KevinCruijssen Salva un paio di byte che non devi push compressed integer 87235805968599116032550323044578484972930006625267106917841: P
Quintec

1
Utilizzare invece di _1salverà alcuni punti.
TSH

1
@KevinCruijssen Peter Taylor ( OHM SIGN) è lungo 8 caratteri. Inoltre haha ​​non sapevo che non fosse valido, solo dato che è valido in C # e anche Peter lo ha usato _1( programma per trovare nomi di variabili brevi , il carattere box non può essere usato)
ASCII-only


7

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

Accetta input come una matrice di caratteri.

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

Provalo o esegui tutti i casi di test su TIO

( APOSTROPHEviene omesso dal sesto test case su TIO poiché Japt non può gestire virgolette singole e doppie nella stessa stringa di input)


Spiegazione

®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

Costruire la stringa

(I punteggi includono i passaggi e i caratteri extra necessari per invertire ogni modifica)

  1. L'array ha dato un punteggio di base di 2161 .
  2. Conversione di ciascuno in un singolo carattere in una base >=23e unione in una stringa segnata 1832 .
  3. Sostituendo entrambe le serie di me kcon un singolo carattere maiuscolo viene segnato 963 .
  4. C'erano ancora troppe lettere costose, quindi ho cercato di liberarmene riducendo i punti di codice di tutti i personaggi. 5era il personaggio con il punto di codice più basso ( 53), quindi ho iniziato con 52, che ha segnato 756
  5. Dopo aver provato tutti i numeri che lascerebbero nessun lettere nella stringa, 51ha dato il miglior punteggio di 738
  6. Infine, la sostituzione delle virgolette con i contropunti leggermente più economici ha dato un punteggio di 734 . I backtick in Japt sono generalmente usati per racchiudere e decomprimere una stringa compressa ma, fortunatamente, nessuno dei caratteri di questa stringa è contenuto nella libreria di Shoco

La stringa finale, quindi, contiene i caratteri nei seguenti punti di codice:

[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 , punteggio 963

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

Provalo online o verifica tutti i casi di test .

Spiegazione:

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

Vedere questo 05AB1E punta del mio (sezioni Come comprimere grandi numeri interi? E come liste di interi comprimere? ) Per capire il motivo per cui •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 # (compilatore interattivo Visual C #) (punteggio 1627 1116 1096 1037 1019 902)

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

Questo non utilizza un database integrato: solo un involucro speciale per le lettere e una tabella di ricerca.

Suite di test online .

Non può segnare in sé, perché la maggior parte dei personaggi non sono nella gamma, comprese le variabili CARONe OHM SIGNed i simboli zodiacali utilizzati per codificare la tabella di ricerca.

Grazie a ASCII-only per molti suggerimenti.


Quale programma di punteggio hai usato
ASCII, solo il

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

2
@ Solo ASCII, ho usato la risposta Python di seguito; la risposta di Java dà anche 1627. Il problema sembra essere che la soluzione di riferimento è difettosa: Ω è U + 2126, OHM SIGN , non LETTERA DI CAPITALE GRECA OMEGA.
Peter Taylor,

1
Punteggio 5 nome: ˇ, nessun altro nome inferiore a 8 accettato da C #, inoltre non verificato con il programma Java
ASCII-only

1
@Kevin, come per il mio commento precedente l'implementazione di riferimento è errata. Penso che stia applicando la normalizzazione per trasformare il personaggio originale OHM SIGN in LETTERA DI CAPITALE GRECA OMEGA.
Peter Taylor,

4

R; Punteggio: 3330 1586 1443

Anche impegnativo in R a causa della mancanza di built-in.

Bene, il codice ora è per lo più @ Giuseppe, ma va bene. Sono stato in grado di apportare una piccola modifica al golf sostituendo * con il ~ e s con il punto.

Grazie a @Nick Kennedy per averlo riportato al 1443 usando la magia arcana "una versione codificata UTF8 della sequenza numerica"

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

Provalo online


1769 punti - fa un tentativo minimo di comprimere i valori ...
Giuseppe,

2
inoltre, utf8ToIntè un comando super utile per giocare a golf :-) Non gioco a PPCG da circa un mese, quindi è bello vedere nuove persone giocare a golf in R!
Giuseppe,

Ah, avevo un modo per comprimerlo, ma non ero a conoscenza di utf8ToInt. Dovrò lavorarci più tardi stasera / domani.
CT Hall

1
Sono solo più righe di codice sotto il programma / snippet che non influiscono sul contatore - utile per fare alcuni test in
ASCII-solo il

1
Fino al 1443: tio.run/##xc09DoIwFADgu3ShTR/… Uso di una versione codificata UTF8 della sequenza numerica.
Nick Kennedy,


2

Perl 5 -pl , punteggio 723

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

Provalo online!

Spiegazione

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

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

Provalo online!

Compressione e indicizzazione semplici.


: P sembra che usare una ricerca più intelligente (vedi risposta in C #) sarebbe di aiuto per il punteggio. O anche semplicemente usando un set di caratteri che non contiene lettere da comprimere
solo ASCII il

1

C # (compilatore interattivo Visual C #) , punteggio: 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])

Mi sento schiacciato dalla soluzione di Peter Taylor in alto. Grazie a Peter Taylor per aver sottolineato che una semplice tabella di ricerca era migliore della mia precedente soluzione di dizionario.

Provalo online!


Questo è molto peggio di una tabella di ricerca diretta: _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()segna 2786.
Peter Taylor,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.