Mengganti angka dengan huruf masing-masing

23

Buat fungsi atau program yang mengambil angka sebagai input, dan menghasilkan string di mana ASCII-kode poin untuk alfabet huruf kecil dan atas diganti dengan karakter setara mereka.

  • Alfabet huruf besar menggunakan poin kode: 65-90
  • Alfabet huruf kecil menggunakan poin kode: 97-122

Jika ada angka yang berdekatan di input sama dengan titik kode huruf, maka huruf itu akan menggantikan digit dalam string keluaran.

Aturan:

  • Input akan berupa bilangan bulat positif dengan antara 1 dan 99 digit
  • Anda dapat mengasumsikan hanya input yang valid yang diberikan
  • Anda mulai mengganti di awal bilangan bulat ( 976-> a6, bukan 9L)
  • Input bisa pada format apa saja yang sesuai (representasi string OK)
  • Outputnya bisa dalam format yang sesuai
  • Aturan standar berlaku

Contoh:

1234567
12345C

3456789
345CY

9865432
bA432

6566676869707172737475767778798081828384858687888990
ABCDEFGHIJKLMNOPQRSTUVWXYZ

6711110010100071111108102
Code000Golf

Kode terpendek dalam byte menang!


Papan peringkat

Cuplikan Stack di bagian bawah posting ini menghasilkan katalog dari jawaban a) sebagai daftar solusi terpendek per bahasa dan b) sebagai leaderboard keseluruhan.

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

## Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda bisa menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

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

Stewie Griffin
sumber
2
"Input akan berupa bilangan bulat positif dengan antara 1 dan 99 digit" Di hampir semua bahasa pemrograman yang saya tahu, itu akan menjadi string dengan antara 1 dan 99 digit, karena bahkan 64-bit int hanya menampung hingga 19 desimal digit ...
TJ Crowder
3
@ TJCrowder Saya berasumsi maksudnya integer dalam arti matematika, bukan tipe data.
Dennis
1
@TJCrowder titik valid :-) Meskipun, jika saya tidak salah, 1e99 secara teknis masih bilangan bulat. long inttidak cukup, kamu perlu super long int.
Stewie Griffin
1
@StewieGriffin: Hah! :-) Saya yakin ada bahasa di suatu tempat dengan hal seperti itu.
TJ Crowder

Jawaban:

2

Jolf, 18 16 byte

Coba di sini! Saya tahu bahwa fungsi upperLower akan berguna suatu hari nanti! Ganti ódengan ΢, atau cukup gunakan tautan juru bahasa. Ini dikodekan dalam 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)
Conor O'Brien
sumber
17

Perl, 39 38 byte

(1 byte ditambahkan untuk -pbendera.)

$"="|";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

Alat yang Tepat untuk Job ™.

Penjelasannya sudah usang setelah satu optimasi kecil (terima kasih dev-null !) Yang membuatnya menjadi lebih pendek satu byte (tetapi sedikit kurang elegan): $"variabel mewakili apa yang harus joindihidupkan ketika menginterpolasi array ke dalam string, sehingga pengaturan $"="|"menghilangkan kebutuhan untuk join.

Demo:

llama@llama:~$ perl -pe '$"="|";s/@{[65..90,97..122]}/chr$&/ge' 
1234567
12345C
3456789 
345CY
9865432
bA432
6566676869707172737475767778798081828384858687888990
ABCDEFGHIJKLMNOPQRSTUVWXYZ
6711110010100071111108102
Code000Golf
Gagang pintu
sumber
Saya kira Anda dapat menyimpan satu byte dengan mengatur $"="|"daripada bergabung?
andlrc
misalnya. $"="|";s/@{[65..90,97..122]}/chr$&/ge
andlrc
@ dev-null Itu berhasil, terima kasih!
Gagang Pintu
11

Javascript, 80 byte

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

Lihat regex sedang beraksi di sini: https://regex101.com/r/iX8bJ2/1

Hanya untuk rasa ingin tahu, satu hal yang saya pelajari di sini:

Saya tidak dapat mengubah x=>String.fromCharCode(x)ke String.fromCharCode karena ...

dihapus
sumber
6

CJam, 22 byte

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

Cobalah online!

Latar Belakang

Cukup mengganti semua kemunculan kelompok digit dengan huruf yang sesuai (dalam urutan apa pun yang kita pilih) akan gagal mematuhi aturan kiri-ke-kanan.

Sebagai gantinya, kami dapat membuat semua awalan string input, dan berupaya membuat semua pergantian yang mungkin saat kami menghasilkannya. Karena tidak ada titik kode yang terkandung dalam titik kode lain, urutan upaya ini tidak penting.

Sebagai contoh:

67466

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

C4B

Bagaimana itu bekerja

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.
Dennis
sumber
4

PHP, 110 102 101 68 67 byte

Tantangan yang cukup sulit. Ini adalah yang terbaik yang bisa saya pikirkan. Ini adalah versi yang sama sekali baru.

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

Jalankan seperti ini:

php -r 'for($i=64;123>$i+=$i-90?1:7;)$t[$i]=chr($i)?><?=strtr($argv[1],$t);' 6711110010100071111108102;echo
> Code000Golf
  • Disimpan 8 byte dengan menggunakan ctype_alphaalih-alih preg_match, thx ke manatwork
  • Disimpan 1 byte dengan menambahkan terlebih dahulu 0ke string alih-alih memeriksa string yang tidak kosong: ketika karakter terakhir dari input adalah 0, substring yang saya ambil adalah "0", yang palsu, sedangkan "00" benar, sehingga tidak akan melewatkan pencetakan 0 terakhir.
  • Menyimpan 33 byte besar dengan menggunakan strtrsetelah membangun array dengan pasangan konversi
  • Disimpan satu byte dengan menggunakan tag cetak pendek
aross
sumber
1
Anda harus mengubah ekspresi reguler menjadi #[A-Z]#iseperti yang sekarang akan dengan senang hati mengizinkan "92" ditransformasikan menjadi "\". Atau coba ctype_alpha()saja preg_match(). Sejauh ini tampaknya berhasil.
manatwork
"0", which is falsy, whereas "00" is truthyBagus, PHP.
kucing
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
  • Disimpan 23 byte dengan mengganti \ n dengan; terimakasih untuk Dennis

Uji

masukkan deskripsi gambar di sini

Argenis García
sumber
1
Jika Anda menggunakan ;alih-alih penghentian baris, Anda bisa meletakkan seluruh loop sementara pada satu baris. Juga, baris pertama bisa menjadi 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)etc
seequ
2

Pyth, 20 18 byte

.Uu:G`CHHsrBG1+bZz

Algoritma yang sama dengan @Dennis. Jauh lebih mudah untuk kode dalam Pyth di ponsel saya daripada di 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

Terima kasih @isaacg

Coba di sini .

lirtosiast
sumber
Anda tidak bisa menghindari situs ini di ponsel Anda, bukan ...?
Conor O'Brien
1
Terutama ketika saya memiliki kemewahan pengkodean di semua ASCII yang dapat dicetak: D
lirtosiast
1
Itu benar, mungkin bagus untuk istirahat dari semua jeli itu ... Anda tahu, diet seimbang;)
Conor O'Brien
0

05AB1E , 12 byte

õsvy«žnvyÇy:

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

õ             # 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)

Alternatif 12 byte menggunakan pengurangan-oleh:

Å»«žnvyÇy:]θ

Cobalah secara online atau verifikasi semua kasus uji atau lihat pengurangan langkah demi langkah hanya dengan 10 byte pertama .

Kevin Cruijssen
sumber