Поміняйте алфавітом


48

У цієї проблеми, ви будете «заднім ходом» алфавіту або заміни a-zз z-a. Це в народі відомий як цифер Атбаш .

Оскільки ця трансформація робить висновок схожим на якусь іноземну мову, ваш код повинен бути якомога коротшим.


Приклади

abcdefghijklmnopqrstuvwxyz
zyxwvutsrqponmlkjihgfedcba

Programming Puzzles & Code Golf
Kiltiznnrmt Kfaaovh & Xlwv Tlou

Hello, World!
Svool, Dliow!

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

  • Вхід може містити кілька рядків і буде лише ASCII
  • До виводу не слід додавати додаткові пробіли
  • Справа повинна бути збережена

Таблиця лідерів


Це тому найкоротший код в байтах виграє


24
+1 для обгрунтування "Оскільки ця трансформація робить висновок схожим на якусь іноземну мову, ваш код повинен бути якомога коротшим".
— кіт

11
Деякі дрібниці: це Атбаш , відомий шифр, старий як Біблія.
— Яків

6
"Оскільки ця трансформація робить висновок схожим на деяку іноземну мову, ваш код повинен бути якомога коротшим". Що це за логіка ?? Оскільки ваш опис викликає стільки ж запитальних запитань, як ніби він був написаний якоюсь іноземною мовою, ваша відповідь на це питання повинна бути зрозумілою природною мовою, і деяка багатослівність оцінена.
— Барт

Kiltiznnrmt Kfaaovh & Xlwv Tlou має стати новим сайтом для "Тривіалів програмування та код-боулінгу" ...
— Erik the Outgolfer

Чому ви не дозволите додатковий пробіл? Це робить неможливим у деяких мовах, які завжди мають зворотний новий рядок. Я не бачу, як це щось додає до виклику.
— Esolanging Fruit

Відповіді:


11

Pyth, 8 байт

XXzG)rG1

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

При цьому використовується зручна поведінка X(перекладати), коли дано лише два аргументи: він переводить з другого аргументу в зворотний другий аргумент. Ми робимо це спочатку з малої букви ( G), а потім з верхнього регістру G.


16

C, 59 байт

Вибачте за які виховують C знову, але я був трохи розчарований , щоб бачити тільки C функції тут. Я був під враженням, що ОП шукав корисний продукт.

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

Складено на Ubuntu 14.04 з простим:

cc swalpha.c

Отриманий виконуваний файл зчитує будь-яку кількість рядків зі 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, що виділяє, ненавидить езоланг.
— Кіос

@Cyoce Вони, мабуть, не встигають; враховуючи, скільки мов на цьому сайті. Однак, CJam, ймовірно, є одним із найпростіших, оскільки він не змінюється і має досить чітку структуру. Мені б хотілося, щоб вони намагалися додати виділення синтаксису до мови, що змінюється на зразок ///.
— Esolanging Fruit

@ Challenger5 afaik, підсвічування синтаксису просто використовує Google pretify, але підтримка різних езолангів повинна бути додана туди.
— Мартін Ендер

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 Спробуйте document.getElementsByClassNameабо, на Firefox та Chrome,document.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC
— Ісмаель Мігель

Здається, це лише 66 байт, а не 67
— Пуховик

@ 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

Дякую Якубе за збереження байта за допомогою нової функції ;!

Тестовий сюїт

Швидке пояснення: зменшити, починаючи з введення цифр 0 і 1. Операція, яку слід виконати, переводить алфавіт нижнього регістру з будь-якої r...0або r...1які є нижньою та верхньою функціями з python, відповідно, застосованої до неї, а потім перевернутою.


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

ОНОВЛЕННЯ: скорочена назва змінної.


Ласкаво просимо до головоломок програмування та обміну стека коду! Це дуже хороший підхід. Це може бути більше гольфу, зробивши всі змінні (включаючи 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;}

Тест: 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 байти?
— Пуховик

@ 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+ років на ваші відповіді ...
— Джузеппе

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означає?
— Пуховик

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 буде називатися 𝔼𝕊 ∞?
— Пуховик

1
Ні, я вирішив зберегти це для додаткової (але різної) мови для 𝔼𝕊𝕄𝕚𝕟.
— Mama Fun Roll

IIRC Є напівжирна дошка 2.
— Conor O'Brien

@ ՊՓԼՃՐՊՃՈԲՍԼ Назвіть це ESMax (у подвійному режимі).
— mbomb007

3

CJam, 21 байт

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

Не оптимальне рішення ... все ж ... Спробуйте в Інтернеті

Важко пояснити без групування речей, тому ось загальне пояснення: отримує введення, двічі натискає алфавіт з великим і нижчим регістром, обертає речі навколо, поєднує великі і малі рядки, перевертає один і використовує транслітерацію (подібно до відповіді на Retina).


Чи виводить це останній рядок?
— LegionMammal978

@ LegionMammal978 Це не повинно, якщо aditsu не змінив спосіб виведення стека.
— GamrCorps

@ LegionMammal978 Я ні.
— Мартін Ендер

3

C (функція), 50

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

Це спирається на всі три попередні відповідях на C, тож слід почитати @Ruud, @Danwakeem та @ edc65.

Ця функція змінює масив char на місці.

Я розумію, що введення функцій дозволяється, якщо прямо не заборонено в питанні.

Спробуйте в Інтернеті.


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

Пітон 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

Пітон, 61 байт

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

Анонімна функція. Що стосується літер, чи виконується операція реверсування бітового подання, додаючи 4, потім гортаючи останні п'ять біт, подібно до відповіді Javascript від ETHproductions .


Щойно написав саме те, що ха-ха
— sagiksp

2

Хаскелл, 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[]=[].
— німі

Дякую !, я насправді цікавився, чи дійсний він без "дозволу", оскільки він не працює безпосередньо на 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
— Пуховик

@ 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 + tr + printf, 35 байт

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

Ось ви, канонічна відповідь у тр. Я подумав, як питання про транслітерацію алфавіту може пройти без канонічної відповіді на тр анклітерацію алфавіту?

tr сам по собі навіть не робить "Привіт, світ!" і як така не мова програмування, тому я позначив відповідь як неконкурентну [1] .

[1]: Редагувати: Власне, оболонка Unix - це мова, а tr - стандартна бібліотека . Завдяки Downgoat та Digital Trauma за те, що допомогли мені помітити це.


3
Я вважаю, що добре заявити про shell або bash як мову, а загальні утиліти ( 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})(і замінити $( )заднім текстом)
— Digital Trauma

@DigitalTrauma, але не всі мають printf у своїй системі.
— user48538

7
Я думаю, вам було б досить важко знайти систему Unix, яка не має printf- зрештою, її вказав Posix . Також його вбудований в баш, який в ці дні є досить всюдисущим. Незважаючи на те, що попередньо встановлено щось у системі кожного - не обов’язкова умова коду-гольфу - не у всіх є також 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-виклик. Все це скоротило код, але призвело б до програми і, таким чином, вимагало і 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

Пітон 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.