Tukar Alfabet


48

Dalam tantangan ini, Anda akan "membalikkan" alfabet atau bertukar a-zdengan z-a. Ini umumnya dikenal sebagai Atbash cypher.

Karena transformasi ini membuat output terlihat seperti bahasa asing, kode Anda harus sesingkat mungkin.


Contohnya

abcdefghijklmnopqrstuvwxyz
zyxwvutsrqponmlkjihgfedcba

Programming Puzzles & Code Golf
Kiltiznnrmt Kfaaovh & Xlwv Tlou

Hello, World!
Svool, Dliow!

Spesifikasi

  • Input mungkin berisi beberapa baris, dan hanya ASCII
  • Tidak ada spasi tambahan yang harus ditambahkan ke output
  • Kasing harus dilestarikan

Papan peringkat


Ini adalah sehingga kode terpendek dalam byte menang


24
+1 untuk pembenaran "Karena transformasi ini membuat output terlihat seperti bahasa asing, kode Anda harus sesingkat mungkin."
kucing

11
Beberapa Trivia: ini Atbash , sandi yang dikenal setua Alkitab.
Yakub

6
"Karena transformasi ini membuat output terlihat seperti bahasa asing, kode Anda harus sesingkat mungkin." Logika macam apa itu ?? Karena uraian Anda memunculkan sebanyak mungkin tanda tanya seolah-olah itu ditulis dalam beberapa bahasa asing, jawaban Anda untuk pertanyaan ini harus dalam bahasa alami yang dapat dipahami dan beberapa verbosity dihargai.
Bart

Kiltiznnrmt Kfaaovh & Xlwv Tlou harus menjadi situs baru untuk "Programming Trivials & Code Bowling" ...
Erik the Outgolfer

Mengapa Anda tidak mengizinkan spasi tambahan? Itu membuat tidak mungkin dalam beberapa bahasa yang selalu memiliki baris baru. Saya tidak bisa melihatnya menambahkan sesuatu ke tantangan.
Buah Esolanging

Jawaban:


11

Pyth, 8 byte

XXzG)rG1

@ xnor menyarankan pendekatan yang lebih sederhana ini pada @ FryAmTheEggman's jawaban Pyth, kemudian saya menerjemahkannya ke Pyth.

Ini menggunakan perilaku praktis X(terjemahkan) ketika hanya diberikan dua argumen: itu menerjemahkan dari argumen kedua ke argumen kedua terbalik. Kami melakukan ini terlebih dahulu dengan alfabet huruf kecil ( G), dan kemudian dengan huruf besar G.


16

C, 59 byte

Maaf karena menghidupkan kembali C, tapi saya agak kecewa melihat hanya fungsi C di sini. Saya mendapat kesan OP sedang mencari produk yang dapat digunakan.

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

Dikompilasi di Ubuntu 14.04 dengan sederhana:

cc swalpha.c

Eksekusi yang dihasilkan membaca sejumlah baris dari stdin, dan menulis hasilnya ke stdout.

Terima kasih banyak poster lain untuk trik XOR.


11

CJam, 17 byte

Saya ingin membantu GamrCorps golf solusi CJam-nya, tetapi hasilnya berakhir sangat berbeda sehingga saya memutuskan untuk membuat jawaban terpisah.

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

Cobalah online.

Penjelasan

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
Yah, aku senang kamu mencoba membantu! Itu adalah solusi yang saya coba buat, saya hanya tidak tahu XOR. Pekerjaan yang baik!
GamrCorps

1
Sintaksis SE yang membenci esolang membenci.
Cyoce

@Cyoce Mereka mungkin tidak punya waktu; diberikan berapa banyak bahasa di situs ini. Yang mengatakan, CJam mungkin salah satu yang lebih mudah, karena tidak memodifikasi sendiri dan memiliki struktur yang cukup jelas. Saya ingin melihat mereka mencoba menambahkan penyorotan sintaks ke bahasa pengubah sendiri seperti ///.
Buah Esolanging

@ Challenger5 afaik, penyorotan sintaksis hanya menggunakan Google prettify, apakah dukungan untuk berbagai esolang harus ditambahkan di sana.
Martin Ender

11

JavaScript (ES6), 69 67 byte

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

Menggunakan strategi yang sama dengan jawaban Japt saya :

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.

Mengutuk nama properti Anda yang sangat panjang, JS ...


1
+1 untuk menyebutkan nama properti JS yang sangat panjang. Favorit saya masih terkenaldocument.getElementById
Cyoce

2
@Cyoce Coba document.getElementsByClassNameatau, di Firefox dan Chrome,document.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC
Ismael Miguel

Ini tampaknya hanya menjadi 66 byte bukan 67
Downgoat

@ Doᴡɴɢᴏᴀᴛ Anda benar tentang itu, terima kasih!
ETHproduk

Sepertinya Anda kehilangan braket penutup di bagian akhir kode golf.
starbeamrainbowlabs

10

Retina , 17 14 13 byte

Kode:

\T`w`_dZ-Az-a

Penjelasan:

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

Ini melakukan beberapa hal ajaib dan menyelesaikan tugas.

Coba di sini .


2
Beruntung Anda bahwa saya baru saja menambahkan \. Sial sekali Anda bahwa saya belum sempat menambahkan kelas karakter untuk huruf dan kelas karakter terbalik.
Martin Ender

@ MartinBüttner Memang sangat beruntung, itu hampir membatalkan jawaban saya :)
Adnan

Untuk referensi, pada Retina 0.7.2 Anda bisa melakukannya \T`lL`RlRL.
Martin Ender

9

Pyth, 10 9

uXGr;H)2z

Terima kasih kepada Jakube karena menyimpan byte dengan fitur baru ;!

Test Suite

Penjelasan cepat: kurangi mulai dengan input di atas angka 0 dan 1. Operasi yang akan dilakukan adalah menerjemahkan alfabet huruf kecil dengan salah satu r...0atau r...1yang merupakan fungsi bawah dan atas dari python, masing-masing, diterapkan padanya, dan kemudian dibalik.


1
9 byte karena fitur baru (bahkan tidak satu hari pun):uXGr;H)2z
Jakube

5
Bisakah Anda menambahkan penjelasan?
TanMath

1
Tidak bisakah Anda menggunakan Xalfabet dan alfabet kapital?
xnor

1
@ xnor XXzG)rG1? Itu sepertinya berhasil.
lirtosiast

Atau, mungkin X digabungkan dengan huruf kecil dan besar, lalu tukar huruf besar-kecil? Itu mungkin lebih lama, sebenarnya.
xnor

6

Julia, 74 61 47 byte

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

Ini adalah fungsi lambda yang menerima string dan mengembalikan string. Untuk menyebutnya, tetapkan ke variabel.

Kami mencocokkan setiap huruf menggunakan ekspresi reguler dan mengganti setiap huruf dengan karakter ASCII yang sesuai dengan 31 XOR kode ASCII untuk huruf tersebut, minus 4.


Wow, ini sangat elegan. Saya mendapatkan peringatan penghentian untuk $jadi Anda mungkin ingin memperbarui itu . Tidak tahu bahwa Anda dapat menggunakan fungsi dalam replace.
niczky12

5

C, 150 129 Bytes

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

Fungsi ini hanya mengkonversi char ke int dan menambahkan offset yang sesuai ke int sebelum mencetak. Saya tahu ini bukan yang terpendek tapi saya tidak melihat implementasi C.

Contoh penggunaan

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

PEMBARUAN: disingkat nama variabel.


Selamat Datang di Programming Puzzles dan Code Golf Stack Exchange! Ini adalah pendekatan yang sangat bagus. Itu bisa lebih golf dengan membuat semua variabel (termasuk temp) panjangnya tepat satu karakter.
wizzwizz4

Ahh kamu benar! Saya akan mengatur ulang yang ini
Danwakeem

1
Apakah Anda pikir Anda bisa ikut tantangan saya? Analisis Kursi Anda
wizzwizz4

1
Ya itu akan bekerja tanpa header Anda hanya mendapatkan peringatan compiler @ edc65 saya pikir karena mengkompilasi dan menjalankannya tidak akan dianggap curang tetapi dalam penggunaan dunia nyata Anda harus selalu menyertakan header.
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

Cobalah online!

Bagaimana itu bekerja

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

Ide bagus (yang saya pinjam ...) untuk menggunakan XOR untuk ini
Luis Mendo

5

C, 64

Fungsi batal yang memodifikasi string pada tempatnya.

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

Uji: ideone


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

@ CoolGuy benar, tapi saya tidak suka global di dalam fungsi ... itu hanya saya
edc65

Bukankah ini 64 byte?
Downgoat

@ Doᴡɴɢᴏᴀᴛ ya itu .. terima kasih ..
edc65

5

R, 69 61 byte

Terima kasih kepada @Giuseppe karena telah memangkas beberapa byte tambahan:

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

Versi sebelumnya:

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

Ini adalah fungsi anonim. Pemakaian:

> 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))alih-alih rawkonversi, dan Anda juga bisa menyingkirkannya cat. Saya membuatnya sedikit kebiasaan untuk datang golf 1+ tahun jawaban Anda ...
Giuseppe

4

Serius, 31 byte (tidak bersaing)

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

Hex Dump:

a3a3962bbba352a396522bbc2c603bbda1755744be452858305758604dee6a

Cobalah secara Online

Jelaskan:

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

Saya baru menyadari spesifikasi mengatakan tidak ada spasi tambahan, tetapi tidak ada cara untuk menekan jalur baru di Serius output, jadi tidak ada solusi Serius.


1
Apa ESACREPPUesacrewolartinya
Downgoat

3
@ Doᴡɴɢᴏᴀᴛ MENDAPATKAN terbalik LOWERCASE terbalik
Mama Fun Roll

2
alfabet huruf besar terbalik yang diawali dengan alfabet huruf kecil terbalik
quintopia

4

Ruby, 40 byte

Solusi baru: Mencuri bit yang membalik sihir dari beberapa posting lain di sini:

->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*''}

9 byte off berkat @manatwork


uji coba:

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


3

𝔼𝕊𝕄𝕚𝕟 2, 12 karakter / 26 byte (tidak kompetitif)

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

Try it here (Firefox only).

Menambahkan fungsi transliterate setelah tantangan diposting.

Penjelasan

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

Saya pikir 𝔼𝕊𝕄𝕚𝕟 2 akan disebut 𝔼𝕊 ∞?
Downgoat

1
Tidak, saya memutuskan untuk menyimpannya untuk bahasa pelengkap (tapi berbeda) untuk 𝔼𝕊𝕄𝕚𝕟.
Mama Fun Roll

IIRC Ada papan tulis tebal 2.
Conor O'Brien

@ ՊՓԼՃՐՊՃՈԲՍԼ Sebut saja ESMax (dalam doublestruck).
mbomb007

3

CJam, 21 byte

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

Bukan solusi yang optimal ... namun ... Cobalah secara online

Sulit untuk menjelaskan tanpa mengelompokkan hal-hal, jadi di sini adalah penjelasan umum: mendapat input, mendorong alfabet huruf besar dua kali dan huruf kecil dua kali, memutar hal-hal di sekitar, menggabungkan string huruf besar dan kecil, membalik satu, dan menggunakan transliterasi (mirip dengan jawaban Retina).


Apakah ini menghasilkan baris baru yang tertinggal?
LegionMammal978

@ LegionMammal978 Seharusnya tidak kecuali aditsu mengubah cara stack dikeluarkan.
GamrCorps

@ LegionMammal978 Saya tidak.
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

Keluaran:

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

Memasukkan: SELECT text'...'s


SUNTING:

Masukan sebagai tabel:

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

SqlFiddleDemo

Keluaran:

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

Hei Lad2025, saya pikir ini lebih pendek dari 118, tapi saya bukan ahli dalam aturan penghitungan
t-clausen.dk

2

Python 3, 195 169 168 166 byte

Terima kasih kepada @TrangOul untuk -2 byte!

Bagaimana saya tidak melihat bahwa saya bisa bermain golf itu sebelumnya?

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

(agak) tidak diserang:

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

Cobalah di Ideone!


1
Anda dapat menyimpan 2 byte dengan menghapus bagian terluar []dari join.
Trang Oul

@ TrangOul benar-benar? Ini adalah pemahaman daftar jadi saya pikir ini perlu daftar atau Anda dapatkan generator object <genexpr> at..., tapi saya akan mengujinya
kucing

@TrangOul Nevermind, saya belajar sesuatu, terima kasih!
kucing

Setiap iterable [mengandung strnilai] dapat diteruskan ke join()fungsi.
Trang Oul

2

Python, 61 byte

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

Fungsi anonim. Pada huruf, apakah operasi pembalikan pada representasi bit dengan menambahkan 4, kemudian membalik lima bit terakhir, mirip dengan jawaban Javascript ETHproductions .


Baru saja menulis hal yang sama persis haha
sagiksp

2

Haskell, 119 104 byte

Disimpan 15 byte berkat @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

Pemakaian:

f "abcdefghijklmnopqrstuvwxyz"
"zyxwvutsrqponmlkjihgfedcba"

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

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

Penjelasan

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

Saya baru mengenal Haskell ... untuk pemrograman fungsional ... dan ke situs ini, dan saya tahu ada (banyak) jawaban yang lebih baik untuk pertanyaan ini, tetapi ikutilah saya.


Beberapa tips bermain golf: a) tidak perlu digunakan let. Mulai langsung dengan c=fromEnum. Gunakan (155-c x)dan (219-c x). c) Truedapat diganti dengan 1<2. - Kode gagal dimuat untuk saya dengan kesalahan "variabel tipe ambigius" untuk fungsi cdan s(ghci 7.10.2), tetapi ini dapat dengan mudah diperbaiki dengan f[]=""alih - alih f[]=[].
nimi

Terima kasih !, saya benar-benar bertanya-tanya apakah itu valid tanpa "biarkan", karena tidak berjalan langsung di GHC.
Telinga lembut

2

Perl 6 , 28 byte

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

Pemakaian:

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

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

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

Ketika saya menjalankan ini dikatakan: Warning: Use of "ord" without parentheses is ambiguous at (eval 8)[/System/Library/Perl/5.18/perl5db.pl:732] line 2.Saya tidak tahu tentang perl jadi apakah saya melakukan sesuatu yang salah? Bagaimana saya menjalankan ini?
Downgoat

@ Doᴡɴɢᴏᴀᴛ Jika Anda perhatikan dikatakan ini ditulis dalam Perl 6 Anda dapat pergi ke # perl6 di freenode dan mengetikm: my &swap = {S:g/\w/{chr $/.ord+4+^31}/}; say swap ('a'..'z').join
Brad Gilbert b2gills

Ah oke, rupanya saya tidak bisa membaca: P
Downgoat

@ Doᴡɴɢᴏᴀᴛ Saya menambahkan catatan bahwa Anda dapat mengujinya di # perl6 di 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);}}

Contoh penggunaan:

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

Mungkin bahasa yang paling umum digunakan terburuk dalam hal ukuran byte.



Saya tahu ini telah diposting sekitar 1,5 tahun yang lalu, tetapi Anda dapat bermain golf beberapa hal seperti ini: 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

Atau bahkan lebih pendek: 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 Anda juga dapat mengatur ulang perhitungan untuk meniadakan kebutuhan tanda kurung dengan membuat 90-(c-65)menjadi -c+65+90 dan 122-(‌​c-97)ke dalam -c+97+122, yang menyimpan masing-masing satu byte.
Zavada

2

Unix shell + tr + printf, 35 byte

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

Inilah Anda, jawaban kanonik dalam tr. Aku berpikir bagaimana bisa pertanyaan untuk transliterasi abjad pergi tanpa jawaban kanonik untuk tr ansliterate alfabet?

tr dengan sendirinya bahkan tidak melakukan "Halo, Dunia!" dan karena itu bukan bahasa pemrograman, jadi saya menandai jawabannya sebagai tidak bersaing [1] .

[1]: Edit: Sebenarnya, Unix shell adalah bahasa dan tr adalah pustaka standar . Terima kasih kepada Downgoat dan Digital Trauma karena membantu saya mengetahui hal ini.


3
Saya pikir boleh saja mengklaim shell atau bash sebagai bahasa, dan utilitas umum ( trada di coreutils) sebagai pustaka standar. Lihat banyak jawaban saya ;-)
Digital Trauma

1
Tapi itu tidak bekerja: tr: range-endpoints of 'Z-A' are in reverse collating sequence order. Saya pikir Anda harus melakukan sesuatu seperti tr A-Za-z $(printf %s {Z..A} {z..a})(dan ganti $( )dengan backticks)
Digital Trauma

@DigitalTrauma tetapi tidak semua orang memiliki printf pada sistem mereka.
user48538

7
Saya pikir Anda akan mengalami kesulitan menemukan sistem Unix yang tidak memiliki printf- setelah semua, yang ditentukan oleh Posix . Juga built-in di bash yang cukup di mana-mana hari ini. Bagaimanapun, memiliki sesuatu yang sudah diinstal pada sistem setiap orang bukanlah prasyarat untuk kode-golf - tidak semua orang memiliki CJam pada sistem mereka juga ;-)
Digital Trauma

1
Ruang antara }dan {diperlukan - jika tidak, ekspansi akan menjadi sepertiZz Zy Zx ... Za Yz ... Aa
Digital Trauma


1

MATL , 21 28 byte

Menggunakan versi 6.0.0 , yang lebih awal dari tantangan ini. Kode berjalan dalam oktaf.

jttk2Y2mXK)o31Z~4-cK(

Contoh

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

Penjelasan

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

Pendekatan lama, 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),'']

Saya mencoba f=@ismember, dan membuat rentang a=65:90variabel dan lakukan 32+adi ismember-call kedua . Semua ini memperpendek kode, tetapi akan menghasilkan program dan karenanya membutuhkan keduanya dispdan input.

Ini memberi:

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&

Kurangnya built-in sangat menyakitkan di sini, jadi kita harus menggunakan perhitungan kode ASCII yang lama.

Predikat brachylog_mainmengharapkan string kode karakter sebagai input dan tidak ada output, misalnyabrachylog_main(`Hello, World!`,_).

Penjelasan

_                                                                  § 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

Karena semua orang melakukan fungsi anonim:

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

(Terima kasih @ b2gills untuk tipnya)

Menggunakan bit yang sama membalik voodoo seperti beberapa posting lainnya. Saya tidak yakin apakah akan memasukkan deklarasi variabel / fungsi dalam jumlah byte, jadi saya lakukan kalau-kalau. Tanpa itu solusi ini hanya 34 byte.

Pemakaian:

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

Anda bisa menggunakannya *.trans(…)untuk membuatnya lebih pendek.
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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.