Поменять местами алфавит


48

В этой проблемы, вы будете «задним ходом» алфавита или замены a-zс z-a. Это широко известный как Atbash шифром.

Поскольку это преобразование делает вывод похожим на некоторый иностранный язык, ваш код должен быть максимально коротким.


Примеры

abcdefghijklmnopqrstuvwxyz
zyxwvutsrqponmlkjihgfedcba

Programming Puzzles & Code Golf
Kiltiznnrmt Kfaaovh & Xlwv Tlou

Hello, World!
Svool, Dliow!

Спецификация

  • Входные данные могут содержать несколько строк и будут только в ASCII
  • Никаких дополнительных пробелов не должно быть добавлено к выводу
  • Дело должно быть сохранено

Leaderboard


Это поэтому выигрывает самый короткий код в байтах


24
+1 за обоснование «Поскольку это преобразование делает вывод похожим на некоторый иностранный язык, ваш код должен быть максимально коротким».
кошка

11
Немного мелочей: это Атбаш , известный шифр, столь же старый, как Библия.
Джейкоб

6
«Поскольку это преобразование делает вывод похожим на некоторый иностранный язык, ваш код должен быть максимально коротким». Что это за логика ?? Поскольку ваше описание вызывает столько же вопросительных знаков, как если бы оно было написано на каком-то иностранном языке, ваш ответ на этот вопрос должен быть понятным, естественным языком, и приветствуется некоторая многословность.
Барт

Kiltiznnrmt Kfaaovh & Xlwv Tlou должен стать новым сайтом для «Программирования тривиалов и боулинга кода» ...
Эрик Игрок в гольф

Почему вы не разрешаете дополнительные пробелы? Это делает невозможным в некоторых языках, которые всегда имеют завершающий перевод строки. Я не вижу, чтобы это добавляло что-то к проблеме
Esolanging Fruit

Ответы:


11

Pyth, 8 байт

XXzG)rG1

@xnor предложил этот более простой подход к ответу Pyth @ FryAmTheEggman, затем я перевел его на Pyth.

При этом используется удобное поведение X(translate), когда дано только два аргумента: оно переводится из второго аргумента в обратный второй аргумент. Мы делаем это сначала с помощью строчного алфавита ( G), а затем с прописной буквы G.


16

C 59 байтов

Извините за воспитывающим C снова, но я был немного разочарован , чтобы видеть только C функции здесь. У меня сложилось впечатление, что OP искала полезный продукт.

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

Скомпилирован на Ubuntu 14.04 с простым:

cc swalpha.c

Получившийся исполняемый файл читает любое количество строк из стандартного ввода и записывает результат в стандартный вывод.

Спасибо многим другим постерам за трюк с 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, вероятно, один из самых простых, так как он не является самоизменяющимся и имеет довольно четкую структуру. Мне бы хотелось, чтобы они попытались добавить подсветку синтаксиса к самоизменяющемуся языку, например ///.
Esolanging Fruit

@ Challenger5 afaik, подсветка синтаксиса использует только prettify от Google, там нужно добавить поддержку различных esolangs.
Мартин Эндер

11

JavaScript (ES6), 69 67 байт

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

Использует ту же стратегию, что и мой ответ Япта :

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 Попробуй document.getElementsByClassNameили, на Firefox и Chrome,document.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC
Исмаэль Мигель

Кажется, это всего 66 байтов, а не 67
Downgoat

@ Doᴡɴɢᴏᴀᴛ Ты прав насчет этого, спасибо!
ETHproductions

Похоже, вам не хватает закрывающей скобки в конце кода для игры в гольф.
starbeamrainbowlabs

10

Сетчатка , 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
К счастью, я недавно добавил \. Не повезло, что я еще не удосужился добавить классы символов для букв и обратные классы символов.
Мартин Эндер

@ MartinBüttner Очень повезло, что это почти лишило законной силы мой ответ :)
Аднан

Для справки, с Retina 0.7.2 вы можете это сделать \T`lL`RlRL.
Мартин Эндер

9

Пиф, 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

Юлия, 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]);}}

Эта функция просто конвертирует char в 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;
}

ОБНОВЛЕНИЕ: сокращено имя переменной.


Добро пожаловать в Программирование Пазлов и Code Golf Stack Exchange! Это очень хороший подход. Это может быть больше, если сделать все переменные (включая 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 22 байта

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

Хорошая идея (которую я позаимствовал ...) использовать для этого XOR
Луис Мендо

5

С, 64

Пустая функция, которая изменяет строку на месте.

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

Тест: идеон


1
c;t(char*p){for(;c=*p;)*p++=c>64&c<91|c>96&c<123?(c^31)-4:c;}
Спикатрикс

@CoolGuy верно, но мне не нравится глобальное внутри функции ... это только я
edc65

Разве это не 64 байта?
Вниз

@ Doᴡɴɢᴏᴀᴛ да, это так .. спасибо ..
edc65

5

R 69 69 байт

Спасибо @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 года ...
Джузеппе

4

Серьезно, 31 байт (не конкурирующий)

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

Шестнадцатеричный дамп:

a3a3962bbba352a396522bbc2c603bbda1755744be452858305758604dee6a

Попробуйте онлайн

Обосн:

úúû+╗                             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
обратный заглавный алфавит предшествует обратному
строчному

4

Рубин, 40 байт

Новое решение: украл эту магию из некоторых других постов здесь:

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

Рубин, 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.
Конор О'Брайен

@ ՊՓԼՃՐՊՃՈԲՍԼ Назовите это ESMax (двойным ударом).
mbomb007

3

CJam, 21 байт

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

Не оптимальное решение ... пока ... Попробуйте онлайн

Трудно объяснить без группировки вещей, поэтому здесь есть общее объяснение: получает ввод, толкает заглавные буквы алфавита дважды и строчные буквы дважды, вращает их вокруг, объединяет заглавные и строчные буквы, переворачивает одну и использует транслитерацию (аналогично ответу Retina).


Это выводит завершающий перевод строки?
LegionMammal978

@ LegionMammal978 Это не должно произойти, если aditsu не изменил способ вывода стека.
GamrCorps

@ LegionMammal978 Я не знаю.
Мартин Эндер

3

С (функция), 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      ║
╚══════════════════════════════════╩═════════════════════════════════╝

Эй, парень 2025, я думаю, что это короче 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()))

Сорта

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.
Транг Оул

@ TrangOul действительно? Это понимание списка, поэтому я подумал, что это должен быть список, иначе вы получите generator object <genexpr> at..., но я проверю его
кошка

@TrangOul Nevermind, я кое-что узнал, спасибо!
кот

Любое повторяемое [содержащее strзначения] может быть передано в join()функцию.
Транг Оул

2

Python, 61 байт

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

Анонимная функция. На буквах выполняет операцию реверса над битовым представлением, добавляя 4, затем переворачивая последние пять битов, аналогично ответу Javascript от 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

Я новичок в Haskell ... в функциональном программировании ... и на сайте, и я знаю, что есть (много) лучших ответов на этот вопрос, но терпите меня.


Некоторые советы по игре в гольф: а) не нужно использовать let. Начните прямо с c=fromEnum. Используйте (155-c x)и (219-c x). в) Trueможет быть заменен на 1<2. - Код не загружается для меня с ошибкой «переменная неоднозначного типа» для функций cи s(ghci 7.10.2), но это можно легко исправить с помощью f[]=""вместо f[]=[].
nimi

Спасибо! Мне действительно было интересно, было ли это допустимо без «let», так как он не работает непосредственно на 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, так что я делаю что-то не так? Как бы я это запустил?
Вниз

@ Doᴡɴɢᴏᴀᴛ Если вы заметили, что написано в Perl 6, вы можете перейти к # perl6 на freenode и набратьm: my &swap = {S:g/\w/{chr $/.ord+4+^31}/}; say swap ('a'..'z').join
Брэд Гилберт b2gills

Ах, хорошо, по-видимому, я не могу читать: P
Downgoat

@ Doᴡɴɢᴏᴀᴛ Я добавил примечание, что вы можете проверить его на # perl6 на freenode
Брэд Гилберт 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);}
Кевин Круйссен

Или даже короче: 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 байт )
Кевин Круйссен

1
@KevinCruijssen Вы также можете изменить порядок вычисления , чтобы свести на нет необходимость в скобках, сделав 90-(c-65)в -c+65+90 и 122-(‌​c-97)в -c+97+122, что экономит байт каждый.
Завада

2

Unix shell + tr + printf, 35 байт

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

Вот вам, канонический ответ в тр. Я думал , как бы вопрос транслитерации алфавита идти без канонического ответа на тр ansliterate алфавита?

Сам по себе tr даже не делает "Hello, World!" и как таковой не является языком программирования, поэтому я отметил ответ как неконкурентный [1] .

[1]: Edit: на самом деле, оболочка Unix - это язык, а tr - стандартная библиотека . Спасибо Downgoat и Digital Trauma за помощь в определении этого.


3
Я думаю, что можно утверждать shell или bash как язык, а общие утилиты ( trв coreutils) - как стандартную библиотеку. Смотрите бесчисленное множество моих ответов ;-)
Цифровая травма

1
Но это не работает tr: range-endpoints of 'Z-A' are in reverse collating sequence order. Я думаю, что вы должны сделать что-то вроде tr A-Za-z $(printf %s {Z..A} {z..a})(и заменить $( )обратными метками)
Digital Trauma

@DigitalTrauma, но не у всех есть printf в их системе.
user48538

7
Я думаю, вам будет довольно сложно найти систему Unix, которая не имеет printf- в конце концов, она определена Posix . Также это встроенный в Bash, который довольно распространен в наши дни. Независимо от того, что-то, предварительно установленное в каждой системе, не является обязательным условием для code-golf - не у всех также есть CJam в их системе ;-)
Digital Trauma

1
Пробел между }и {обязателен - иначе расширение становится чем-то вродеZz Zy Zx ... Za Yz ... Aa
Digital Trauma


1

MATL , 21 28 байт

Использует версию 6.0.0 , которая является более ранней, чем эта проблема. Код работает в Октаве.

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вызове. Все это сокращает код, но приводит к созданию программы и, следовательно, требует и того, dispи другого input.

Это дает:

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

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

1

Брахилог , 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(…)чтобы сделать его короче.
Брэд Гилберт b2gills

1

Python 3, 164 159 байт

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.