Conteggio e sillabazione


26

Scrivi un programma che accetta come input una stringa che genera una stringa con le seguenti proprietà.

  • Se un carattere nella stringa è una lettera maiuscola (ASCII 41-5A), il carattere viene sostituito da una stringa contenente ogni lettera fino alla lettera originale inclusa, inclusa la maiuscola. Ad esempio, se la stringa di input è I, allora l'output sarebbe ABCDEFGHI.
  • Allo stesso modo, se un carattere è una lettera minuscola (ASCII 61-7A), il carattere viene sostituito allo stesso modo. isarebbe sostituito da abcdefghi.
  • Se un carattere è un numero (ASCII 30-39), il carattere viene sostituito da ogni numero a partire da 0e contando fino al numero.
  • Se l'input contiene singoli caratteri concatenati, le sequenze di sostituzione vengono concatenate insieme.
  • Tutti gli altri caratteri vengono stampati senza modifiche.

Input di esempio (separati da righe vuote)

AbC123

pi=3.14159

Hello, World!

Output di esempio

AabABC010120123

abcdefghijklmnopabcdefghi=0123.0101234010123450123456789

ABCDEFGHabcdeabcdefghijklabcdefghijklabcdefghijklmno, ABCDEFGHIJKLMNOPQRSTUVWabcdefghijklmnoabcdefghijklmnopqrabcdefghijklabcd!

Questo è il codice golf, ragazzi. Si applicano le regole standard. Vince il codice più breve in byte.


Per visualizzare la classifica, fai clic su "Mostra snippet di codice", scorri verso il basso e fai clic su "► Esegui snippet di codice". Snippet creato da Optimizer.


10
Idea per un sequel: annulla questa trasformazione.
ETHproductions

2
@ETHproductions Forse, anche se il modo qui mi sembra migliore perché può accettare qualsiasi input; e se al contrario fosse l'input Hello, World!?
Arcturus,

Dobbiamo supportare i caratteri NUL (ascii 0x00) nella stringa di input?
nimi,

@Eridan in tal caso, il codice dovrebbe stampare un errore o, per una svolta divertente, eseguire la trasformazione di cui sopra. Vale a dire, f (f (input)) == input. Non credo sia possibile per qualsiasi input alfanumerico disobbedire a questa relazione.
Jake,

1
È del tutto vero - io presumo che "se una stringa PU CAN ESSERE il risultato della trasformazione, invertirla. Altrimenti, applicare la trasformazione". - è la tua sfida, puoi specificare qualsiasi regola tu scelga fintanto che (a) sono coerenti e (b) sono verificabili e non richiedono un'intera nuova branca della matematica per essere risolti. Nota a margine: irradiare (b) sarebbe interessante; non si sa mai quando qualcuno rivoluzionerà accidentalmente l'informatica elaborando un algoritmo di tempo polinomiale per un problema NP - che in realtà è ragionevole qui, purché risparmi 4 byte.
Jake,

Risposte:


11

Pyth, 19 byte

sXzsJ+rBG1jkUTs._MJ

Provalo online: dimostrazione o suite di test

Spiegazione

sXzsJ+rBG1jkUTs._MJ
      rBG1            the list ["abc...xyz", "ABC...XYZ"]
     +    jkUT        appends the string "0123456789"
    J                 save this list of 3 strings in J
   sJ                 join the strings in J
               ._MJ   create all prefixes of the strings in J
              s       and combine them to one list
 XzsJ         s._MJ   translate the input string, chars from sJ
                      get translated to the correct prefix,
                      chars that don't appear in sJ don't get translated
s                     join all resulting translation strings

8

Python 2.7, 100 98 96 byte

a=[]
for c in raw_input():d=ord(c);a+=range(max(d&96|1,48),d)*c.isalnum()+[d]
print bytearray(a)

7

TeaScript , 24 byte 26 28

TeaScript è JavaScript per il golf

xl(#(i=lN()1)h(ii(l)+1))

Abbastanza corto

Provalo online

Spiegazione

x.l(#            // Loops through each character of the string

     (i=l.N()1)  // Determines whether a character is alphanumeric
                 // Will return A-Z, a-z or 0-9 depending on result
                 // Assigns to variable i

     .h(         // Get characters up to...
        i.i      // where the character is in "i"
     ) + 1       // Increased by one
)

6

Rubino, 137 87 82 76 67 55 byte

Ungolf, ma puoi vedere lo schema.

$><<gets.gsub(/[a-z0-9]/i){[*" 0Aa"[$&.ord/32]..$&]*""}

Modifica: ridotto a un solo regex.

Modifica 2: aveva molti spazi extra.

Modifica 3: Grazie a manatwork per giocare a golf a 12 byte!


1
$><<gets.gsub(/[a-z0-9]/i){[*" 0Aa"[$&.ord/32]..$&]*""}
arte

@manatwork Accidenti è intelligente!
Peter Lenkefi,

4

Python 2, 145 140 133 103 102 byte

Una funzione anonima non così elegante che utilizza la comprensione dell'elenco. Sento che la logica dovrebbe essere molto più breve, proverò a capire qualcosa.

lambda k:''.join([c,`map(chr,range(48+17*(c>'@')+32*(c>'`'),ord(c)+1))`[2::5]][c.isalnum()]for c in k)

Dovrebbe essere dato un nome da usare, cioè f=...


@Mego Oh, ahah! Nessun problema :)
Kade,

4

Haskell, 95 91 86 60 byte

c#(a:o:r)|c<a||c>o=c#r|1<2=[a..c]
c#_=[c]
f=((#"AZaz09")=<<)

Esempio di utilizzo: f "pi=3.14159"->"abcdefghijklmnopabcdefghi=0123.0101234010123450123456789"

Come funziona: copia ogni carattere c nella stringa di input a meno che c sia tra uno qualsiasi di A/ Z, a/ zo 0/ 9e in tal caso prendi l'elenco di [<first char in pair> ... <c>].

Modifica: @Zgarb ha salvato molti byte. Grazie!


Penso che tu possa definire c#_=[c]e saltare del ttutto.
Zgarb,

@Zgarb: Sì, sì, e quindi sè anche superfluo. Molte grazie!
nimi,

4

JavaScript (ES6), 143 138 byte

Utilizza i confronti di stringhe per verificare quali caratteri utilizzare.

s=>s.replace(/[A-Z0-9]/gi,c=>(a=btoa`Ó]·ã»óÖq×£Y§¢«²Û¯Ã³`,(c>'Z'?a:a.toUpperCase()).split``.filter(x=>x<=c&(x>'9'|c<'A')).join``))

Demo online. Testato su Firefox e Chrome.

Modifica: 5 byte salvati sostituendoli a='0123456789abcdefghijklmnopqrstuvwxyz'con

a=btoa`Ó]·ã»óÖq×£Y§¢«²Û¯Ã³`

3

PHP, 146 byte

golfed

function f($n,&$l){for(;$c=$n[$r],$b=0,$d=ord($c);$r++,$b?:$l.=$c)foreach([58=>48,91=>65,123=>97] as $m=>$i)while($d<$m&&$d>=$i)$b=$l.=chr($i++);}

Revisione 1: inserisci direttamente gli intervalli ord in foreach. massimi di intervallo di ordini incrementati e modificati $d<=$min $d<$m. usando forper iterare i caratteri invece di foreache str_split. Rimosso tutto {}spostando il codice infor

Ungolfed

function f($input,&$output){
foreach (str_split($input) as $char){
  $ord = ord($char);
  $ords = [57=>48,90=>65,122=>97];
  $b = 0;
  foreach ($ords as $max=>$min){
     while ($ord<=$max&&$ord>=$min){
         $b = $max;
         $output .= chr($min);
         $min++;
     }
  }
  $b ?: $output.=$char;
}
};

$output = NULL;
$input = "pi=3.141592";
f($input,$output);
echo $output;

Spiegazione: dividere la stringa in matrice. Se il valore ASCII rientra in un intervallo (per az, AZ, 0-9), quindi incrementa un contatore dal minimo dell'intervallo al valore ASCII del carattere, aggiungendo ciascun valore fino a raggiungere il valore ASCII del carattere.

Sono passato in &$varmodo che l'output sia fatto per riferimento piuttosto che areturn


Non è necessario che la variabile $ z contenga l'array di intervalli, è possibile inserire direttamente l'array letterale foreach.
arte

range()Hai provato a usare ? pastebin.com/k2tqFEgD
manatwork

@manatwork, sono passato dal dichiarare $ze ho apportato alcune altre modifiche. range()sarebbe probabilmente meglio. Potrei provare qualcosa con range più tardi.
Reed,

Usando range, ho ottenuto function f($n,&$l){$o=['a'=>'z','A'=>'Z','0'=>'9'];foreach(str_split($n) as $c){$b=0;foreach($o as $m=>$x)!($c>$m&&$c<=$x)?:$b=$l.=implode(range($m,$c));$b?:$l.=$c;}}, che era 166.
Reed,

1
Sì, dopo aver riscritto a 146 caratteri l'utilizzo range()è meno vantaggioso. Ma quel 166 è troppo lungo anche così: il $ o per l'array letterale è tornato, ci sono spazi extra attorno alle asparole chiave, join()è alias per implode(). (?. Controllato il codice pastebin ho linkato prima mostra un'altra possibilità di memorizzare i punti finali gamma) Per quanto riguarda la soluzione di 146 caratteri, è possibile spostare il compito di $ c all'interno della ord()chiamata: $d=ord($c=$n[$r]).
arte

2

Python, 143 byte

lambda s:''.join(map(chr,sum(map(lambda a,r=range:r(65,a+1)if 64<a<97else r(97,a+1)if 96<a<123else r(48,a+1)if 47<a<58else[a],map(ord,s)),[])))

Provalo online


2
È possibile utilizzare z = range per salvare 4 byte.
Arcturus,

1
Abbastanza sicuro che puoi sostituire i rientri del doppio spazio con una singola scheda, che ti farebbe risparmiare un paio di byte
Fund Monica's Lawsuit

2

Perl 6, 101 byte

Ecco un primo passaggio:

sub MAIN($_ is copy){
  s:g/<[0..9]>/{(0..$/).join}/;
  s:g/<[a..z]>/{('a'..~$/).join}/;
  s:g/<[A..Z]>/{('A'..~$/).join}/;
  .say
}
sub MAIN($_ is copy){s:g/<[0..9]>/{(0..$/).join}/;s:g/<[a..z]>/{('a'..~$/).join}/;s:g/<[A..Z]>/{('A'..~$/).join}/;.say}

119


Usando .transsu $_per rimuovere is copy.

sub MAIN($_){
  .trans(
    /\d/       => {(0..$/).join},
    /<[a..z]>/ => {('a'..~$/).join},
    /<[A..Z]>/ => {('A'..~$/).join}
  ).say
}
sub MAIN($_){.trans(/\d/=>{(0..$/).join},/<[a..z]>/=>{('a'..~$/).join},/<[A..Z]>/=>{('A'..~$/).join}).say}

106


Agire @*ARGSdirettamente invece di definire un MAINsub.
(altrimenti identico all'esempio precedente)

@*ARGS[0].trans(/\d/=>{(0..$/).join},/<[a..z]>/=>{('a'..~$/).join},/<[A..Z]>/=>{('A'..~$/).join}).say

101


2

Scala, 111 91 byte

val f=(_:String).flatMap(x=>if(x.isDigit)('0'to x)else if(x.isUpper)('A'to x)else('a'to x))

Questo fallisce per pi=3.14159. Potrebbe essere la soluzione val f=(_:String).flatMap(x:String=>if(x.isDigit)('0'to x)else if(x.isUpper)('A'to x)else if(x.isLower)('a'to x)else x.toString)per un enorme 128 caratteri?
Leonardo,

2

Julia, 102 98 90 84 byte

s->join([(i=Int(c);join(map(Char,(64<c<91?65:96<c<123?97:47<c<58?48:i):i)))for c=s])

Ciò crea una funzione senza nome che accetta una stringa e restituisce una stringa.

Ungolfed:

function f(s::AbstractString)
    # For each character in the input, get the codepoint and construct
    # a range of codepoints from the appropriate starting character to
    # the current character, convert these to characters, and join them
    # into a string
    x = [(i = Int(c);
          join(map(Char, (isupper(c) ? 65 :
                          islower(c) ? 97 :
                          isdigit(c) ? 48 : i):i))
         ) for c in s]

    # Join the array of strings into a single string
    return join(x)
end

2

PowerShell, 155 byte

($args-split''|%{$b=$_;switch([int][char]$_){{$_-in(65..90)}{[char[]](65..$_)}{$_-in(97..122)}{[char[]](97..$_)}{$_-in(48..57)}{0..$b}default{$b}}})-join''

Tecnicamente un liner, e PowerShell è tutto su quelli ;-)

Suddivide l'input, lo convoglia in un ForEach-Objectloop, attiva il valore intero del carattere cast, quindi genera nuovi char[]intervalli appropriati. Nota che dobbiamo spendere byte per impostare una variabile temporanea $bperché l'atto di trasmettere l'input $_nell'istruzione switch significa che non possiamo semplicemente continuare a usare $_o otterremo un output funky.

EDIT - Devo sottolineare che questo eliminerà gli errori poiché il primo oggetto che viene inserito %{...}è un oggetto null. Poiché STDERR è ignorato per impostazione predefinita , questo non dovrebbe essere un problema. Se è un problema, modifica il primo bit in modo ($args-split''-ne''|...da eliminare l'oggetto null.


2

JavaScript (ES6), 340 258 273 271 byte

a=s=>{s=s.split``;Q=x=>x.toUpperCase();A="ABCDEFGHIJKLMNOPQRSTUVWXYZ";D="0123456789";f="";for(i=0;i<s.length;i++){j=s[i];c="to"+(Q(j)==j?"Upper":"Lower")+"Case";j=Q(j);if(q=A.search(j)+1)f+=g=A.slice(0,q)[c]();else if(q=D.search(j)+1)f+=g=D.slice(0,q);else f+=j}return f}

È possibile utilizzare una stringa di modello `` per divisione anziché ("")e f=i=""nel ciclo for. Potresti riuscire a salvare qualche altro byte.
intrepidcoder,

@intrepidcoder Il primo avrebbe funzionato. Sto verificando il secondo.
Conor O'Brien,

2

C (269 byte)

(interruzione di riga aggiunta per maggiore chiarezza)

#include<stdio.h>
#define F(x,y,z)if(c>=T[0][x]&&c<=T[1][y]){z}
#define L(x,y)for(i=0;i<x;++i){y}
main(){int c,i,n;char o,*T[]={"0Aa","9Zz"};while((c=getchar())!=EOF)
{F(0,2,L(3,F(i,i,o=T[0][i],n=++c-o;L(n,putchar(o++));break;))else putchar(c);)}}

Ungolfed

#include<stdio.h>
int main(void)
{
  int c, i, n;
  char output;
  char *char_table[] = {"0Aa", "9Zz"};

  while ((c = getchar()) != EOF) {
    if (c < '0' || c > 'z') {
      putchar(c);
    } else {
      for (i = 0; i < 3; ++i) {
        if (c >= char_table[0][i] && c <= char_table[1][i]) {
          output = char_table[0][1];
          n = c - output;
          break;
        }
      }
      for (i = 0; i <= n; ++i) {
        putchar(output);
        ++output;
      }
    }
  }
  return(0);
}

2

Perl 5 , 66 61 (51 byte + 1) 52

La combinazione di regex con operatori condizionali ha funzionato bene in questo caso.
Con un join Utilizzo della mappa per combinare gli intervalli in un array.

say map{(/\d/?0:/[A-Z]/?A:/[a-z]/?a:$_)..$_}split//

Test

$ echo "A0C1.a3c_2!" |perl -M5.010 -n count_and_spell_up.pl
A0ABC01.a0123abc_012!

Spiegazione

say                # print output
  map{             # loop through the array that's at the end of the other mustache. 
                   # outputs an array. 
     (
        /\d/?0            # if $_ is a digit then 0
          :/[A-Z]/?A      # else, if it's an uppercase character then A
             :/[a-z]/?a   # else, if it's a lowercase character then a
               :$_        # else the current character
     )..$_         # generate a sequenced string of characters 
                   # that ends with the magic variable $_ 
                   # ($_ is currently a character from the array)
  }split//     # split the magic variable $_ (currently the input string)
               # to an array of characters

1

JavaScript (ES7), 125 byte

C'erano già due risposte JS incentrate sulla codifica delle stringhe, quindi ho deciso di optare per un approccio più algoritmico utilizzando String.fromCharCode():

x=>x.replace(/[^\W_]/g,z=>(c=z.charCodeAt(),f=c<65?48:c<97?65:97,String.fromCharCode(...[for(i of Array(c-f).keys())i+f])+z))

Un vantaggio dell'utilizzo di questo metodo è che richiede qualsiasi quantità di codici char, quindi joinnon è necessario inserire l'elenco. Questo si è rivelato più breve di qualsiasi altra tecnica, quindi sono contento del risultato.


1

MUMPS, 131 byte

u(l,h) i l'>a,a'>h f j=l:1:a s o=o_$C(j),f=0
    q
t(s) f i=1:1:$L(s) s a=$A(s,i),f=1 d u(48,57),u(65,90),u(97,122) s:f o=o_$C(a)
    q o

Sono riuscito a salvare alcuni byte qui grazie allo scoping dinamico di MUMPS . Ecco una versione non equivalente approssimativamente equivalente, che sicuramente mi piacerebbe evidenziare la sintassi, se fosse disponibile solo il supporto per il modulo Prettify MUMPS .

convert(str) ;
    new asciiCode,flag,i,output
    for i=1:1:$LENGTH(str) do
    . set asciiCode=$ASCII(str,i)
    . set flag=1
    . do helper(48,57)
    . do helper(65,90)
    . do helper(97,122)
    . if 'flag do
    . . set output=output_$CHAR(asciiCode)
    quit
helper(low,high) ;
    if low'>asciiCode,asciiCode'>high do
    . for code=low:1:asciiCode do
    . . set output=output_$CHAR(code)
    . . set flag=0
    quit

1

Perl 6, 78 77 byte

@*ARGS[0].trans(/\d/=>{[~] 0..$/},/<:L>/=>{[~] samecase("a",~$/)..~$/}).say

Ho saputo che potrebbe essere abbreviata combinando le 'a'..'z'e 'A'..'Z'casi, avrei provato duro.
Brad Gilbert b2gills

Consiglio di aggiungere <!-- language-all: lang-perl6 -->subito dopo in ## Perl 6modo che si evidenzierà correttamente. (Il cambiamento è già in attesa di questa risposta)
Brad Gilbert b2gills

È possibile passare {[~](0..$/)}a {[~] 0..$/}quale salverà un byte.
Brad Gilbert b2gills

0

Mathematica, 102 byte

FromCharacterCode@Flatten[Which[64<#<91,65,96<#<123,97,47<#<58,48,1>0,#]~Range~#&/@ToCharacterCode@#]&

Oh bene...


0

CJam, 32 31 byte

q_'[,_el^A,s+26/ff{_@#)<}:s\.e|

Provalo online nell'interprete CJam .

Come funziona

q_    e# Push two copies of the user input.
'[,   e# Push the string of all ASCII characters up to Z.
_el   e# Push a copy and convert it to lowercase.
^     e# Perform symmetric difference this keeps only letters.
A,s+  e# Append the string "0123456789".
26/   e# Split the result into chunks of length 26.
ff{   e# For each character from input: For each chunk:
  _@  e#   Copy the chunk and rotate the character on top of it.
  #   e#   Push the index of the character in the string (-1 for not found).
  )<  e#   Increment and keep that many characters from the left of the chunk.
      e#   This pushes "" for index -1.
}
:s    e# Flatten the resulting arrays of strings.
      e# The results will be empty strings iff the character wan't alphanumeric.
\     e# Swap the result with the input string.
.e|   e# Perform vectorized logical OR.

0

Python 2, 135 117 byte

s=''
for c in raw_input():
 b=ord(c);e=b+1
 if c.isalnum():
  b=max(b&96,47)+1
 for i in range(b,e):s+=chr(i)
print s

0

PHP - 291 byte

Passa la stringa a GET["s"].

<?php $s=$_GET["s"];$m="array_map";echo implode($m(function($v){$i="in_array";$l="implode";$r="range";global$m;$a=ord($v);if($i($a,$r(48,57)))$v=$l($m("chr",$r(48,$a)));if($i($a,$r(65,90)))$v=$l($m("chr",$r(65,$a)));if($i($a,$r(97,122)))$v=$l($m("chr",$r(97,$a)));return$v;},str_split($s)));

0

C #, 251 201 184 157 154 byte

using System;class c{static void Main(string[] i){foreach(var c in i[0])for(var x=c>64&c<91?'A':c>96&c<123?'a':c>47&c<58?'0':c;x<=c;)Console.Write(x++);}}

modifica: Strike! Più corto di PowerShell;)


1
puoi fare string[]i?
Erik the Outgolfer,
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.