สลับตัวอักษร


48

ในความท้าทายนี้คุณจะ "ย้อนกลับ" ตัวอักษรหรือแลกเปลี่ยนกับa-z z-aเรื่องนี้เป็นที่รู้จักกันทั่วไปในนามAtbash cypher

เนื่องจากการแปลงนี้ทำให้ผลลัพธ์ดูเหมือนภาษาต่างประเทศบางรหัสของคุณจะต้องสั้นที่สุด


ตัวอย่าง

abcdefghijklmnopqrstuvwxyz
zyxwvutsrqponmlkjihgfedcba

Programming Puzzles & Code Golf
Kiltiznnrmt Kfaaovh & Xlwv Tlou

Hello, World!
Svool, Dliow!

สเปค

  • อินพุตอาจมีหลายบรรทัดและจะเป็นแบบ ASCII เท่านั้น
  • ไม่มี เพิ่มเติมช่องว่างควรจะเพิ่มการส่งออก
  • เคสต้องได้รับการเก็บรักษาไว้

ลีดเดอร์บอร์ด


นี่คือสั้นที่สุดในหน่วยไบต์


24
+1 สำหรับเหตุผล"เนื่องจากการแปลงนี้ทำให้ผลลัพธ์ดูเหมือนภาษาต่างประเทศบางรหัสของคุณจะต้องสั้นที่สุด"
แมว

11
บางอย่างเล็กน้อย: นี่คือAtbashเลขศูนย์ที่รู้จักกันมานานเท่าพระคัมภีร์
จาค็อบ

6
"เนื่องจากการแปลงนี้ทำให้ผลลัพธ์ดูเหมือนภาษาต่างประเทศบางรหัสของคุณจะต้องสั้นที่สุด" ตรรกะแบบนั้นคืออะไร ?? เนื่องจากคำอธิบายของคุณก่อให้เกิดเครื่องหมายคำถามมากมายราวกับเขียนในภาษาต่างประเทศบางคำตอบของคุณสำหรับคำถามนี้ควรเป็นภาษาธรรมชาติที่เข้าใจได้และชื่นชมอย่างมาก
บาร์ต

Kiltiznnrmt Kfaaovh & Xlwv Tlou น่าจะเป็นเว็บไซต์ใหม่สำหรับ "Programming Trivials & Code Bowling" ...
Erik the Outgolfer

ทำไมคุณไม่อนุญาตพื้นที่ว่างเพิ่มเติม? ซึ่งทำให้เป็นไปไม่ได้ในบางภาษาที่มีบรรทัดใหม่ต่อท้ายเสมอ ฉันมองไม่เห็นมันเพิ่มอะไรเข้าไปในความท้าทาย
แยกผลไม้

คำตอบ:


11

Pyth, 8 ไบต์

XXzG)rG1

@xnor แนะนำวิธีการที่ง่ายกว่านี้สำหรับคำตอบ Pyth ของ @ FryAmTheEggman จากนั้นฉันแปลเป็น Pyth

สิ่งนี้ใช้พฤติกรรมที่สะดวกของX(แปล) เมื่อได้รับเพียงสองข้อโต้แย้ง: แปลจากอาร์กิวเมนต์ที่สองเป็นอาร์กิวเมนต์ที่สองที่กลับรายการ เราทำเช่นนี้ครั้งแรกกับตัวอักษรตัวพิมพ์เล็ก ( G) แล้วกับ Guppercased


16

C, 59 ไบต์

ขออภัยที่นำ C ขึ้นมาอีกครั้ง แต่ฉันรู้สึกผิดหวังเล็กน้อยที่เห็นเฉพาะฟังก์ชัน C ที่นี่ ฉันอยู่ภายใต้ความประทับใจ OP ที่กำลังมองหาผลิตภัณฑ์ที่ใช้งานได้

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

รวบรวมบน Ubuntu 14.04 ด้วยวิธีง่าย ๆ :

cc swalpha.c

executable ที่เป็นผลลัพธ์จะอ่านจำนวนบรรทัดใด ๆ จาก stdin และเขียนผลลัพธ์ไปที่ stdout

ขอขอบคุณผู้โพสต์อื่น ๆ มากมายสำหรับเคล็ดลับ XOR


11

CJam, 17 ไบต์

ฉันต้องการช่วย GamrCorps ตีกอล์ฟโซลูชัน CJam ของเขา แต่ผลลัพธ์ก็แตกต่างกันมากจนฉันตัดสินใจที่จะตอบแยกต่างหาก

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

ลองออนไลน์

คำอธิบาย

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
ฉันดีใจที่คุณพยายามช่วย! นั่นคือทางออกที่ฉันพยายามทำฉันไม่สามารถหา XOR ได้ งานที่ดี!
GamrCorps

1
การเน้นไวยากรณ์ของ SE ทำให้เกลียดชัง esolangs
Cyoce

@Cyoce พวกเขาอาจไม่มีเวลา ระบุจำนวนภาษาบนเว็บไซต์นี้ ที่กล่าวว่า CJam น่าจะเป็นหนึ่งในวิธีที่ง่ายกว่าเนื่องจากมันไม่ได้ทำการดัดแปลงตัวเองและมีโครงสร้างที่ชัดเจน ฉันต้องการที่จะเห็นพวกเขาพยายามที่จะเพิ่มการเน้นไวยากรณ์ในภาษาที่แก้ไขด้วยตนเองเช่น ///
แยกผลไม้

@ Challenger5 afaik เน้นไวยากรณ์เพียงใช้ prettify ของ Google ทำสนับสนุน esolangs ต่าง ๆ จะต้องมีการเพิ่ม
Martin Ender

11

JavaScript (ES6), 69 67 ไบต์

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

ใช้กลยุทธ์เดียวกับคำตอบ Japtของฉัน:

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.

สาปชื่ออสังหาริมทรัพย์ที่มีความยาวอย่างไม่น่าเชื่อ JS ...


1
+1 สำหรับการกล่าวถึงชื่อคุณสมบัติที่ยาวเหยียดยาวของ JS รายการโปรดของฉันยังคงเป็นที่น่าอับอายdocument.getElementById
Cyoce

2
@Cyoce Try document.getElementsByClassNameหรือบน Firefox และ Chrome,document.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC
Ismael Miguel

ดูเหมือนว่าจะเป็น 66 ไบต์ไม่ใช่ 67
Downgoat

@ Doᴡɴɢᴏᴀᴛขอบคุณมาก!
ETHproductions

ดูเหมือนว่าคุณไม่มีเครื่องหมายวงเล็บปิดที่ส่วนท้ายของรหัส golfed
starbeamrainbowlabs

10

Retina , 17 14 13 ไบต์

รหัส:

\T`w`_dZ-Az-a

คำอธิบาย:

\             # 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

มันทำเรื่องมหัศจรรย์และทำภารกิจให้สำเร็จ

ลองมันนี่


2
\โชคดีที่คุณว่าฉันเพิ่งเพิ่ม โชคไม่ดีที่ฉันยังไม่ได้เพิ่มการเรียนตัวอักษรสำหรับตัวอักษรและการกลับตัวของคลาสตัวละคร
Martin Ender

@ MartinBüttnerมากโชคดีจริง ๆ ที่เกือบจะยกเลิกคำตอบของฉัน :)
Adnan

สำหรับการอ้างอิงเป็นของจอประสาทตา 0.7.2 \T`lL`RlRLคุณสามารถทำ
Martin Ender

9

Pyth, 10 9

uXGr;H)2z

ขอบคุณ Jakube สำหรับการบันทึกไบต์ด้วยคุณสมบัติใหม่ของ;!

ชุดทดสอบ

คำอธิบายอย่างรวดเร็ว: ลดการเริ่มต้นด้วยอินพุตที่ตัวเลข 0 และ 1 การดำเนินการที่ต้องทำคือแปลตัวอักษรตัวพิมพ์เล็กด้วยr...0หรือr...1ซึ่งฟังก์ชันล่างและบนจากไพ ธ อนตามลำดับนำไปใช้กับมันแล้วจึงย้อนกลับ


1
9 ไบต์เนื่องจากคุณสมบัติใหม่ (ไม่แม้แต่วันเดียว):uXGr;H)2z
Jakube

5
คุณสามารถเพิ่มคำอธิบายได้ไหม?
TanMath

1
คุณไม่สามารถใช้Xกับตัวอักษรแล้วใช้ตัวอักษรพิมพ์ใหญ่ได้ใช่ไหม
xnor

1
@xnor XXzG)rG1? ดูเหมือนว่าจะทำงาน
lirtosiast

หรืออาจทำ X บนตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ตัดแบ่งแล้วสลับเคส? ที่จริงแล้วอาจนานกว่านั้น
xnor

6

Julia, 74 61 47 ไบต์

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

นี่คือฟังก์ชั่นแลมบ์ดาที่ยอมรับสตริงและส่งคืนสตริง หากต้องการเรียกใช้กำหนดค่าให้กับตัวแปร

เราจับคู่แต่ละตัวอักษรโดยใช้นิพจน์ทั่วไปและแทนที่ตัวอักษรแต่ละตัวด้วยอักขระ ASCII ที่สอดคล้องกับ 31 XOR รหัส ASCII สำหรับตัวอักษรลบ 4


ว้าวนี่มันสง่ามาก ฉันได้รับการเตือนเลิกใช้สำหรับดังนั้นคุณอาจต้องการที่จะปรับปรุงที่$ ไม่ทราบว่าคุณสามารถใช้ฟังก์ชันreplaceได้
niczky12

5

C, 150 129 ไบต์

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

ฟังก์ชั่นนี้เพียงแปลงถ่านเป็น int และเพิ่มออฟเซ็ตที่เหมาะสมให้กับ int ก่อนที่จะพิมพ์ ฉันรู้ว่ามันไม่ได้สั้นที่สุด แต่ฉันไม่เห็นการใช้งาน C

ตัวอย่างการใช้งาน

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

UPDATE: ย่อชื่อตัวแปร


ยินดีต้อนรับสู่การเขียนโปรแกรมปริศนาและการแลกเปลี่ยนรหัสกองกอล์ฟ! นี่เป็นวิธีการที่ดีมาก มันสามารถตีกอล์ฟได้มากขึ้นโดยการทำให้ตัวแปรทั้งหมด (รวมถึงtemp) มีความยาวหนึ่งตัวอักษร
wizzwizz4

อ่าคุณพูดถูก! ฉันจะอดอล์ฟอันนี้
Danwakeem

1
คุณคิดว่าคุณสามารถไปที่การท้าทายของฉันได้หรือไม่? วิเคราะห์เก้าอี้ของคุณ
wizzwizz4

1
ใช่มันจะทำงานโดยไม่มีส่วนหัวคุณเพิ่งได้รับคำเตือนของคอมไพเลอร์ @ edc65 ฉันคิดว่ามันคอมไพล์แล้วรันมันจะไม่ถือว่าเป็นการโกง แต่ในโลกแห่งความเป็นจริงการใช้งานคุณควรรวมส่วนหัวไว้เสมอ
Danwakeem

1
107 ไบต์: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 23ไบต์

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

ลองออนไลน์!

มันทำงานอย่างไร

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

ความคิดที่ดี (ที่ฉันยืม ... ) เพื่อใช้แฮคเกอร์สำหรับเรื่องนี้
หลุยส์เมนโด

5

C, 64

ฟังก์ชัน void ที่แก้ไขสตริงในตำแหน่ง

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

ทดสอบ: ideone


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

@CoolGuy ขวา แต่ฉันไม่ชอบทั่วโลกภายในฟังก์ชัน ... มันเป็นเพียงฉัน
edc65

ไม่ใช่ 64 ไบต์ใช่ไหม
Downgoat

@ Doᴡɴɢᴏᴀᴛใช่มันคือ .. ขอบคุณ ..
edc65

5

R, 69 61 ไบต์

ขอบคุณ@Giuseppeสำหรับการตัดส่วนเกินพิเศษบางส่วน:

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

รุ่นก่อนหน้า:

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

นี่คือฟังก์ชั่นที่ไม่ระบุชื่อ การใช้งาน:

> 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))แทนการrawแปลงและคุณสามารถกำจัดได้catเช่นกัน ฉันกำลังทำให้เป็นนิสัยที่จะมาเล่นกอล์ฟกับคำตอบของคุณที่อายุ 1 ปีขึ้นไป ...
Giuseppe

4

อย่างจริงจัง 31 ไบต์ (ไม่ใช่การแข่งขัน)

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

ฐานสิบหก:

a3a3962bbba352a396522bbc2c603bbda1755744be452858305758604dee6a

ลองใช้ออนไลน์

Expl:

úúû+╗                             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.)

ฉันเพิ่งรู้สเป็คว่าไม่มีช่องว่างเพิ่มเติม แต่ไม่มีวิธีที่จะระงับการขึ้นบรรทัดใหม่ในผลลัพธ์อย่างจริงจังดังนั้นจึงไม่มีวิธีการแก้ปัญหาอย่างจริงจัง


1
อะไรESACREPPUesacrewolหมายความว่าอย่างไร
Downgoat

3
@ Doᴡɴɢᴏᴀᴛ UPPERCASE ย้อนกลับ LOWERCASE กลับรายการ
Mama Fun Roll

2
ตัวอักษรตัวพิมพ์ใหญ่ที่ตรงกันข้ามได้นำไปรวมกับตัวอักษรตัวพิมพ์เล็กที่ตรงกันข้าม
quintopia

4

Ruby, 40 ไบต์

วิธีแก้ปัญหาใหม่: ขโมยเวทมนตร์ที่พลิกจากบิตของโพสต์อื่นที่นี่:

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

Ruby, 55 46 ไบต์

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

ปิด 9 ไบต์ด้วย @manatwork


ทดสอบการทำงาน:

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


3

𝔼𝕊𝕄𝕚𝕟 2, 12 ตัวอักษร / 26 ไบต์ (ไม่แข่งขัน)

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

Try it here (Firefox only).

เพิ่มฟังก์ชั่นถอดเสียงหลังจากการโพสต์ความท้าทาย

คำอธิบาย

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

ฉันคิดว่า𝔼𝕊𝕄𝕚𝕟 2 จะถูกเรียกว่า𝔼𝕊∞?
Downgoat

1
ไม่ฉันตัดสินใจบันทึกภาษานั้นเป็นภาษาเสริม (แต่แตกต่างกัน) สำหรับ𝔼𝕊𝕄𝕚𝕟
Mama Fun Roll

IIRC มีกระดานดำตัวหนา 2
Conor O'Brien

@ ՊՓԼՃՐՊՃՈԲՍԼเรียกมันว่า ESMax (เป็นทวีคูณ)
mbomb007

3

CJam, 21 ไบต์

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

ยังไม่ใช่ทางออกที่ดีที่สุด ... ยัง ... ลองออนไลน์

มันยากที่จะอธิบายโดยไม่มีการจัดกลุ่มสิ่งต่าง ๆ ดังนั้นนี่คือคำอธิบายทั่วไป: รับอินพุตผลักตัวอักษรตัวพิมพ์ใหญ่สองครั้งและตัวพิมพ์เล็กสองครั้งหมุนสิ่งรอบ ๆ รวมตัวอักษรตัวพิมพ์ใหญ่และตัวพิมพ์เล็กกลับด้านหนึ่ง


เอาท์พุทนี้ขึ้นบรรทัดใหม่ต่อท้ายหรือไม่?
LegionMammal978

@ LegionMammal978 ไม่ควรเว้นเสียแต่ว่า aditsu จะเปลี่ยนวิธีการแสดงผลสแต็ก
GamrCorps

@ LegionMammal978 ฉันไม่ได้
Martin Ender

3

C (ฟังก์ชั่น), 50

f(char*s){for(;*s;s++)*s=isalpha(*s)?*s+4^31:*s;}

นี้สร้างขึ้นบนทั้งหมด สาม ก่อนหน้าคำตอบ C เพื่อให้เครดิตกับ @Ruud, @Danwakeem และ @ edc65

ฟังก์ชั่นนี้จะแก้ไขอาร์เรย์ถ่านในสถานที่

ความเข้าใจของฉันคืออนุญาตให้ป้อนข้อมูลฟังก์ชันได้เว้นแต่จะถูกแบนในคำถาม

ลองออนไลน์


3

PostgreSQL 118 125 ไบต์

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

เอาท์พุท:

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

การป้อนข้อมูล: SELECT text'...'s


แก้ไข:

อินพุตเป็นตาราง:

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

SqlFiddleDemo

เอาท์พุท:

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

เฮ้ lad2025 ฉันคิดว่านี่สั้นกว่า 118 แต่ฉันไม่มีความเชี่ยวชาญในกฎการนับ
t-clausen.dk

2

Python 3, 195 169 168 166 ไบต์

ขอบคุณ@TrangOulสำหรับ -2 ไบต์!

ฉันไม่เห็นเลยว่าฉันจะลงสนามได้ก่อน

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) ไม่อัปโหลด:

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

ลองใช้กับ Ideone!


1
คุณสามารถบันทึก 2 ไบต์โดยการเอานอกสุดจาก[] join
ตรัง Oul

@TrangOul จริงเหรอ? มันเป็นรายการความเข้าใจดังนั้นฉันคิดว่ามันต้องเป็นรายการหรืออื่น ๆ ที่คุณได้รับgenerator object <genexpr> at...แต่ฉันจะทดสอบ
แมว

@ TrangOul ไม่เป็นไรฉันเรียนรู้อะไรแล้วขอบคุณ!
แมว

[มีstrค่า] สามารถทำซ้ำใด ๆ ที่สามารถส่งผ่านไปยังjoin()ฟังก์ชั่น
ตรัง Oul

2

Python ขนาด 61 ไบต์

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

ฟังก์ชั่นที่ไม่ระบุชื่อ ที่ตัวอักษรไม่การดำเนินการย้อนกลับในการแสดงบิตโดยการเพิ่ม 4 แล้วพลิกช่วงห้าบิตคล้ายกับETHproductions' คำตอบ


เพิ่งเขียนสิ่งเดียวกันที่แน่นอนฮ่า ๆ
sagiksp

2

Haskell, 119 104 ไบต์

บันทึก 15 ไบต์ขอบคุณ @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

การใช้งาน:

f "abcdefghijklmnopqrstuvwxyz"
"zyxwvutsrqponmlkjihgfedcba"

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

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

คำอธิบาย

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

ฉันยังใหม่กับแฮสเค็ลล์ ... สำหรับการเขียนโปรแกรมใช้งานได้ ... และไปยังไซต์และฉันรู้ว่ามีคำตอบที่ดีกว่าสำหรับคำถามนี้มากมาย แต่ทนกับฉัน


เคล็ดลับการเล่นกอล์ฟก) letไม่จำเป็นต้องใช้ c=fromEnumเริ่มโดยตรงกับ ใช้และ(155-c x) (219-c x)c) จะถูกแทนที่ด้วยTrue 1<2- รหัสไม่สามารถโหลดสำหรับฉันกับข้อผิดพลาด "ตัวแปรประเภท ambigious ไม่ทั้งหมดเรียน" สำหรับการทำงานcและs(ghci 7.10.2) แต่นี้สามารถแก้ไขด้วยการแทนf[]="" f[]=[]
nimi

ขอบคุณ! ฉันจริง ๆ สงสัยว่ามันถูกต้องโดยไม่ต้อง "ปล่อย" เพราะมันไม่ได้ทำงานโดยตรงบน GHC
หูปุย

2

Perl 6 , 28 ไบต์

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

การใช้งาน:

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

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

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

เมื่อฉันเรียกใช้มันจะมีข้อความแจ้งว่า: Warning: Use of "ord" without parentheses is ambiguous at (eval 8)[/System/Library/Perl/5.18/perl5db.pl:732] line 2.ฉันไม่รู้อะไรเกี่ยวกับ Perl ดังนั้นฉันทำอะไรผิดหรือเปล่า? ฉันจะเรียกใช้สิ่งนี้ได้อย่างไร
Downgoat

@ Doᴡɴɢᴏᴀᴛหากคุณสังเกตเห็นว่ามันเขียนไว้ในPerl 6คุณสามารถไป # perl6 บน freenode และพิมพ์m: my &swap = {S:g/\w/{chr $/.ord+4+^31}/}; say swap ('a'..'z').join
Brad Gilbert b2gills

อาโอเคเห็นได้ชัดว่าฉันอ่านไม่ออก: P
Downgoat

@ Doᴡɴɢᴏᴀᴛฉันเพิ่มบันทึกที่คุณสามารถทดสอบบน # Perl6 บนฟรีโนด
แบรดกิลเบิร์ b2gills

2

Java, 136 ไบต์

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

ตัวอย่างการใช้งาน:

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"
  }
}

อาจเป็นภาษาที่ใช้บ่อยที่สุดในแง่ของขนาดไบต์



ฉันรู้ว่ามันถูกโพสต์เมื่อประมาณ 1.5 ปีที่แล้ว แต่คุณสามารถตีกอล์ฟได้สองสามอย่างเช่นนี้: 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 bytes )
Kevin Cruijssen

หรือสั้นกว่านี้: 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 ไบต์ )
Kevin Cruijssen

1
@KevinCruijssen คุณยังสามารถจัดเรียงการคำนวณใหม่เพื่อลบล้างความต้องการของวงเล็บด้วยการทำ90-(c-65)เข้า-c+65+90 และ122-(‌​c-97)ออก-c+97+122ซึ่งจะช่วยประหยัดไบต์แต่ละรายการ
Zavada

2

Unix shell + tr + printf, 35 ไบต์

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

ที่นี่คุณเป็นคำตอบที่ยอมรับใน tr ฉันคิดว่าคำถามที่สามารถถอดอักษรให้เป็นไปได้อย่างไรโดยไม่มีคำตอบที่ยอมรับได้ของtrตัวอักษรตัวอักษร?

tr ด้วยตัวเองไม่ได้ทำ "สวัสดีโลก!" และเช่นนั้นไม่ใช่ภาษาโปรแกรมดังนั้นฉันจึงทำเครื่องหมายคำตอบว่าไม่ใช่การคอมไพล์[1] [1]

[1]: แก้ไข: ที่จริงเชลล์ยูนิกซ์เป็นภาษาและ TR เป็นห้องสมุดมาตรฐาน ขอบคุณ Downgoat และ Digital Trauma ที่ช่วยชี้จุดนี้ให้ฉัน


3
ฉันคิดว่ามันดีที่จะเรียกร้องเชลล์หรือทุบตีเป็นภาษาและยูทิลิตี้ทั่วไป ( trเป็น coreutils) เป็นห้องสมุดมาตรฐาน ดูคำตอบของฉันนับไม่ถ้วน ;-)
Digital Trauma

1
tr: range-endpoints of 'Z-A' are in reverse collating sequence orderแต่ก็ไม่ได้ทำงาน: ฉันคิดว่าคุณต้องทำอะไรบางอย่างเช่นtr A-Za-z $(printf %s {Z..A} {z..a})(และแทนที่$( )ด้วย backticks)
Digital Trauma

@DigitalTrauma แต่ไม่ใช่ทุกคนที่มี printf บนระบบของพวกเขา
user48538

7
ฉันคิดว่าคุณจะต้องค่อนข้างเป็นเวลาที่ยากหาระบบ Unix ที่ไม่ได้printf- หลังจากทั้งหมดมันระบุโดย Posix นอกจากนี้มันยังมี builtin ใน bash ซึ่งค่อนข้างแพร่หลายทุกวันนี้ โดยไม่คำนึงถึงว่ามีบางสิ่งที่ติดตั้งไว้ล่วงหน้าในระบบของทุกคนไม่ใช่ข้อกำหนดเบื้องต้นสำหรับcode-golf - ไม่ใช่ว่าทุกคนจะมี CJam ในระบบของพวกเขาเช่นกัน ;-)
Digital Trauma

1
ช่องว่างระหว่าง}และ{จำเป็น - มิฉะนั้นการขยายตัวจะกลายเป็นเช่นZz Zy Zx ... Za Yz ... Aa
Digital Trauma


1

MATL , 21 28ไบต์

ใช้เวอร์ชัน 6.0.0ซึ่งเร็วกว่าความท้าทายนี้ รหัสทำงานใน Octave

jttk2Y2mXK)o31Z~4-cK(

ตัวอย่าง

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

คำอธิบาย

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

วิธีเก่า 28 ไบต์

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

1

MATLAB, 61 ไบต์

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

ฉันพยายามf=@ismemberและทำให้ช่วงa=65:90เป็นตัวแปรและทำ32+aในismember-call ที่สอง ทั้งหมดนี้ทำให้รหัสสั้นลง แต่จะส่งผลให้โปรแกรมต้องมีทั้งdispและinputและ

สิ่งนี้ให้:

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

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

1

Brachylogขนาด 66 ไบต์

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

การขาดตัวบิวด์อินทำให้เจ็บจริงๆที่นี่ดังนั้นเราจึงต้องหันไปใช้การคำนวณรหัส ASCII แบบเก่าที่ดี

เพรดิเคตbrachylog_mainคาดว่าสตริงอักขระรหัสเป็นอินพุตและไม่มีเอาต์พุตเช่นbrachylog_main(`Hello, World!`,_).

คำอธิบาย

_                                                                  § 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 ไบต์

เนื่องจากทุกคนกำลังทำหน้าที่นิรนาม:

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

(ขอบคุณ @ b2gills สำหรับคำแนะนำ)

ใช้วูดูบิตที่พลิกเหมือนกันกับโพสต์อื่น ๆ ฉันไม่แน่ใจว่าจะรวมการประกาศตัวแปร / ฟังก์ชั่นในการนับจำนวนไบต์หรือไม่ดังนั้นฉันจึงทำในกรณี หากไม่มีวิธีแก้ปัญหานี้จะมีเพียง 34 ไบต์

การใช้งาน:

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

คุณสามารถใช้*.trans(…)เพื่อทำให้มันสั้นลง
Brad Gilbert b2gills

1

Python 3, 164 159 bytes

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.