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


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.