Sostituisci i numeri con la loro rispettiva lettera


23

Crea una funzione o un programma che accetta un numero come input e genera una stringa in cui i punti del codice ASCII per l'alfabeto minuscolo e maiuscolo sono sostituiti dai loro equivalenti di carattere.

  • L'alfabeto maiuscolo usa i punti di codice: 65-90
  • L'alfabeto minuscolo usa i punti di codice: 97-122

Se qualsiasi cifra adiacente nell'input è uguale al punto di codice di una lettera, tale lettera sostituirà le cifre nella stringa di output.

Regole:

  • L'input sarà un numero intero positivo compreso tra 1 e 99 cifre
  • Puoi presumere che sia stato dato solo un input valido
  • Si inizia a sostituire all'inizio dell'intero ( 976-> a6, non 9L)
  • L'input può essere in qualsiasi formato adatto (la rappresentazione della stringa è OK)
  • L'output può essere in qualsiasi formato adatto
  • Si applicano le regole standard

Esempi:

1234567
12345C

3456789
345CY

9865432
bA432

6566676869707172737475767778798081828384858687888990
ABCDEFGHIJKLMNOPQRSTUVWXYZ

6711110010100071111108102
Code000Golf

Il codice più corto in byte vince!


Classifica

Lo snippet di stack nella parte inferiore di questo post genera il catalogo dalle risposte a) come elenco della soluzione più breve per lingua eb) come classifica generale.

Per assicurarti che la tua risposta venga visualizzata, ti preghiamo di iniziare la risposta con un titolo, usando il seguente modello Markdown:

## Language Name, N bytes

dov'è Nla dimensione del tuo invio. Se si migliora il punteggio, è possibile mantenere i vecchi punteggi nel titolo, colpendoli. Per esempio:

## Ruby, <s>104</s> <s>101</s> 96 bytes


2
"L'ingresso sarà un numero intero positivo compreso tra 1 e 99 cifre" In quasi tutti i linguaggi di programmazione che conosco, sarà una stringa con un numero compreso tra 1 e 99 cifre, poiché anche un int a 64 bit può contenere solo 19 decimali cifre ...
TJ Crowder,

3
@TJCrowder Presumo che intendesse intero in senso matematico, non il tipo di dati.
Dennis,

1
@TJCrowder punto valido :-) Anche se, se non sbaglio, 1e99 è tecnicamente ancora un numero intero. long intnon basta, è necessario super long int.
Stewie Griffin,

1
@StewieGriffin: Hah! :-) Sono sicuro che c'è una lingua da qualche parte con una cosa del genere.
TJ Crowder,

Risposte:


2

Jolf, 18 16 byte

Provalo qui! Sapevo che la funzione upperLower sarebbe stata utile un giorno! Sostituisci ócon ΢o usa semplicemente il link dell'interprete. Questo è codificato in ISO 8859-7.

ρiLaΜGpwpuEdóH΅A
      pw           upper and lower
        pu         of the uppercase alphabet
     G    E        split by nothing (E = "")
    Μ      dóH     map each char to its numeric counterpart
  La               regex alternate array (e.g. La[1,2,3] => "1|2|3")
ρi            ΅A   replace input with the character code of the match (΅ is string lambda)

17

Perl, 39 38 byte

(1 byte aggiunto per il -pflag.)

$"="|";s/@{[65..90,97..122]}/chr$&/ge
s/                           /          replace...
  @{[                      ]}           this string, treated as a regex:
     join"|",65..90,97..122             65|66|67|68|...|121|122
                                   /ge  ...with this string, eval()'d:
                                 $&     the entirety of the last match
                              chr       convert to char from ASCII code

Lo strumento giusto per il lavoro ™.

La spiegazione è obsoleta dopo una piccola ottimizzazione (grazie a dev-null !) Che la rende un singolo byte più breve (ma un po 'meno elegante): la $"variabile rappresenta cosa fare joinquando si interpola un arrray in una stringa, quindi l'impostazione $"="|"rimuove la necessità di join.

demo:

llama@llama:~$ perl -pe '$"="|";s/@{[65..90,97..122]}/chr$&/ge' 
1234567
12345C
3456789 
345CY
9865432
bA432
6566676869707172737475767778798081828384858687888990
ABCDEFGHIJKLMNOPQRSTUVWXYZ
6711110010100071111108102
Code000Golf

Immagino che tu possa salvare un singolo byte impostando $"="|"invece di unirti?
Andlrc,

per esempio. $"="|";s/@{[65..90,97..122]}/chr$&/ge
Andlrc,

@ dev-null Che funziona, grazie!
Maniglia della porta

11

Javascript, 80 byte

s=>s.replace(/6[5-9]|[78]\d|9[0789]|1[01]\d|12[012]/g,x=>String.fromCharCode(x))

Guarda regex in azione qui: https://regex101.com/r/iX8bJ2/1

Solo per curiosità, una cosa che ho imparato qui:

Non posso cambiare x=>String.fromCharCode(x)in String.fromCharCode perché ...


6

CJam, 22 byte

q{+'[,_el^{_is@\/*}/}*

Provalo online!

sfondo

La semplice sostituzione di tutte le occorrenze di gruppi di cifre con le lettere corrispondenti (nell'ordine che possiamo scegliere) non rispetterà la regola da sinistra a destra.

Invece, possiamo generare tutti i prefissi della stringa di input e tentare di effettuare tutte le possibili sostituzioni mentre le stiamo generando. Poiché nessun punto di codice è contenuto in un altro punto di codice, l'ordine di questi tentativi non è importante.

Per esempio:

67466

6     -> 6
67    -> C
 C4   -> C4
 C46  -> C46
 C467 -> C4B

C4B

Come funziona

q                       Read all input from STDIN.
 {                  }*  Fold; push the first character, and for each subsequent
                        character, push it and do the following:
  +                       Append the character to the string on the stack.
   '[,_el^                Push the string of all ASCII letters.
                          See: http://codegolf.stackexchange.com/a/54348
          {       }/      For each ASCII letter:
           _                Push a copy of the letter.
            i               Convert to integer, i.e., compute its code point.
             s              Cast to string.
              @\            Rotate and swap.
                /           Split the modified input characters at occurrences (at
                            most one) of the string repr. of the code point.
                 *          Join, separating by the corresponding letter.

4

PHP, 110 102 101 68 67 byte

Sfida piuttosto difficile. Questo è il massimo che ho potuto inventare. Questa è una versione completamente nuova.

for($i=64;123>$i+=$i-90?1:7;)$t[$i]=chr($i)?><?=strtr($argv[1],$t);

Esegui in questo modo:

php -r 'for($i=64;123>$i+=$i-90?1:7;)$t[$i]=chr($i)?><?=strtr($argv[1],$t);' 6711110010100071111108102;echo
> Code000Golf
  • Salvato 8 byte usando ctype_alphainvece di preg_match, grazie a manatwork
  • Salvato 1 byte anteponendo 0alla stringa invece di controllare una stringa non vuota: quando l'ultimo carattere dell'input è uno 0, la sottostringa che sto prendendo sarebbe "0", che è falsa, mentre "00" è vero, quindi non salterà la stampa dell'ultimo 0.
  • Risparmiato un enorme 33 byte utilizzando strtrdopo aver creato un array con coppie di conversione
  • Salvato un byte utilizzando un tag di stampa breve

1
Dovrai cambiare l'espressione regolare in #[A-Z]#iquella attuale consentirà felicemente di trasformare "92" in "\". Oppure prova ctype_alpha()invece di preg_match(). Finora sembra funzionare.
arte

"0", which is falsy, whereas "00" is truthyBene, PHP.
gatto

3

Python 3, 211 189 188 byte

def f(c,i=0,n=""):
 while i<len(c):a=1;x=int(c[i:i+2]);a=2 if 64<x<91 or 96<x<100 else a;x=int(c[i:i+3]) if a<2 else x;a=3 if 99<x<123 else a;x=chr(x) if a>1 else c[i];n+=x;i+=a
 return n
  • 23 byte salvati sostituendo \ n con; grazie a Dennis

Test

inserisci qui la descrizione dell'immagine


1
Se si utilizza ;invece delle interruzioni di riga, è possibile inserire l'intero ciclo while su una singola riga. Inoltre, la prima riga può diventare def f(c,i=0,n=""):.
Dennis,

1
a=1;a=2 if 64<x<91 or 96<x<100 else a-> a=1+(64<x<91or 96<x<100)ecc.
Seequ,

2

Pyth, 20 18 byte

.Uu:G`CHHsrBG1+bZz

Stesso algoritmo di @Dennis. È molto più facile programmare in Pyth sul mio telefono che in Jelly.

                implicit: z=input
.U              Reduce the following lambda b, Z over z
                b is the string being built; z is the next char
   u                Reduce the following lambda G,H over +bZ
                    G is the string, H is the next letter to match
     :                  Replace
       G                in G
       ` C H            the char code of H
       H                with H
     s rB            where H takes on values:
          G              the lowercase alphabet (that's the global value of G)
          1              concatenated to its uppercased self.
     +          
       b
       Z
   z

Grazie @isaacg

Provalo qui .


Non puoi stare fuori da questo sito sul tuo telefono, vero ...?
Conor O'Brien,

1
Soprattutto quando ho il lusso di
scrivere

1
È vero, probabilmente bello prendersi una pausa da tutta quella gelatina ... Sai, una dieta equilibrata;)
Conor O'Brien,

0

05AB1E , 12 byte

õsvy«žnvyÇy:

Provalo online o verifica tutti i casi di test .

Spiegazione:

õ             # Push an empty string ""
 sv           # Swap to get the (implicit) input-string, and loop over its characters:
   y«         #  Append the current character to the string
     žn       #  Push builtin "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
       v      #  Inner loop over each of these letters:
           :  #   Replace in the string all occurrences (should be either 0 or 1 occurrence)
        yÇ    #   of the ordinal value of the current letter
          y   #   by this letter
              # (after the loops, implicitly output the top of the stack as result)

Alternativa a 12 byte utilizzando la riduzione:

Å»«žnvyÇy:]θ

Provalo online o verifica tutti i casi di test o vedi una riduzione passo-passo con solo i primi 10 byte .

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.