Menghitung dan mengeja

26

Tulis sebuah program yang mengambil input string yang menghasilkan string dengan properti berikut.

  • Jika karakter dalam string adalah huruf besar (ASCII 41-5A), maka karakter tersebut diganti dengan string yang berisi setiap huruf hingga dan termasuk huruf asli dalam huruf besar. Misalnya, jika string input adalah I, maka outputnya adalah ABCDEFGHI.
  • Demikian pula, jika karakter adalah huruf kecil (ASCII 61-7A), maka karakter tersebut diganti dengan cara yang sama. iakan diganti oleh abcdefghi.
  • Jika karakter adalah angka (ASCII 30-39), maka karakter tersebut diganti dengan setiap angka mulai dari 0dan menghitung hingga nomor tersebut.
  • Jika input berisi karakter individu bersambung, maka urutan penggantian disatukan.
  • Semua karakter lain dicetak tanpa modifikasi.

Input sampel (dipisahkan oleh garis kosong)

AbC123

pi=3.14159

Hello, World!

Output sampel

AabABC010120123

abcdefghijklmnopabcdefghi=0123.0101234010123450123456789

ABCDEFGHabcdeabcdefghijklabcdefghijklabcdefghijklmno, ABCDEFGHIJKLMNOPQRSTUVWabcdefghijklmnoabcdefghijklmnopqrabcdefghijklabcd!

Ini kode golf, kawan. Aturan standar berlaku. Kode terpendek dalam byte menang.


Untuk melihat leaderboard, klik "Tampilkan cuplikan kode", gulir ke bawah dan klik "► Jalankan cuplikan kode". Cuplikan yang dibuat oleh Pengoptimal.

Arcturus
sumber
10
Gagasan sekuel: batalkan transformasi ini.
ETHproduksi
2
@ ETHproductions Mungkin, meskipun cara di sini tampaknya lebih baik bagi saya karena dapat mengambil input apa pun; bagaimana jika sebaliknya inputnya Hello, World!?
Arcturus
Apakah kita harus mendukung karakter NUL (ascii 0x00) dalam string input?
nimi
@ Eropa dalam kasus seperti itu, kode harus mencetak kesalahan atau, untuk twist yang menyenangkan, melakukan transformasi di atas. Yaitu, f (f (input)) == input. Saya tidak percaya ada kemungkinan input alfanumerik untuk tidak mematuhi hubungan ini.
Jake
1
Itu sepenuhnya benar - saya membuat asumsi bahwa "jika string DAPAT MENJADI hasil dari transformasi, balikkan. Jika tidak, terapkan transformasi." - Ini adalah tantangan Anda, Anda dapat menentukan aturan yang Anda pilih selama (a) mereka konsisten dan (b) mereka dapat diverifikasi dan tidak memerlukan seluruh cabang matematika baru untuk dipecahkan. Catatan tambahan: Irradicating (b) akan menarik; Anda tidak pernah tahu kapan seseorang secara tidak sengaja akan merevolusi ilmu komputer dengan membuat algoritma waktu polinomial untuk masalah NP - yang sebenarnya masuk akal di sini, selama menghemat 4 byte.
Jake

Jawaban:

11

Pyth, 19 byte

sXzsJ+rBG1jkUTs._MJ

Cobalah online: Demonstrasi atau Test Suite

Penjelasan

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
sumber
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)
xsot
sumber
7

TeaScript , 24 byte 26 28

TeaScript adalah JavaScript untuk bermain golf

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

Cukup singkat

Cobalah online

Penjelasan

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
sumber
6

Ruby, 137 87 82 76 67 55 byte

Tidak disatukan, tetapi Anda dapat melihat polanya.

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

Sunting: golf hanya ke satu regex.

Sunting 2: memiliki banyak ruang ekstra.

Sunting 3: Berkat manatwork untuk bermain golf 12 byte!

Peter Lenkefi
sumber
1
$><<gets.gsub(/[a-z0-9]/i){[*" 0Aa"[$&.ord/32]..$&]*""}
manatwork
@Manatwork Sialan itu pintar!
Peter Lenkefi
4

Python 2, 145 140 133 103 102 Bytes

Fungsi anonim yang tidak terlalu ramping menggunakan pemahaman daftar. Saya merasa logikanya harus jauh lebih pendek, saya akan mencoba dan memikirkan sesuatu.

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

Harus diberi nama untuk digunakan, yaitu f=...

Kade
sumber
@Mego Oh, haha! Jangan khawatir :)
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")=<<)

Contoh penggunaan: f "pi=3.14159"->"abcdefghijklmnopabcdefghi=0123.0101234010123450123456789"

Cara kerjanya: salin setiap karakter c dalam string input kecuali jika c berada di antara salah satu dari A/ Z, a/ zatau 0/ 9dan jika demikian ambil daftar [<first char in pair> ... <c>].

Sunting: @Zgarb menyimpan banyak byte. Terima kasih!

nimi
sumber
Saya pikir Anda dapat mendefinisikan c#_=[c]dan melewati tseluruhnya.
Zgarb
@ Zgarb: Ya memang dulu dan kemudian sjuga berlebihan. Terima kasih banyak!
nimi
4

JavaScript (ES6), 143 138 byte

Menggunakan perbandingan string untuk menguji karakter mana yang akan digunakan.

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. Diuji di Firefox dan Chrome.

Sunting: Disimpan 5 byte dengan menggantinya a='0123456789abcdefghijklmnopqrstuvwxyz'dengan

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

PHP, 146 byte

Golf

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

Revisi 1: menempatkan rentang ord langsung ke foreach. menambahkan batas maksimum ord dan diubah $d<=$mmenjadi $d<$m. gunakan foruntuk beralih karakter bukan foreachdan str_split. Dihapus semua {}dengan memindahkan kode kefor

Tidak disatukan

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;

Penjelasan: pisahkan string menjadi array. Jika nilai ascii jatuh ke dalam rentang (untuk az, AZ, 0-9), lalu tambahkan penghitung dari min rentang ke nilai ascii char, tambahkan setiap nilai hingga Anda mencapai nilai ascii char.

Saya melewati &$varsehingga output dilakukan dengan referensi daripada areturn

Reed
sumber
Tidak perlu variabel $ z untuk memegang array rentang, Anda dapat langsung memasukkan array literal foreach.
manatwork
Sudah mencoba menggunakan range()? pastebin.com/k2tqFEgD
manatwork
@manatwork, saya berubah dari menyatakan $zdan membuat beberapa perubahan lainnya. range()mungkin akan lebih baik. Saya mungkin mencoba sesuatu dengan jangkauan nanti.
Reed
Menggunakan range, saya dapatkan 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;}}, yaitu 166.
Reed
1
Ya, setelah penulisan ulang Anda menjadi 146 karakter, range()kurang menguntungkan. Tetapi 166 itu terlalu panjang: $ o untuk array literal sudah kembali, ada ruang tambahan di sekitar askata kunci, join()alias untuk implode(). (?. Diperiksa kode pastebin saya terhubung sebelumnya Shows kemungkinan lain untuk menyimpan titik akhir rentang) Mengenai solusi 146 karakter Anda, Anda dapat memindahkan tugas ke $ c dalam ord()panggilan: $d=ord($c=$n[$r]).
manatwork
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)),[])))

Cobalah online

Mego
sumber
2
Anda bisa menggunakan z = range untuk menyimpan 4 byte.
Arcturus
1
Cukup yakin bahwa Anda dapat mengganti lekukan spasi ganda dengan satu tab, yang akan menghemat beberapa byte
Gugatan Dana Monica
2

Perl 6, 101 byte

Ini pass pertama untuk itu:

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


Menggunakan .transpada $_untuk menghapus 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


Bertindak @*ARGSlangsung bukan mendefinisikan MAINsub.
(jika tidak identik dengan contoh sebelumnya)

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

101

Brad Gilbert b2gills
sumber
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))
Martin Seeler
sumber
Ini gagal untuk pi=3.14159. Mungkinkah solusinya adalah 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)untuk 128 karakter?
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])

Ini menciptakan fungsi tanpa nama yang menerima string dan mengembalikan string.

Tidak Disatukan:

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.
sumber
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''

Secara teknis satu-liner, dan PowerShell adalah semua tentang itu ;-)

Pisahkan input, pipa yang menjadi ForEach-Objectloop, mengaktifkan nilai integer dari karakter pemain, lalu menghasilkan char[]rentang baru yang sesuai. Perhatikan bahwa kita harus menghabiskan byte untuk mengatur variabel temp $bkarena tindakan casting input $_dalam pernyataan switch berarti kita tidak bisa terus menggunakan $_atau kita akan mendapatkan output yang funky.

EDIT - Saya harus menunjukkan bahwa ini akan membuang kesalahan karena objek pertama yang dimasukkan ke dalam %{...}adalah objek nol. Karena STDERR diabaikan secara default , ini seharusnya tidak menjadi masalah. Jika masalah, ubah bit pertama ($args-split''-ne''|...untuk menghilangkan objek nol.

AdmBorkBork
sumber
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
sumber
Anda dapat menggunakan string templat `` untuk split sebagai ganti ("")dan f=i=""dalam for loop. Anda mungkin dapat menyimpan beberapa byte lagi.
intrepidcoder
@intrepidcoder Yang pertama akan berfungsi. Saya sedang memeriksa yang kedua.
Conor O'Brien
2

C (269 bytes)

(jeda baris ditambahkan untuk kejelasan)

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

Tidak disatukan

#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
sumber
2

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

Menggabungkan regex dengan operator bersyarat berhasil dengan baik dalam kasus ini.
Dengan gabungan Menggunakan peta untuk menggabungkan rentang ke dalam array.

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

Uji

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

Penjelasan

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
sumber
1

JavaScript (ES7), 125 byte

Sudah ada dua jawaban JS yang berfokus pada penyandian string, jadi saya memutuskan untuk menggunakan pendekatan yang lebih algoritmik menggunakan 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))

Bonus menggunakan metode ini adalah dibutuhkan sejumlah kode char, jadi joindaftar tidak diperlukan. Ini ternyata lebih pendek dari teknik lainnya, jadi saya senang dengan hasilnya.

Produksi ETH
sumber
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

Saya berhasil menyimpan beberapa byte yang baik di sini berkat pelingkupan dinamis MUMPS . Berikut adalah versi ungolfed yang kurang lebih setara, yang saya yakin akan senang dengan sintaks, jika hanya dukungan untuk modul Prettify MUMPS yang tersedia .

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
sumber
1

Perl 6, 78 77 byte

@*ARGS[0].trans(/\d/=>{[~] 0..$/},/<:L>/=>{[~] samecase("a",~$/)..~$/}).say
Tombol cepat
sumber
Saya tahu itu bisa disingkat dengan menggabungkan 'a'..'z'dan 'A'..'Z'kasus, saya harus berusaha lebih keras.
Brad Gilbert b2gills
Saya sarankan menambahkan <!-- language-all: lang-perl6 -->setelah itu ## Perl 6sehingga akan menyorot dengan benar. (Perubahan sudah tertunda pada jawaban ini)
Brad Gilbert b2gills
Anda dapat beralih {[~](0..$/)}ke {[~] 0..$/}yang akan menghemat satu byte.
Brad Gilbert b2gills
0

Mathematica, 102 byte

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

Baiklah...

LegionMammal978
sumber
0

CJam, 32 31 byte

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

Cobalah online di juru bahasa CJam .

Bagaimana itu bekerja

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

PHP - 291 byte

Lewati string ke 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)));
tidak terdefinisi
sumber
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++);}}

sunting: Strike! Lebih pendek dari PowerShell;)

Stephan Schinkel
sumber
1
Anda dapat melakukan string[]i?
Erik the Outgolfer