Liczenie i pisownia

26

Napisz program, który pobiera jako ciąg wejściowy ciąg znaków o następujących właściwościach.

  • Jeśli znak w ciągu jest wielką literą (ASCII 41-5A), to znak jest zastępowany ciągiem zawierającym każdą literę, aż do oryginalnej litery wielkimi literami. Na przykład, jeśli ciąg wejściowy to I, to wynik będzie ABCDEFGHI.
  • Podobnie, jeśli znak jest małą literą (ASCII 61-7A), to znak jest zastępowany w ten sam sposób. izostałby zastąpiony przez abcdefghi.
  • Jeśli znak jest liczbą (ASCII 30-39), to znak jest zastępowany każdą liczbą rozpoczynającą się od 0i liczącą do liczby.
  • Jeśli dane wejściowe zawierają konkatenowane pojedyncze znaki, sekwencje zastępujące są konkatenowane razem.
  • Wszystkie pozostałe znaki są drukowane bez modyfikacji.

Przykładowe dane wejściowe (oddzielone pustymi wierszami)

AbC123

pi=3.14159

Hello, World!

Przykładowe wyniki

AabABC010120123

abcdefghijklmnopabcdefghi=0123.0101234010123450123456789

ABCDEFGHabcdeabcdefghijklabcdefghijklabcdefghijklmno, ABCDEFGHIJKLMNOPQRSTUVWabcdefghijklmnoabcdefghijklmnopqrabcdefghijklabcd!

To jest golf golfowy, chłopaki. Obowiązują standardowe zasady. Najkrótszy kod w bajtach wygrywa.


Aby zobaczyć tabelę wyników, kliknij „Pokaż fragment kodu”, przewiń w dół i kliknij „► Uruchom fragment kodu”. Snippet wykonany przez Optimizer.

Arktur
źródło
10
Pomysł na kontynuację: cofnij tę transformację.
ETHprodukcje
2
@ETHproductions Być może, chociaż sposób tutaj wydaje mi się lepszy, ponieważ może on przyjmować dowolny wkład; co jeśli na odwrocie byłyby dane wejściowe Hello, World!?
Arcturus
Czy musimy obsługiwać znaki NUL (ascii 0x00) w ciągu wejściowym?
nimi
@Eridan w takim przypadku kod powinien albo wydrukować błąd, albo, dla zabawy, wykonać powyższą transformację. Tj. F (f (wejście)) == wejście. Nie sądzę, że jakiekolwiek dane alfanumeryczne mogą być niezgodne z tą relacją.
Jake,
1
Jest to całkowicie prawdą - zakładam, że „jeśli łańcuch MOŻE BYĆ wynikiem transformacji, odwróć ją. W przeciwnym razie zastosuj transformację”. - to twoje wyzwanie, możesz określić dowolne reguły, o ile (a) są spójne i (b) są weryfikowalne i nie wymagają rozwiązania całej nowej gałęzi matematyki. Uwaga dodatkowa: napromienianie (b) byłoby interesujące; nigdy nie wiadomo, kiedy ktoś przypadkowo zrewolucjonizuje informatykę, opracowując algorytm wielomianowy dla problemu NP - co jest w tym przypadku rozsądne, pod warunkiem, że oszczędza 4 bajty.
Jake

Odpowiedzi:

11

Pyth, 19 bajtów

sXzsJ+rBG1jkUTs._MJ

Wypróbuj online: pakiet demonstracyjny lub testowy

Wyjaśnienie

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
źródło
8

Python 2.7, 100 98 96 bajtów

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

TeaScript , 24 bajty 26 28

TeaScript to JavaScript do gry w golfa

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

Całkiem krótko

Wypróbuj online

Wyjaśnienie

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
źródło
6

Rubin, 137 87 82 76 67 55 bajtów

Nie golfił, ale widać wzór.

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

Edycja: gra w golfa tylko do jednego wyrażenia regularnego.

Edycja 2: miał dużo dodatkowych spacji.

Edycja 3: Dziękujemy za grę w golfa 12 bajtów!

Peter Lenkefi
źródło
1
$><<gets.gsub(/[a-z0-9]/i){[*" 0Aa"[$&.ord/32]..$&]*""}
manatwork
@manatwork Cholera, która jest sprytna!
Peter Lenkefi
4

Python 2, 145 140 133 103 102 bajtów

Niezbyt elegancka anonimowa funkcja wykorzystująca rozumienie listy. Czuję, że logika powinna być znacznie krótsza, spróbuję coś wymyślić.

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

Należy podać nazwę, która ma być użyta, tj f=...

Kade
źródło
@Mego Och, haha! Bez obaw :)
Kade
4

Haskell, 95 91 86 60 bajtów

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

Przykład użycia: f "pi=3.14159"->"abcdefghijklmnopabcdefghi=0123.0101234010123450123456789"

Jak to działa: skopiuj każdy znak c w ciągu wejściowym, chyba że c znajduje się pomiędzy dowolnym z A/ Z, a/ zlub 0/, 9a jeśli tak, weź listę [<first char in pair> ... <c>].

Edycja: @Zgarb zapisał wiele wielu bajtów. Dzięki!

nimi
źródło
Myślę, że możesz zdefiniować c#_=[c]i tcałkowicie pominąć .
Zgarb
@Zgarb: Tak, a nawet sjest zbyteczne. Wielkie dzięki!
nimi
4

JavaScript (ES6), 143 138 bajtów

Używa porównań ciągów, aby sprawdzić, jakich znaków użyć.

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. Testowane w Firefox i Chrome.

Edycja: Zapisano 5 bajtów, zastępując a='0123456789abcdefghijklmnopqrstuvwxyz'je

a=btoa`Ó]·ã»óÖq×£Y§¢«²Û¯Ã³`
intrepidcoder
źródło
3

PHP, 146 bajtów

Grał w golfa

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

Wersja 1: umieść zakresy ord bezpośrednio w foreach. zwiększono maksimum zakresu ord i zmieniono $d<=$mna $d<$m. używając fordo iteracji znaków zamiast foreachi str_split. Usunięto wszystko {}, przenosząc kod dofor

Nie golfił

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;

Objaśnienie: podziel ciąg na tablicę. Jeśli wartość ascii mieści się w zakresie (dla az, AZ, 0-9), to zwiększ licznik od min zakresu do wartości ascii znaku, dołączając każdą wartość, aż osiągniesz wartość ascii znaku.

Przekazałem, &$varwięc dane wyjściowe są wykonywane przez odniesienie, a nie przezreturn

Trzcina
źródło
Zmienna $ z nie musi przechowywać tablicy zakresów, można wstawić literał tablicy bezpośrednio w foreach.
manatwork
Próbowałeś użyć range()? pastebin.com/k2tqFEgD
manatwork
@manatwork, zmieniłem się z deklaracji $zi wprowadziłem kilka innych zmian. range()prawdopodobnie byłoby lepiej. Mogę spróbować czegoś z zasięgiem później.
Reed,
Korzystanie range, mam 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;}}, co było 166.
Reed
1
Tak, po przepisaniu do 146 znaków użycie range()jest mniej korzystne. Ale to 166 jest zbyt długie: $ o dla literału tablicowego powróciło, wokół assłów kluczowych są dodatkowe spacje , join()to alias implode(). (?. Sprawdzone kod pastebin I umieszczonego wcześniej przedstawiono inną możliwość przechowywania punkty końcowe zakresu) Jeśli chodzi o swoje rozwiązanie 146 znaków, można przenieść przypisanie do $ c wewnątrz ord()zaproszenia: $d=ord($c=$n[$r]).
manatwork
2

Python, 143 bajty

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

Wypróbuj online

Mego
źródło
2
Możesz użyć z = zakres, aby zapisać 4 bajty.
Arcturus
1
Całkiem pewne, że możesz zastąpić podwójne wcięcia pojedynczą zakładką, co zaoszczędziłoby Ci kilka bajtów
pozew Fund Moniki
2

Perl 6, 101 bajtów

Oto pierwsze przejście:

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


Korzystanie .transna $_usunięcie 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


Działaj @*ARGSbezpośrednio zamiast definiować MAINpodrzędny.
(inaczej identyczny jak w poprzednim przykładzie)

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

101

Brad Gilbert b2gills
źródło
2

Scala, 111 91 bajtów

val f=(_:String).flatMap(x=>if(x.isDigit)('0'to x)else if(x.isUpper)('A'to x)else('a'to x))
Martin Seeler
źródło
To się nie udaje pi=3.14159. Czy rozwiązaniem może być 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)aż 128 znaków?
Leonardo
2

Julia, 102 98 90 84 bajtów

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

Tworzy to nienazwaną funkcję, która akceptuje ciąg i zwraca ciąg.

Nie golfowany:

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.
źródło
2

PowerShell, 155 bajtów

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

Technicznie jest to jedna linijka, a PowerShell o to chodzi ;-)

Dzieli dane wejściowe, przekształca je w ForEach-Objectpętlę, włącza wartość całkowitą rzutowanego znaku, a następnie generuje nowy char[]z odpowiednich zakresów. Zauważ, że musimy wydać bajty, aby ustawić zmienną temp, $bponieważ akt rzutowania danych wejściowych $_w instrukcji switch oznacza, że ​​nie możemy tak dalej używać, $_albo otrzymamy funky.

EDYCJA - powinienem zaznaczyć, że spowoduje to usunięcie błędów, ponieważ pierwszy obiekt, do którego jest wprowadzany, %{...}jest obiektem zerowym. Ponieważ STDERR jest domyślnie ignorowany , nie powinno to stanowić problemu. Jeśli to problem, zmień pierwszy bit, ($args-split''-ne''|...aby wyeliminować obiekt zerowy.

AdmBorkBork
źródło
2

JavaScript (ES6), 340 258 273 271 bajtów

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
źródło
Można użyć ciąg szablonu `` do rozłamu zamiast ("")i f=i=""w pętli for. Możesz być w stanie zapisać jeszcze kilka bajtów.
intrepidcoder
@intrepidcoder Pierwszy działałby. Sprawdzam drugą.
Conor O'Brien
2

C (269 bajtów)

(dodano podział linii dla zachowania przejrzystości)

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

Nie golfił

#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);
}
musarithmia
źródło
2

Perl 5 , 66 61 (51 bajtów + 1) 52

W tym przypadku dobrze sprawdzało się łączenie wyrażeń regularnych z operatorami warunkowymi.
Z łączeniem Korzystanie z mapy do łączenia zakresów w tablicę.

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!

Wyjaśnienie

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
źródło
1

JavaScript (ES7), 125 bajtów

Były już dwie odpowiedzi JS koncentrujące się na kodowaniu ciągów, więc zdecydowałem się na podejście bardziej algorytmiczne, używając 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))

Dodatkową zaletą tej metody jest to, że wymaga ona dowolnej liczby kodów znaków, więc joinlista nie jest konieczna. Okazało się to krócej niż jakakolwiek inna technika, więc jestem zadowolony z wyniku.

ETHprodukcje
źródło
1

MUMPS, 131 bajtów

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

Udało mi się zaoszczędzić tutaj kilka dobrych bajtów dzięki dynamicznemu zakresowi MUMPS . Oto mniej więcej równoważna nie golfowa wersja, którą z pewnością chciałbym podświetlić składnią, gdyby tylko dostępna była obsługa modułu MUMPS Prettify .

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
źródło
1

Perl 6, 78 77 bajtów

@*ARGS[0].trans(/\d/=>{[~] 0..$/},/<:L>/=>{[~] samecase("a",~$/)..~$/}).say
Skróty klawiszowe
źródło
I wiedział, to może zostać skrócony poprzez połączenie 'a'..'z'i 'A'..'Z'przypadki powinny próbowałem trudniejsze.
Brad Gilbert b2gills
Polecam dodanie <!-- language-all: lang-perl6 -->zaraz po ## Perl 6, aby było poprawnie podświetlone. (Zmiana już oczekuje na tę odpowiedź)
Brad Gilbert b2gills
Możesz przełączyć się na, {[~](0..$/)}aby {[~] 0..$/}zapisać jeden bajt.
Brad Gilbert b2gills
0

Mathematica, 102 bajty

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

No cóż...

LegionMammal978
źródło
0

CJam, 32 31 bajtów

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

Wypróbuj online w interpretatorze CJam .

Jak to działa

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
źródło
0

Python 2, 135 117 bajtów

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
źródło
0

PHP - 291 bajtów

Przekaż ciąg do 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)));
niezdefiniowany
źródło
0

C #, 251 201 184 157 157 bajtów

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

edycja: Strike! Krótszy niż PowerShell;)

Stephan Schinkel
źródło
1
można to zrobić string[]i?
Erik the Outgolfer,