Zählen und buchstabieren

26

Schreiben Sie ein Programm, das als Eingabe eine Zeichenfolge verwendet, die eine Zeichenfolge mit den folgenden Eigenschaften ausgibt.

  • Wenn ein Zeichen in der Zeichenfolge ein Großbuchstabe ist (ASCII 41-5A), wird das Zeichen durch eine Zeichenfolge ersetzt, die alle Buchstaben bis einschließlich des Originalbuchstaben in Großbuchstaben enthält. Wenn beispielsweise die Eingabezeichenfolge "" lautet I, ist die Ausgabe "" ABCDEFGHI.
  • Wenn ein Zeichen ein Kleinbuchstabe ist (ASCII 61-7A), wird das Zeichen auf die gleiche Weise ersetzt. iwürde ersetzt durch abcdefghi.
  • Wenn ein Zeichen eine Zahl ist (ASCII 30-39), wird das Zeichen durch jede Zahl ersetzt, die von der Zahl beginnt 0und bis zur Zahl zählt.
  • Wenn die Eingabe verkettete Einzelzeichen enthält, werden die Ersetzungssequenzen zusammen verkettet.
  • Alle anderen Zeichen werden ohne Änderung gedruckt.

Beispieleingaben (durch Leerzeilen getrennt)

AbC123

pi=3.14159

Hello, World!

Beispielausgaben

AabABC010120123

abcdefghijklmnopabcdefghi=0123.0101234010123450123456789

ABCDEFGHabcdeabcdefghijklabcdefghijklabcdefghijklmno, ABCDEFGHIJKLMNOPQRSTUVWabcdefghijklmnoabcdefghijklmnopqrabcdefghijklabcd!

Das ist Codegolf, Jungs. Es gelten Standardregeln. Kürzester Code in Bytes gewinnt.


Um die Bestenliste anzuzeigen, klicken Sie auf "Code-Snippet anzeigen", scrollen Sie nach unten und klicken Sie auf "► Code-Snippet ausführen". Snippet erstellt von Optimizer.

Arcturus
quelle
10
Idee für eine Fortsetzung: Machen Sie diese Transformation rückgängig.
ETHproductions
2
@ETHproductions Vielleicht, obwohl mir der Weg hierher besser erscheint, weil er jede Eingabe annehmen kann; Was wäre, wenn die Eingabe umgekehrt wäre Hello, World!?
Arcturus
Müssen wir NUL-Zeichen (ASCII 0x00) in der Eingabezeichenfolge unterstützen?
nimi
@Eridan In diesem Fall sollte der Code entweder einen Fehler ausgeben oder aus Spaß die obige Transformation ausführen. Dh, f (f (Eingabe)) == Eingabe. Ich glaube nicht, dass eine alphanumerische Eingabe diese Beziehung missachten kann.
Jake
1
Das ist völlig richtig - ich gehe davon aus, dass "wenn ein String das Ergebnis der Transformation sein kann, kehren Sie ihn um. Andernfalls wenden Sie die Transformation an." - Es ist Ihre Herausforderung, Sie können alle Regeln angeben, die Sie wählen, solange (a) sie konsistent und (b) überprüfbar sind und für die Lösung keinen völlig neuen Zweig der Mathematik erfordern. Randnotiz: Bestrahlung (b) wäre interessant; Man weiß nie, wann jemand versehentlich die Informatik revolutionieren wird, indem er einen polynomialen Zeitalgorithmus für ein NP-Problem entwickelt - was hier eigentlich sinnvoll ist, solange 4 Bytes eingespart werden.
Jake

Antworten:

11

Pyth, 19 Bytes

sXzsJ+rBG1jkUTs._MJ

Probieren Sie es online aus: Demo oder Test Suite

Erläuterung

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
Jakube
quelle
8

Python 2.7, 100 98 96 Bytes

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

TeaScript , 24 Bytes 26 28

TeaScript ist JavaScript zum Golfen

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

Ziemlich kurz

Probieren Sie es online aus

Erläuterung

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
)
Downgoat
quelle
6

Ruby, 137 87 82 76 67 55 Bytes

Ungolfed, aber Sie können das Muster sehen.

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

Bearbeiten: Golf auf nur eine Regex.

Edit 2: hatte viele zusätzliche Leerzeichen.

Edit 3: Dank an Manatwork für das Golfen von 12 Bytes!

Peter Lenkefi
quelle
1
$><<gets.gsub(/[a-z0-9]/i){[*" 0Aa"[$&.ord/32]..$&]*""}
Manatwork
@manatwork Verdammt, das ist schlau!
Peter Lenkefi
4

Python 2, 145 140 133 103 102 Bytes

Eine nicht ganz so schlanke anonyme Funktion mit Listenverständnis. Ich denke, die Logik sollte viel kürzer sein, ich werde versuchen, etwas herauszufinden.

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

Sollte ein Name gegeben werden, der verwendet werden soll, dh f=...

Kade
quelle
@ Mego Oh, haha! Keine Sorge :)
Kade
4

Haskell, 95 91 86 60 Bytes

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

Anwendungsbeispiel: f "pi=3.14159"->"abcdefghijklmnopabcdefghi=0123.0101234010123450123456789"

So funktioniert es: Kopieren Sie jedes Zeichen c in die Eingabezeichenfolge, es sei denn, c befindet sich zwischen A/ Z, a/ zoder 0/, 9und nehmen Sie in diesem Fall die Liste von [<first char in pair> ... <c>].

Edit: @Zgarb hat viele, viele Bytes gespeichert. Vielen Dank!

nimi
quelle
Ich denke, Sie können völlig definieren c#_=[c]und überspringen t.
Zgarb
@Zgarb: Ja und dann sist das ja auch überflüssig. Vielen Dank!
Nimi
4

JavaScript (ES6), 143 138 Bytes

Verwendet Zeichenfolgenvergleiche, um zu testen, welche Zeichen verwendet werden sollen.

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``))

Online-Demo. Getestet in Firefox und Chrome.

Edit: Saved 5 Bytes durch den Austausch a='0123456789abcdefghijklmnopqrstuvwxyz'mit

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

PHP, 146 Bytes

Golf gespielt

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++);}

Revision 1: Ordnungsbereiche direkt in foreach stellen. inkrementierte ord Range Maxes und geändert $d<=$mzu $d<$m. Verwenden Sie forzum Iterieren von Zeichen anstelle von foreachund str_split. Alles {}wurde entfernt, indem Code in verschoben wurdefor

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;

Erläuterung: Zeichenfolge in Array aufteilen. Wenn der ASCII-Wert in einen Bereich fällt (für az, AZ, 0-9), erhöhen Sie einen Zähler von der Minute des Bereichs bis zum ASCII-Wert des Zeichens, und fügen Sie jeden Wert hinzu, bis Sie den ASCII-Wert des Zeichens erreichen.

Ich habe übergeben, &$vardamit die Ausgabe als Referenz und nicht alsreturn

Schilf
quelle
Es ist nicht erforderlich, dass die Variable $ z das Array von Bereichen enthält. Sie können das Array-Literal direkt eingeben foreach.
Manatwork
Versucht zu benutzen range()? pastebin.com/k2tqFEgD
Manatwork
@manatwork, ich habe mich von der Deklaration abgewandelt $zund einige andere Änderungen vorgenommen. range()wäre wahrscheinlich besser. Ich könnte später etwas mit Reichweite versuchen.
Reed
Mit rangebekam ich 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;}}, das war 166.
Reed
1
Ja, nach dem Umschreiben auf 146 Zeichen ist die Verwendung range()weniger vorteilhaft. Aber das 166 ist trotzdem zu lang: Das $ o für das Array-Literal ist zurück, es gibt zusätzliche Leerzeichen um asSchlüsselwörter, join()ist ein Alias ​​für implode(). (?. Auf den Pastebin Code , den ich früher verknüpft zeigt eine andere Möglichkeit , die Reichweite Endpunkte zu speichern) In Bezug auf Ihre 146 Zeichen - Lösung können Sie die Zuordnung zu $ c innerhalb des bewegen ord()Anruf: $d=ord($c=$n[$r]).
Manatwork
2

Python, 143 Bytes

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)),[])))

Probieren Sie es online aus

Mego
quelle
2
Sie können z = range verwenden, um 4 Bytes zu sparen.
Arcturus
1
Ziemlich sicher, dass Sie die doppelten Leerzeichen durch einen einzelnen Tabulator ersetzen können, wodurch Sie ein paar Bytes sparen würden
Fund Monica's Lawsuit
2

Perl 6, 101 Bytes

Hier ist ein erster Durchgang:

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


Mit .transon $_entfernen 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


Handeln Sie @*ARGSdirekt, anstatt ein MAINSub zu definieren.
(ansonsten identisch mit vorherigem Beispiel)

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

101

Brad Gilbert b2gills
quelle
2

Scala, 111 91 Bytes

val f=(_:String).flatMap(x=>if(x.isDigit)('0'to x)else if(x.isUpper)('A'to x)else('a'to x))
Martin Seeler
quelle
Dies schlägt fehl für pi=3.14159. Könnte die Lösung 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)für satte 128 Zeichen sein?
Leonardo
2

Julia, 102 98 90 84 Bytes

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])

Dadurch wird eine unbenannte Funktion erstellt, die eine Zeichenfolge akzeptiert und eine Zeichenfolge zurückgibt.

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
Alex A.
quelle
2

PowerShell, 155 Bytes

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

Technisch gesehen ein Einzeiler, und PowerShell dreht sich alles um diese ;-)

Teilt die Eingabe, leitet sie in eine ForEach-ObjectSchleife um, schaltet den ganzzahligen Wert des Umsetzungszeichens ein und generiert dann einen neuen char[]der entsprechenden Bereiche. Beachten Sie, dass wir zum Festlegen einer temporären Variablen Bytes benötigen, $bda das Umsetzen der Eingabe $_in der switch-Anweisung bedeutet, dass wir nicht einfach weiterverwenden können, sondern $_eine funky Ausgabe erhalten.

BEARBEITEN - Ich möchte darauf hinweisen, dass dies Fehler auslöst, da das erste Objekt, in das eingespeist %{...}wird, ein Nullobjekt ist. Da STDERR standardmäßig ignoriert wird , sollte dies kein Problem sein. Wenn es ein Problem ist, ändern Sie das erste Bit ($args-split''-ne''|..., um das Nullobjekt zu entfernen.

AdmBorkBork
quelle
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}
Conor O'Brien
quelle
Sie können anstelle von ("")und f=i=""in der for-Schleife eine Vorlagenzeichenfolge `` für split verwenden . Möglicherweise können Sie einige weitere Bytes speichern.
intrepidcoder
@intrepidcoder Das erste würde funktionieren. Ich überprüfe den zweiten.
Conor O'Brien
2

C (269 Bytes)

(Zeilenumbruch zur Verdeutlichung hinzugefügt)

#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);
}
Musarithmie
quelle
2

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

Das Kombinieren von regulären Ausdrücken mit bedingten Operatoren hat in diesem Fall gut funktioniert.
Mit einem Join Mit map kombinieren Sie die Bereiche zu einem Array.

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

Prüfung

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

Erläuterung

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
LukStorms
quelle
1

JavaScript (ES7), 125 Byte

Es gab bereits zwei JS-Antworten, die sich auf das Codieren der Zeichenfolgen konzentrierten. Daher entschied ich mich für einen algorithmischeren Ansatz 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))

Ein Vorteil dieser Methode besteht darin, dass eine beliebige Anzahl von Zeichencodes joinerforderlich ist , sodass die Liste nicht erforderlich ist. Dies fiel kürzer aus als jede andere Technik, daher bin ich mit dem Ergebnis zufrieden.

ETHproductions
quelle
1

MUMPS, 131 Bytes

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

Dank des dynamischen Scoping von MUMPS konnte ich hier einige Bytes einsparen . Hier ist eine grob äquivalente ungolfed-Version, die ich gerne syntaktisch hervorheben würde, wenn nur das MUMPS Prettify-Modul unterstützt würde .

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
Senshin
quelle
1

Perl 6, 78 77 Bytes

@*ARGS[0].trans(/\d/=>{[~] 0..$/},/<:L>/=>{[~] samecase("a",~$/)..~$/}).say
Hotkeys
quelle
Ich wusste, dass es durch das Kombinieren der Fälle 'a'..'z'und verkürzt 'A'..'Z'werden konnte, ich hätte es härter versuchen sollen.
Brad Gilbert b2gills
Ich empfehle das Hinzufügen <!-- language-all: lang-perl6 -->kurz danach, ## Perl 6damit es richtig hervorgehoben wird. (Änderung steht für diese Antwort bereits aus)
Brad Gilbert b2gills
Sie können umschalten, {[~](0..$/)}auf {[~] 0..$/}welches Byte ein Byte gespeichert werden soll.
Brad Gilbert b2gills
0

Mathematica, 102 Bytes

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

Naja...

LegionMammal978
quelle
0

CJam, 32 31 Bytes

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

Probieren Sie es online im CJam-Interpreter aus .

Wie es funktioniert

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.
Dennis
quelle
0

Python 2, 135 - 117 Bytes

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
TFeld
quelle
0

PHP - 291 Bytes

Übergeben Sie die Zeichenfolge an 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)));
nicht definiert
quelle
0

C #, 251 201 184 157 154 Bytes

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++);}}

Bearbeiten: Streik! Kürzer als PowerShell;)

Stephan Schinkel
quelle
1
können Sie tun string[]i?
Erik der Outgolfer