Trao đổi bảng chữ cái


48

Trong thử thách này, bạn sẽ "đảo ngược" bảng chữ cái hoặc hoán đổi a-zvới z-a. Điều này thường được gọi là Atpash cypher.

Vì phép chuyển đổi này làm cho đầu ra trông giống như một số ngôn ngữ nước ngoài, mã của bạn sẽ cần phải càng ngắn càng tốt.


Ví dụ

abcdefghijklmnopqrstuvwxyz
zyxwvutsrqponmlkjihgfedcba

Programming Puzzles & Code Golf
Kiltiznnrmt Kfaaovh & Xlwv Tlou

Hello, World!
Svool, Dliow!

Đặc điểm kỹ thuật

  • Đầu vào có thể chứa nhiều dòng và sẽ chỉ có ASCII
  • Không có khoảng trắng bổ sung nào được thêm vào đầu ra
  • Vỏ phải được bảo quản

Bảng xếp hạng


Đây là nên mã ngắn nhất tính theo byte thắng


24
+1 cho lời biện minh "Vì phép chuyển đổi này làm cho đầu ra trông giống như một số ngôn ngữ nước ngoài, mã của bạn sẽ cần phải càng ngắn càng tốt."
mèo

11
Một số câu đố: đây là Atbash , một mật mã được biết đến xưa như kinh thánh.
Jacob

6
"Bởi vì phép chuyển đổi này làm cho đầu ra trông giống như một số ngôn ngữ nước ngoài, mã của bạn sẽ cần phải càng ngắn càng tốt." Những loại logic đó là?? Bởi vì mô tả của bạn làm tăng nhiều dấu hỏi như thể nó được viết bằng một số ngôn ngữ nước ngoài, câu trả lời của bạn cho câu hỏi này phải bằng ngôn ngữ tự nhiên dễ hiểu và một số chi tiết được đánh giá cao.
Bart

Kiltiznnrmt Kfaaovh & Xlwv Tlou sẽ là trang web mới cho "Trivials & Code Bowling" ...
Erik the Outgolfer

Tại sao bạn không cho phép khoảng trắng bổ sung? Điều đó làm cho nó không thể trong một số ngôn ngữ luôn có một dòng mới. Tôi không thể thấy nó thêm bất cứ điều gì vào thử thách.
Quả Esolanging

Câu trả lời:


11

Bình thường, 8 byte

XXzG)rG1

@xnor đề xuất cách tiếp cận đơn giản hơn này trên câu trả lời Pyth của @ FryAmTheEggman, sau đó tôi dịch nó sang Pyth.

Điều này sử dụng hành vi tiện dụng của X(dịch) khi chỉ đưa ra hai đối số: nó dịch từ đối số thứ hai sang đối số thứ hai đảo ngược. Chúng tôi làm điều này đầu tiên với bảng chữ cái chữ thường ( G), và sau đó với chữ hoa G.


16

C, 59 byte

Xin lỗi vì đã đưa C trở lại, nhưng tôi hơi thất vọng khi chỉ thấy các chức năng C ở đây. Tôi đã có ấn tượng OP đang tìm kiếm một sản phẩm có thể sử dụng.

main(c){while(~(c=getchar()))putchar(isalpha(c)?c+4^31:c);}

Được biên dịch trên Ubuntu 14.04 đơn giản:

cc swalpha.c

Kết quả thực thi đọc bất kỳ số lượng dòng từ stdin và ghi kết quả vào thiết bị xuất chuẩn.

Cảm ơn rất nhiều người đăng khác cho thủ thuật XOR.


11

CJam, 17 byte

Tôi muốn giúp GamrCorps đánh golf giải pháp CJam của anh ấy, nhưng kết quả cuối cùng lại khác đến nỗi tôi quyết định đưa ra một câu trả lời riêng.

q'[,_el^_W%32f^er

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

Giải trình

q     e# Read all input.
'[,   e# Get a character range from the null byte up to and including "Z".
_el   e# Duplicate and convert to lowercase.
^     e# Symmetric set difference. Due to the lowercase operation only letters will not
      e# appear in both sets, and so we get a string with all uppercase letters followed
      e# by all lowercase letters, i.e "ABC...XYZabc...xyz".
_W%   e# Duplicate and reverse. Gives: "zyx...cbaZYX...CBA".
32f^  e# Take each character XOR 32 which swaps the case, so now we have:
      e#                               "ZYX...CBAzyx...cba"
er    e# Transliterate: substitute each character in the first string with the correspoding
      e# character in the second string.

4
Chà, tôi rất vui vì bạn đã cố gắng giúp đỡ! Đó là giải pháp mà tôi đã cố gắng thực hiện, tôi không thể tìm ra XOR. Công việc tốt!
GamrCorps

1
Cú pháp làm nổi bật của SE ghét esolang.
Cyoce

@Cyoce Có lẽ họ không có thời gian; đưa ra có bao nhiêu ngôn ngữ trên trang web này. Điều đó nói rằng, có lẽ CJam là một trong những người dễ dàng hơn, vì nó không tự sửa đổi và có cấu trúc khá rõ ràng. Tôi muốn thấy họ cố gắng thêm tô sáng cú pháp vào ngôn ngữ tự sửa đổi như ///.
Esolanging Fruit

@ Challenger5 afaik, cú pháp tô sáng chỉ sử dụng tính năng bổ sung của Google, hỗ trợ cho các esolang khác nhau sẽ phải được thêm vào đó.
Martin Ender

11

JavaScript (ES6), 69 67 byte

x=>x.replace(/[A-Z]/gi,c=>String.fromCharCode(c.charCodeAt()+4^31))

Sử dụng chiến lược giống như câu trả lời Japt của tôi :

x=>x.replace(/[A-Z]/gi,C=>   // Replace each letter C with
 String.fromCharCode(        //  the character with char code
  C.charCodeAt()+4^31))      //   the char code of C, plus 4, with the last 5 bits flipped.

Nguyền rủa tên tài sản cực kỳ dài của bạn, JS ...


1
+1 để đề cập đến các tên thuộc tính dài đặc biệt của JS. Yêu thích của tôi vẫn là khét tiếngdocument.getElementById
Cyoce

2
@Cyoce Hãy thử document.getElementsByClassNamehoặc, trên Firefox và Chrome,document.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC
Ismael Miguel

Đây dường như chỉ là 66 byte chứ không phải 67
Downgoat

@ Doᴡɴɢᴏᴀᴛ Bạn nói đúng về điều đó, cảm ơn!
Sản phẩm điện tử

Có vẻ như bạn đang thiếu một dấu ngoặc đóng ở cuối mã được đánh gôn.
starbeamrainbowlabs

10

Võng mạc , 17 14 13 byte

Mã số:

\T`w`_dZ-Az-a

Giải trình:

\             # This suppresses the trailing linefeed
 T            # Switches to transliterate mode
  `w          # w is short for _0-9A-Za-z
    `_d       # d is short for 0-9
       Z-Az-a # Z-Az-a

Điều này làm một số công cụ ma thuật và hoàn thành nhiệm vụ.

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


2
May mắn cho bạn mà tôi đã thêm gần đây \. Thật không may cho bạn rằng tôi đã không đi xung quanh để thêm các lớp nhân vật cho các chữ cái và các lớp nhân vật đảo ngược chưa.
Martin Ender

@ MartinBüttner Thực sự rất may mắn, điều đó gần như vô hiệu hóa câu trả lời của tôi :)
Adnan

Để tham khảo, kể từ Retina 0.7.2 bạn có thể làm \T`lL`RlRL.
Martin Ender

9

Bình thường, 10 9

uXGr;H)2z

Cảm ơn Jakube vì đã lưu một byte với tính năng mới của ;!

Phòng thử nghiệm

Giải thích nhanh: giảm bắt đầu với đầu vào qua các số 0 và 1. Thao tác được thực hiện là dịch bảng chữ cái viết thường với r...0hoặc r...1là các hàm dưới và hàm trên từ python, tương ứng, được áp dụng cho nó, sau đó đảo ngược.


1
9 byte do một tính năng mới (thậm chí chưa được một ngày):uXGr;H)2z
Jakube

5
Bạn có thể thêm một lời giải thích?
TanMath

1
Bạn không thể sử dụng Xvới bảng chữ cái và sau đó với bảng chữ cái viết hoa?
xnor

1
@xnor XXzG)rG1? Điều đó dường như làm việc.
lirtosiast

Hoặc, có thể làm X trên bảng chữ cái chữ thường và chữ hoa được ghép nối, sau đó hoán đổi trường hợp? Điều đó có lẽ lâu hơn, thực sự.
xnor

6

Julia, 74 61 47 byte

s->replace(s,r"[a-z]"i,t->Char(31$Int(t[1])-4))

Đây là hàm lambda chấp nhận một chuỗi và trả về một chuỗi. Để gọi nó, gán nó cho một biến.

Chúng tôi khớp từng chữ cái bằng cách sử dụng một biểu thức chính quy và thay thế từng chữ cái bằng ký tự ASCII tương ứng với 31 XOR mã ASCII cho chữ cái, trừ 4.


Wow, điều này rất thanh lịch. Tôi nhận được một cảnh báo không dùng nữa $để bạn có thể muốn cập nhật nó . Không biết rằng bạn có thể sử dụng một chức năng trong replace.
niczky12

5

C, 150 129 byte

void rev(char*s){int i,t;for(i=0;i<strlen(s);i++){t=s[i]+25;t=t<116?180-t:244-t;isalpha(s[i])?printf("%c",t):printf("%c",s[i]);}}

Hàm này chỉ chuyển đổi char thành int và thêm phần bù thích hợp vào int trước khi in. Tôi biết đó không phải là ngắn nhất nhưng tôi đã không thấy triển khai C.

Ví dụ sử dụng

#include<stdio.h>
#include<string.h>
#include<ctype.h>

void rev(char*s){int i,temp;for(i=0;i<strlen(s);i++){temp=s[i]+25;temp=temp<116?180-temp:244-temp;isalpha(s[i])?printf("%c",temp):printf("%c",s[i]);}}


int main(){
   char *s = "hello, there";
   rev(s);
   return 0;
}

CẬP NHẬT: rút ngắn một tên biến.


Chào mừng bạn đến với Câu đố lập trình và trao đổi mã Golf Stack! Đây là một cách tiếp cận rất tốt. Nó có thể được đánh gôn nhiều hơn bằng cách làm cho tất cả các biến (bao gồm temp) chính xác một ký tự dài.
wizzwizz4

À bạn nói đúng! Tôi sẽ lấy lại thứ này
Danwakeem

1
Bạn có nghĩ rằng bạn có thể có một thử thách tại thử thách của tôi? Phân tích Ghế của bạn
wizzwizz4

1
Có, nó sẽ hoạt động mà không cần các tiêu đề, bạn chỉ cần nhận được một cảnh báo trình biên dịch @ edc65 Tôi đã hình dung từ khi nó biên dịch và chạy nó sẽ không bị coi là gian lận nhưng trong thế giới thực, bạn nên luôn luôn bao gồm các tiêu đề.
Danwakeem

1
107 byte:i,t;r(char*s){for(;i<strlen(s);i++){t=s[i]+25;t=t<116?180-t:244-t;isalpha(s[i])?putchar(t):putchar(s[i]);}}
Spikatrix

5

Japt, 23 22 byte

Ur"[A-Za-z]"_c +4^31 d

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

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

Ur"[A-Za-z]"_  // Take the input and replace each letter with:
 c +4          //  Take its char code and add 4. This results in
               //  the string      "ABC...XYZabc...xyz"
               //  becoming        "EFG...\]^efg...|}~".
 ^31           //  XOR the result by 31. This flips its last five 5 bits.
               //  We now have     "ZYX...CBAzyx...cba".
 d             //  Convert back from a char code.
               // Implicit: output last expression

Ý tưởng tuyệt vời (mà tôi đã mượn ...) để sử dụng XOR cho việc này
Luis Mendo

5

C, 64

Một hàm void sửa đổi chuỗi tại chỗ.

t(char*p){for(int c;c=*p;)*p++=c>64&c<91|c>96&c<123?(c^31)-4:c;}

Kiểm tra: ideone


1
c;t(char*p){for(;c=*p;)*p++=c>64&c<91|c>96&c<123?(c^31)-4:c;}
Spikatrix

@CoolGuy đúng, nhưng tôi không thích toàn cầu bên trong một chức năng ... đó chỉ là tôi
edc65

Đây có phải là 64 byte không?
Hạ cấp

@ Đừng, đúng vậy .. cảm ơn ..
edc65

5

R, 69 61 byte

Cảm ơn @Giuseppe đã loại bỏ một số byte bổ sung:

function(s)cat(chartr("a-zA-Z",intToUtf8(c(122:97,90:65)),s))

Phiên bản trước:

function(s)cat(chartr("a-zA-Z",rawToChar(as.raw(c(122:97,90:65))),s))

Đây là một chức năng ẩn danh. Sử dụng:

> f=function(s)cat(chartr("a-zA-Z",rawToChar(as.raw(c(122:97,90:65))),s))
> f("Hello, World!")
Svool, Dliow!
> f("Programming Puzzles & Code Golf")
Kiltiznnrmt Kfaaovh & Xlwv Tlou
> f("This is
+ a multiline
+ example.")
Gsrh rh
z nfogrormv
vcznkov.

1
intToUtf8(c(122:97,90:65))thay vì rawchuyển đổi, và bạn cũng có thể thoát khỏi cat. Tôi đang tạo thói quen để chơi golf hơn 1 năm tuổi của bạn ...
Giuseppe

4

Nghiêm túc, 31 byte (không cạnh tranh)

úúû+╗úRúûR+╝,`;╜íuWD╛E(X0WX`Mεj

Bãi rác Hex:

a3a3962bbba352a396522bbc2c603bbda1755744be452858305758604dee6a

Dùng thử trực tuyến

Giải thích:

úúû+╗                             Put UPPERCASElowercase in reg0
     úRúûR+╝                      Put ESACREPPUesacrewol in reg1
            ,                     Fetch input.
             `             `Mεj   Map over the characters in string as list, joining result
              ;╜íu                Find 1-index of character in UPPERCASElowercase
                  W     0WX       If it is positive (present): 
                   D              Convert back to 0-index
                    ╛E            Look it up in ESACREPPUesacrewol
                      (X          Delete the original character.
                                  (Else just leave the original character unchanged.)

Tôi chỉ nhận ra thông số kỹ thuật nói rằng không có khoảng trắng bổ sung, nhưng không có cách nào để ngăn chặn các dòng mới trong đầu ra Nghiêm túc, vì vậy không có giải pháp Nghiêm túc nào.


1
ESACREPPUesacrewolnghĩa là gì?
Hạ cấp

3
@ Doᴡɴɢᴏᴀᴛ UPPERCASE đảo ngược LOWERCASE đảo ngược
Mama Fun Roll

2
bảng chữ cái viết hoa đảo ngược được đặt trước bảng chữ cái chữ thường đảo ngược
quintopia

4

Ruby, 40 byte

Giải pháp mới: Lấy trộm ma thuật lật bit từ một số bài viết khác ở đây:

->s{s.gsub(/[a-z]/i){($&.ord+4^31).chr}}

Ruby, 55 46 byte

->s{s.tr'a-zA-Z',[*?A..?Z,*?a..?z].reverse*''}

Giảm 9 byte nhờ @manatwork


chạy thử nghiệm:

->s{s.gsub(/[a-z]/i){($&.ord+4^31).chr}}["Kiltiznnrmt Kfaaovh & Xlwv Tlou"]
=> "Programming Puzzles & Code Golf"


3

2, 12 ký tự / 26 byte (không cạnh tranh)

ïĪ(ᶐ+ᶛ,ᶐᴙ+ᶛᴙ

Try it here (Firefox only).

Đã thêm chức năng chuyển ngữ sau khi thử thách được đăng.

Giải trình

ïĪ(ᶐ+ᶛ,ᶐᴙ+ᶛᴙ // implicit: ï=input
ïĪ(           // transliterate ï...
   ᶐ+ᶛ,       // from uppercase+lowercase alphabet...
       ᶐᴙ+ᶛᴙ  // ... to reversed uppercase+reversed lowercase alphabet
              // implicit output

Tôi nghĩ rằng 𝔼𝕊𝕄𝕚𝕟 2 sẽ được gọi là 𝔼𝕊?
Hạ cấp

1
Không, tôi quyết định lưu nó cho một ngôn ngữ bổ sung (nhưng khác) cho.
Mama Fun Roll

IIRC Có bảng đen in đậm 2.
Conor O'Brien

@ Gọi nó là ESMax (trong doublestruck).
mbomb007

3

CJam, 21 byte

q'[,65>__el_@+W%@@+er

Không phải là một giải pháp tối ưu ... chưa ... Hãy thử trực tuyến

Thật khó để giải thích mà không nhóm các thứ, vì vậy đây là một lời giải thích chung: lấy đầu vào, đẩy bảng chữ cái viết hoa hai lần và viết thường hai lần, xoay mọi thứ xung quanh, kết hợp chuỗi chữ hoa và chữ thường, đảo ngược một và sử dụng phiên âm (tương tự như câu trả lời Retina).


Liệu đầu ra này có một dòng mới?
LegionMammal978

@ LegionMammal978 Không nên trừ khi aditsu thay đổi cách xuất ra ngăn xếp.
GamrCorps

@ LegionMammal978 Tôi không có.
Martin Ender


3

PostgreSQL, 118 125 byte

SELECT s,TRANSLATE(s,t||UPPER(t),REVERSE(t)||REVERSE(UPPER(t)))
FROM(SELECT text'Programming Puzzles & Code Golf's,text'abcdefghijklmnopqrstuvwxyz't)r

SqlFiddleDemo

Đầu ra:

╔══════════════════════════════════╦═════════════════════════════════╗
║                s                 ║            translate            ║
╠══════════════════════════════════╬═════════════════════════════════╣
║ Programming Puzzles & Code Golf  ║ Kiltiznnrmt Kfaaovh & Xlwv Tlou ║
╚══════════════════════════════════╩═════════════════════════════════╝

Đầu vào: SELECT text'...'s


BIÊN TẬP:

Nhập vào dưới dạng bảng:

SELECT s,TRANSLATE(s,t||UPPER(t),REVERSE(t)||REVERSE(UPPER(t)))
FROM i,(SELECT text'abcdefghijklmnopqrstuvwxyz't)r
GROUP BY s,t

SqlFiddleDemo

Đầu ra:

╔══════════════════════════════════╦═════════════════════════════════╗
║                s                 ║            translate            ║
╠══════════════════════════════════╬═════════════════════════════════╣
║ Hello, World!                    ║ Svool, Dliow!                   ║
║ Programming Puzzles & Code Golf  ║ Kiltiznnrmt Kfaaovh & Xlwv Tlou ║
║ abcdefghijklmnopqrstuvwxyz       ║ zyxwvutsrqponmlkjihgfedcba      ║
╚══════════════════════════════════╩═════════════════════════════════╝

Này lad2025, tôi nghĩ rằng nó ngắn hơn 118, nhưng tôi không phải là chuyên gia về các quy tắc đếm
t-clausen.dk

2

Python 3, 195 169 168 166 byte

Cảm ơn @TrangOul cho -2 byte!

Làm thế nào tôi không thấy rằng tôi có thể chơi golf trước đó?

x=__import__('string').ascii_letters;y,z=x[26:],x[:26];a,b=y[::-1],z[::-1];print(''.join(b[z.index(i)]if i in b else a[y.index(i)]if i in a else i for i in input()))

(sorta) vô danh:

x = __import__('string').ascii_letters;
y, z = x[26: ], x[: 26];
a, b = y[::-1], z[::-1];
print(''.join(b[z.index(i)]
    if i in b
    else a[y.index(i)]
    if i in a
    else i
    for i in input()
))

Hãy thử nó trên Ideone!


1
Bạn có thể lưu 2 byte bằng cách loại bỏ phần ngoài cùng []khỏi join.
Trang Oul

@TrangOul thật sao? Đó là một sự hiểu biết danh sách vì vậy tôi nghĩ rằng nó cần phải là một danh sách nếu không bạn sẽ nhận được generator object <genexpr> at..., nhưng tôi sẽ kiểm tra nó
con mèo

@TrangOul Nevermind, tôi đã học được điều gì đó, cảm ơn!
mèo

Bất kỳ lặp lại [chứa strgiá trị] có thể được truyền cho join()hàm.
Trang Oul

2

Python, 61 byte

lambda x:''.join([c,chr(ord(c)+4^31)][c.isalpha()]for c in x)

Một chức năng ẩn danh. Trên các chữ cái, thực hiện thao tác đảo ngược trên biểu diễn bit bằng cách thêm 4, sau đó lật năm bit cuối cùng, tương tự như câu trả lời Javascript của ETHproductions .


Chỉ cần viết chính xác điều tương tự haha
sagiksp

2

Haskell, 119 104 byte

Đã lưu 15 byte nhờ @nimi.

c=fromEnum;s=toEnum;f[]="";f(x:y)|64<c x&&c x<91=s(155-c x):f y|96<c x&&c x<123=s(219-c x):f y|0<1=x:f y

Sử dụng:

f "abcdefghijklmnopqrstuvwxyz"
"zyxwvutsrqponmlkjihgfedcba"

f "Programming Puzzles & Code Golf"
"Kiltiznnrmt Kfaaovh & Xlwv Tlou"

f "Hello, World!"
"Svool, Dliow!"

Giải trình

let c=fromEnum;s=toEnum;--wrap names for later use, fromEnum gets ascii code from char, toEnum gets char from ascii code
f[]=[];                 --feed empty list (of chars in this case), get empty list
f(x:y)                  --feed a list, separate the first element and...
|64<c x&&c x<91=        --if its an uppercase char (using ascii code range)...
s(c x*(-1)+155)         --  inverse its ascii code value, move it to the range of uppercase and get the new char
                        --  (like rotating half turn a ruler by the side and then sliding it to the space it previously occupied)
:f y                    --  feed the rest of the list and stick the new char in front of the result
|96<c x&&c x<123=       --if its a lowercase char (using ascii code range)...
s(c x*(-1)+219)         --  inverse its ascii code value, move it to the range of lowercase and get the new char
:f y                    --  feed the rest of the list and stick the new char in front of the result
|True=x:f y             --otherwise feed the rest of the list and stick the char in front of the result

Tôi chưa quen với Haskell ... về lập trình chức năng ... và với trang web, và tôi biết có (rất nhiều) câu trả lời tốt hơn cho câu hỏi này, nhưng hãy đồng ý với tôi.


Một số mẹo chơi gôn: a) không cần sử dụng let. Bắt đầu trực tiếp với c=fromEnum. Sử dụng (155-c x)(219-c x). c) Truecó thể được thay thế bởi 1<2. - Mã không tải cho tôi với lỗi "biến kiểu không rõ ràng" cho các hàm cs(ghci 7.10.2), nhưng điều này có thể dễ dàng được sửa chữa f[]=""thay vì f[]=[].
nimi

Cảm ơn!, Tôi thực sự tự hỏi liệu nó có hợp lệ mà không "cho phép" không, vì nó không chạy trực tiếp trên GHC.
tai mịn

2

Perl 6 , 28 byte

{S:g/\w/{chr $/.ord+4+^31}/}

Sử dụng:

# give it a lexical name
my &swap = {  }

say swap 'Programming Puzzles & Code Golf';
# Kiltiznnrmt Kfaaovh & Xlwv Tlou

say swap ('a'..'z').join
# zyxwvutsrqponmlkjihgfedcba

Khi tôi chạy nó, nó báo: Warning: Use of "ord" without parentheses is ambiguous at (eval 8)[/System/Library/Perl/5.18/perl5db.pl:732] line 2.Tôi không biết gì về perl vì vậy tôi có làm gì sai không? Làm thế nào tôi có thể chạy này?
Hạ cấp

@ Doᴡɴɢᴏᴀᴛ Nếu bạn nhận thấy thông báo này được viết bằng Perl 6 Bạn có thể truy cập # perl6 trên freenode và gõm: my &swap = {S:g/\w/{chr $/.ord+4+^31}/}; say swap ('a'..'z').join
Brad Gilbert b2gills

À không sao, hình như tôi không thể đọc được: P
Downgoat

@ Doᴡɴɢᴏᴀᴛ Tôi đã thêm một lưu ý rằng bạn có thể kiểm tra nó trên # perl6 trên freenode
Brad Gilbert b2gills

2

Java, 136 byte

void x(String i){for(char c:i.toCharArray()){if(Character.isLetter(c))c=c<91?(char)(90-(c-65)):(char)(122-(c-97));System.out.print(c);}}

Ví dụ sử dụng:

class Test {
  static void x(String i){for(char c:i.toCharArray()){if(Character.isLetter(c))c=c<91?(char)(90-(c-65)):(char)(122-(c-97));System.out.print(c);}}
  public static void main(String[] args) {
    x("Programming Puzzles & Code Golf");
    // produces "Kiltiznnrmt Kfaaovh & Xlwv Tlou"
  }
}

Có lẽ là ngôn ngữ thường được sử dụng tồi tệ nhất về kích thước byte.



Tôi biết điều này đã được đăng khoảng 1,5 năm trước, nhưng bạn có thể chơi golf khá nhiều thứ như thế này: void x(String i){for(Character c:i.toCharArray())System.out.print(c.isLetter(c)?(char)(c<91?90-(c-65):122-(c-97)):c);}( 118 byte )
Kevin Cruijssen

Hoặc thậm chí ngắn hơn: void y(String i){for(int c:i.getBytes())System.out.print((char)(c>65&c<91|c>96&c<123?c<91?90-(c-65):122-(c-97):c));}( 116 byte )
Kevin Cruijssen

1
@KevinCruijssen Bạn cũng có thể sắp xếp lại các phép tính để loại bỏ sự cần thiết của dấu ngoặc đơn bằng cách 90-(c-65)nhập vào -c+65+90 122-(‌​c-97)vào -c+97+122, giúp tiết kiệm từng byte.
Zavada

2

Unix shell + tr + printf, 35 byte

tr A-Za-z `printf %s {Z..A} {z..a}`

Bạn đang ở đây, một câu trả lời kinh điển trong tr. Tôi nghĩ làm thế nào một câu hỏi để chuyển ngữ bảng chữ cái đi mà không có câu trả lời chính tắc để tr đánh dấu bảng chữ cái?

tr tự nó thậm chí không làm một "Xin chào, thế giới!" và như vậy không phải là ngôn ngữ lập trình, vì vậy tôi đã đánh dấu câu trả lời là không biên dịch [1] .

[1]: Chỉnh sửa: Trên thực tế, Unix shell là ngôn ngữ và tr là thư viện chuẩn . Cảm ơn Downgoat và Digital Trauma đã giúp tôi phát hiện ra điều này.


3
Tôi nghĩ sẽ tốt khi yêu cầu shell hoặc bash là ngôn ngữ và các tiện ích phổ biến ( trnằm trong coreutils) là thư viện chuẩn. Xem vô số câu trả lời của tôi ;-)
Chấn thương kỹ thuật số

1
Nhưng nó không hoạt động : tr: range-endpoints of 'Z-A' are in reverse collating sequence order. Tôi nghĩ bạn phải làm một cái gì đó như tr A-Za-z $(printf %s {Z..A} {z..a})(và thay thế $( )bằng backticks)
Chấn thương kỹ thuật số

@DigitalTrauma nhưng không phải ai cũng có printf trên hệ thống của họ.
dùng48538

7
Tôi nghĩ rằng bạn sẽ gặp khá nhiều khó khăn khi tìm một hệ thống Unix không có printf- sau tất cả, nó được chỉ định bởi Posix . Ngoài ra, nó là một bản dựng sẵn trong bash khá phổ biến ngày nay. Bất kể, có một cái gì đó được cài đặt sẵn trên hệ thống của mọi người không phải là điều kiện tiên quyết cho môn đánh gôn - không phải ai cũng có CJam trên hệ thống của họ ;-)
Chấn thương kỹ thuật số

1
Khoảng cách giữa }{được yêu cầu - nếu không, việc mở rộng sẽ trở thành như thếZz Zy Zx ... Za Yz ... Aa
Digital Trauma


1

MATL , 21 28 byte

Sử dụng phiên bản 6.0.0 , sớm hơn thử thách này. Mã này chạy trong Octave.

jttk2Y2mXK)o31Z~4-cK(

Thí dụ

>> matl
 > jttk2Y2mXK)o31Z~4-cK(
 >
> Hello, World!
Svool, Dliow!

Giải trình

j             % input string
t             % duplicate
tk            % duplicate and convert to lowercase
2Y2           % string 'abc...xyz'
m             % "ismember" function: produces logical index of letter positions
XK            % copy to clipboard K
)             % index into string to get its letters
o31Z~4-       % bitwise XOR with 31 and subtract 4
c             % convert to char
K             % paste logical index from clipboard K
(             % put back modified letters into original string

Cách tiếp cận cũ, 28 byte

j1Y2!tkh"t@2#m@0v27b-)wXK)K(

1

MATLAB, 61 byte

@(x)[abs(-x+ismember(x,65:90)*155+ismember(x,97:122)*219),'']

Tôi đã thử f=@ismember, và làm cho phạm vi trở thành a=65:90một biến và làm 32+atrong phần thứ hai ismember. Tất cả điều này rút ngắn mã, nhưng sẽ dẫn đến một chương trình và do đó yêu cầu cả dispinput.

Điều này mang lại:

ans('Hello, World!')
ans =
Svool, Dliow!

ans('Programming Puzzles & Code Golf')
ans =
Kiltiznnrmt Kfaaovh & Xlwv Tlou

1

Brachylog , 66 byte

_|hH(:64>:91<,77-H+78=X;H:96>:123<,109-H+110=X;HX),[X]:"~c"w,?b:0&

Việc thiếu các phần dựng sẵn thực sự gây tổn thương ở đây, vì vậy chúng tôi phải sử dụng các tính toán mã ASCII cũ.

Vị ngữ brachylog_mainmong đợi một chuỗi mã ký tự là đầu vào và không có đầu ra, vdbrachylog_main(`Hello, World!`,_).

Giải trình

_                                                                  § If the input is empty,
                                                                   § return true
                                                                   §
 |                                                                 § Else
                                                                   §
  hH(                                            ),[X]:"~c"w       § Print variable X which
                                                                   § depends on the head of
                                                                   § the input as a char code
                                                                   §
                                                            ,?b:0& § Recursive call on the
                                                                   § tail of the input
                                                                   §
     :64>:91<,77-H+78=X                                            § If H is capital, X =
                                                                   § 77 - H + 78
                       ;                                           § Else if H is non-cap, X=
                        H:96>:123<,109-H+110=X                     § 109 - H + 110
                                              ;                    § Else (not a letter)
                                               HX                  § H = X    

1

Perl 6, 40 39 byte

Vì mọi người khác đang thực hiện các chức năng ẩn danh:

my &f=*.trans(/\w/=>{chr $/.ord+4+^31})

(Cảm ơn @ b2gills về tiền boa)

Sử dụng cùng một chút lật voodoo như một số bài viết khác. Tôi không chắc có bao gồm khai báo biến / hàm trong số byte hay không, vì vậy tôi chỉ làm trong trường hợp này. Không có nó, giải pháp này chỉ có 34 byte.

Sử dụng:

> f "zyxwvutsrqponmlkjihgfedcba"
abcdefghijklmnopqrstuvwxyz
> f "Kiltiznnrmt Kfaaovh & Xlwv Tlou"
Programming Puzzles & Code Golf
> f "Svool, Dliow!"
Hello, World!

Bạn có thể sử dụng *.trans(…)để làm cho nó ngắn hơn.
Brad Gilbert b2gills

1

Python 3, 164 159 byte

def f(t,a="abcdefghijklmnopqrstuvwxyz",b=""):
 for c in t:u=64<ord(c)<91;c=c.lower();c=a[::-1][a.index(c)] if c in a else c;b+=c.upper() if u else c
 return b
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.