Số thay thế bằng thư tương ứng của họ


23

Tạo một hàm hoặc chương trình lấy một số làm đầu vào và xuất ra một chuỗi trong đó các điểm mã ASCII cho bảng chữ cái viết thường và viết thường được thay thế bằng các ký tự tương đương của chúng.

  • Bảng chữ cái viết hoa sử dụng các điểm mã: 65-90
  • Bảng chữ cái viết thường sử dụng các điểm mã: 97-122

Nếu bất kỳ chữ số liền kề nào trong đầu vào bằng điểm mã của một chữ cái, thì chữ cái đó sẽ thay thế các chữ số trong chuỗi đầu ra.

Quy tắc:

  • Đầu vào sẽ là một số nguyên dương có từ 1 đến 99 chữ số
  • Bạn chỉ có thể giả sử đầu vào hợp lệ được đưa ra
  • Bạn bắt đầu thay thế ở đầu số nguyên ( 976-> a6, không 9L)
  • Đầu vào có thể ở bất kỳ định dạng phù hợp nào (biểu diễn chuỗi là OK)
  • Đầu ra có thể ở bất kỳ định dạng phù hợp
  • Áp dụng quy tắc chuẩn

Ví dụ:

1234567
12345C

3456789
345CY

9865432
bA432

6566676869707172737475767778798081828384858687888990
ABCDEFGHIJKLMNOPQRSTUVWXYZ

6711110010100071111108102
Code000Golf

Mã ngắn nhất trong byte giành chiến thắng!


Bảng xếp hạng

Đoạn trích Stack ở cuối bài đăng này tạo ra danh mục từ các câu trả lời a) dưới dạng danh sách các giải pháp ngắn nhất cho mỗi ngôn ngữ và b) dưới dạng bảng xếp hạng tổng thể.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

## Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

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


2
"Đầu vào sẽ là một số nguyên dương có từ 1 đến 99 chữ số" Trong bất kỳ ngôn ngữ lập trình nào tôi biết, đó sẽ là một chuỗi có từ 1 đến 99 chữ số, vì ngay cả một int 64 bit chỉ giữ tối đa 19 thập phân chữ số ...
TJ Crowder

3
@TJCrowder Tôi giả sử ông có nghĩa là số nguyên theo nghĩa toán học, không phải kiểu dữ liệu.
Dennis

1
@TJCrowder điểm hợp lệ :-) Mặc dù, nếu tôi không nhầm, 1e99 về mặt kỹ thuật vẫn là một số nguyên. long intKhông đủ, bạn cần super long int.
Stewie Griffin

1
@StewieGriffin: Hah! :-) Tôi chắc chắn có một ngôn ngữ ở đâu đó với điều đó.
TJ Crowder

Câu trả lời:


2

Jolf, 18 16 byte

Hãy thử nó ở đây! Tôi biết rằng chức năng UpperLower sẽ hữu ích vào một ngày nào đó! Thay thế óbằng ΢, hoặc chỉ sử dụng liên kết thông dịch viên. Điều này được mã hóa theo 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)

17

Perl, 39 38 byte

(Đã thêm 1 byte cho -pcờ.)

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

Công cụ phù hợp cho công việc ™.

Lời giải thích đã lỗi thời sau một tối ưu hóa nhỏ (cảm ơn dev-null !) Làm cho nó ngắn hơn một byte (nhưng kém thanh lịch hơn một chút): $"biến đại diện cho những gì cần làm joinkhi nội suy một mảng thành một chuỗi, do đó, việc thiết lập $"="|"sẽ loại bỏ nhu cầu về join.

Bản giới thiệu:

llama@llama:~$ perl -pe '$"="|";s/@{[65..90,97..122]}/chr$&/ge' 
1234567
12345C
3456789 
345CY
9865432
bA432
6566676869707172737475767778798081828384858687888990
ABCDEFGHIJKLMNOPQRSTUVWXYZ
6711110010100071111108102
Code000Golf

Tôi đoán bạn có thể lưu một byte bằng cách thiết lập $"="|"thay vì tham gia?
andlrc

ví dụ. $"="|";s/@{[65..90,97..122]}/chr$&/ge
andlrc

@ dev-null Điều đó không hoạt động, cảm ơn!
Doorknob

11

Javascript, 80 byte

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

Xem regex hoạt động tại đây: https://regex101.com/r/iX8bJ2/1

Chỉ vì tò mò, một điều tôi học được ở đây:

Tôi không thể đổi x=>String.fromCharCode(x)thành String.fromCharCode vì ...


6

CJam, 22 byte

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

Hãy thử trực tuyến!

Lý lịch

Chỉ cần thay thế tất cả các lần xuất hiện của các nhóm chữ số bằng các chữ cái tương ứng (theo bất kỳ thứ tự nào chúng tôi có thể chọn) sẽ không tuân thủ quy tắc từ trái sang phải.

Thay vào đó, chúng ta có thể tạo tất cả các tiền tố của chuỗi đầu vào và cố gắng thực hiện tất cả các thay thế có thể trong khi chúng ta tạo chúng. Vì không có điểm mã nào được chứa trong một điểm mã khác, nên thứ tự của những lần thử này không quan trọng.

Ví dụ:

67466

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

C4B

Làm thế nào nó hoạt động

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.

4

PHP, 110 102 101 68 67 byte

Thử thách khá khó khăn. Đây là điều tốt nhất tôi có thể nghĩ ra. Đây là một phiên bản hoàn toàn mới.

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

Chạy như thế này:

php -r 'for($i=64;123>$i+=$i-90?1:7;)$t[$i]=chr($i)?><?=strtr($argv[1],$t);' 6711110010100071111108102;echo
> Code000Golf
  • Đã lưu 8 byte bằng cách sử dụng ctype_alphathay vìpreg_match , thx để thao tác
  • Đã lưu 1 byte bằng cách thêm trước 0 chuỗi thay vì kiểm tra chuỗi không trống: khi ký tự cuối cùng của đầu vào là 0, chuỗi con tôi đang sử dụng sẽ là "0", đó là sai, trong khi "00" là sự thật, vì vậy nó sẽ không bỏ qua việc in 0 cuối cùng.
  • Đã lưu 33 byte lớn bằng cách sử dụng strtr sau khi xây dựng một mảng với các cặp chuyển đổi
  • Đã lưu một byte bằng cách sử dụng thẻ in ngắn

1
Yo sẽ phải thay đổi biểu thức chính quy thành biểu thức #[A-Z]#ihiện tại một cách vui vẻ cho phép Chuyển đổi 92 92 được biến đổi trong Hồi giáo \. Hoặc thử ctype_alpha()thay vì preg_match(). Cho đến nay dường như làm việc.
manatwork

"0", which is falsy, whereas "00" is truthyTốt, PHP.
mèo

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
  • Đã lưu 23 byte bằng cách thay thế \ n bằng; cảm ơn Dennis

Kiểm tra

nhập mô tả hình ảnh ở đây


1
Nếu bạn sử dụng ;thay vì ngắt dòng, bạn có thể đặt toàn bộ vòng lặp while trên một dòng. Ngoài ra, dòng đầu tiên có thể trở thành 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)vv
xem

2

Bình thường, 20 18 byte

.Uu:G`CHHsrBG1+bZz

Thuật toán tương tự như @Dennis. Việc mã hóa Pyth trên điện thoại của tôi dễ dàng hơn nhiều so với trong 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

Cảm ơn @isaacg

Hãy thử nó ở đây .


Bạn không thể rời khỏi trang web này trên điện thoại của mình, bạn có thể ...?
Conor O'Brien

1
Đặc biệt là khi tôi có sự sang trọng của mã hóa trong tất cả các bản in ASCII: D
lirtosiast

1
Đó là sự thật, có lẽ là tốt để nghỉ ngơi từ tất cả những thứ thạch đó ... Bạn biết đấy, một chế độ ăn uống cân bằng;)
Conor O'Brien

0

05AB1E , 12 byte

õsvy«žnvyÇy:

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

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

12 byte thay thế bằng cách sử dụng giảm:

Å»«žnvyÇy:]θ

Dùng thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm hoặc xem giảm từng bước chỉ với 10 byte đầu tiên .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.