Troque o alfabeto


48

Neste desafio, você vai ser "reverter" o alfabeto ou trocar a-zcom z-a. Isso é comumente conhecido como o código Atbash .

Como essa transformação faz com que a saída pareça um idioma estrangeiro, seu código precisará ser o mais curto possível.


Exemplos

abcdefghijklmnopqrstuvwxyz
zyxwvutsrqponmlkjihgfedcba

Programming Puzzles & Code Golf
Kiltiznnrmt Kfaaovh & Xlwv Tlou

Hello, World!
Svool, Dliow!

Especificação

  • A entrada pode conter várias linhas e será somente ASCII
  • Nenhum espaço em branco adicional deve ser adicionado à saída
  • O caso deve ser preservado

Entre os melhores


Este é o então o código mais curto em bytes ganha


24
+1 para a justificativa "Como essa transformação faz com que a saída pareça um idioma estrangeiro, seu código precisará ser o mais curto possível".
cat

11
Algumas curiosidades: este é o Atbash , uma cifra conhecida tão antiga quanto a Bíblia.
Jacob

6
"Como essa transformação faz com que a saída pareça um idioma estrangeiro, seu código precisará ser o mais curto possível". Que tipo de lógica é esta?? Como sua descrição gera tantos pontos de interrogação como se tivesse sido escrita em alguma língua estrangeira, sua resposta a essa pergunta deve estar em linguagem natural inteligível e é apreciada alguma verbosidade.
Bart

Kiltiznnrmt Kfaaovh & Xlwv Tlou deve ser o novo site para "Programação de trivialidades e boliche de código" ...
#

Por que você não permite espaços em branco adicionais? Isso torna impossível em alguns idiomas que sempre têm uma nova linha à direita. Não vejo isso acrescentando nada ao desafio.
Esolanging Fruit

Respostas:


11

Pitão, 8 bytes

XXzG)rG1

@xnor sugeriu essa abordagem mais simples na resposta Pyth de @ FryAmTheEggman, depois a traduzi para Pyth.

Isso usa o comportamento prático de X(translate) quando são fornecidos apenas dois argumentos: ele traduz do segundo argumento para o segundo argumento invertido. Fazemos isso primeiro com o alfabeto minúsculo ( G) e depois com maiúsculas G.


16

C, 59 bytes

Desculpe por trazer C novamente, mas fiquei um pouco decepcionado ao ver apenas as funções C aqui. Fiquei com a impressão de que o OP estava procurando um produto utilizável.

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

Compilado no Ubuntu 14.04 com um simples:

cc swalpha.c

O executável resultante lê qualquer número de linhas de stdin e grava o resultado em stdout.

Obrigado a muitos outros pôsteres pelo truque do XOR.


11

CJam, 17 bytes

Eu queria ajudar a GamrCorps a desenvolver sua solução CJam, mas o resultado foi tão diferente que decidi fazer uma resposta separada.

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

Experimente online.

Explicação

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
Bem, estou feliz que você estava tentando ajudar! Essa é a solução que eu estava tentando fazer, simplesmente não conseguia descobrir o XOR. Bom trabalho!
GamrCorps

11
O destaque da sintaxe do SE odeia esolangs.
Cyoce 5/01/16

@Cyoce Eles provavelmente não têm tempo; dado quantos idiomas existem neste site. Dito isto, o CJam é provavelmente um dos mais fáceis, pois não é auto-modificável e tem uma estrutura bastante clara. Eu gostaria que eles tentassem adicionar realce de sintaxe a uma linguagem auto-modificável como ///.
Esolanging Fruit

@ Challenger5 afaik, o destaque da sintaxe usa apenas o prettify do Google; o suporte a vários esolangs teria que ser adicionado lá.
Martin Ender

11

JavaScript (ES6), 69 67 bytes

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

Usa a mesma estratégia da minha resposta 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.

Amaldiçoe seus nomes de propriedades incrivelmente longos, JS ...


11
+1 por mencionar nomes de propriedades terrivelmente longos de JS. O meu favorito ainda é o infamedocument.getElementById
Cyoce

2
@Cyoce Experimente document.getElementsByClassNameou, no Firefox e Chrome, #document.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC
Ismael Miguel

Este parece ser apenas 66 bytes não 67
Downgoat

@ Doᴡɴɢᴏᴀᴛ Você está certo sobre isso, obrigado!
ETHproductions

Parece que você está perdendo um colchete no final do código do golfe.
starbeamrainbowlabs

10

Retina , 17 14 13 bytes

Código:

\T`w`_dZ-Az-a

Explicação:

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

Isso faz algumas coisas mágicas e completa a tarefa.

Experimente aqui .


2
Sorte sua que eu adicionei recentemente \. Infelizmente, não consegui adicionar classes de caracteres para letras e classes de caracteres invertidas ainda.
Martin Ender

@ MartinBüttner muita sorte, que quase invalidado minha resposta :)
Adnan

Para referência, a partir da Retina 0.7.2, você poderia fazer \T`lL`RlRL.
Martin Ender

9

Pitão, 10 9

uXGr;H)2z

Agradecemos a Jakube por salvar um byte com o novo recurso do ;!

Suíte de teste

Uma explicação rápida: reduza começando com a entrada sobre os números 0 e 1. A operação a ser executada é converter o alfabeto em minúsculas com uma r...0ou r...1quais são as funções inferior e superior do python, respectivamente, aplicadas a ele e depois revertidas.


11
9 bytes devido a um novo recurso (nem um dia):uXGr;H)2z
Jakube

5
Você pode adicionar uma explicação?
TanMath

11
Você não pode usar Xcom o alfabeto e depois com o alfabeto maiúsculo?
Xnor

11
@xnor XXzG)rG1? Isso parece funcionar.
lirtosiast

Ou talvez o X nos alfabetos minúsculo e maiúsculo concatenou e depois trocou de maiúsculas e minúsculas? Provavelmente é mais longo, na verdade.
Xnor

6

Julia, 74 61 47 bytes

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

Esta é uma função lambda que aceita uma string e retorna uma string. Para chamá-lo, atribua-o a uma variável.

Combinamos cada letra usando uma expressão regular e substituímos cada letra pelo caractere ASCII correspondente a 31 XOR o código ASCII da letra, menos 4.


Uau, isso é muito elegante. Recebo um aviso de descontinuação para $que você possa atualizar isso para . Não sabia que você pode usar uma função no replace.
precisa saber é o seguinte

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

Essa função apenas converte char para int e adiciona o deslocamento apropriado ao int antes da impressão. Eu sei que não é o mais curto, mas não vi uma implementação em C.

Exemplo de uso

#include<stdio.h>
#include<string.h>
#include<ctype.h>

void rev(char*s){int i,temp;for(i=0;i<strlen(s);i++){temp=s[i]+25;temp=temp<116?180-temp:244-temp;isalpha(s[i])?printf("%c",temp):printf("%c",s[i]);}}


int main(){
   char *s = "hello, there";
   rev(s);
   return 0;
}

UPDATE: reduziu o nome de uma variável.


Bem-vindo à Programação de quebra-cabeças e troca de pilha de código Golf! Essa é uma abordagem muito boa. Pode-se jogar mais, tornando todas as variáveis ​​(inclusive temp) exatamente com um caractere.
Wizzwizz4

Ahh, você está certo! Vou regolfar este
Danwakeem

11
Você acha que poderia tentar meu desafio? Analise sua cadeira
wizzwizz4

11
Sim, ele funcionará sem os cabeçalhos. Você recebe um aviso do compilador @ edc65. Imaginei que, uma vez que compila e executa, não seria considerado trapaça, mas no uso no mundo real, você sempre deve incluir os cabeçalhos.
Danwakeem 4/01/16

11
107 bytes: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

Japonês, 23 22 bytes

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

Experimente online!

Como funciona

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

Boa idéia (que eu emprestado ...) para usar XOR para este
Luis Mendo

5

C, 64

Uma função nula que modifica a string no lugar.

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

Teste: ideone


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

@CoolGuy certo, mas eu não gosto global dentro de uma função ... é só me
edc65

Isso não é de 64 bytes?
Downgoat

@ Doᴡɴɢᴏᴀᴛ sim é .. obrigado ..
edc65

5

R, 69 61 bytes

Agradecemos a @ Giuseppe por remover alguns bytes extras:

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

Versão anterior:

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

Esta é uma função anônima. Uso:

> 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.

11
intToUtf8(c(122:97,90:65))em vez das rawconversões, e você também pode se livrar catdelas. Eu estou fazendo um pouco de um hábito de vir de golfe 1+ ano velhas respostas de vocês ...
Giuseppe

4

Sério, 31 bytes (não concorrente)

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

Hex Dump:

a3a3962bbba352a396522bbc2c603bbda1755744be452858305758604dee6a

Experimente Online

Expl:

úúû+╗                             Put UPPERCASElowercase in reg0
     úRúûR+╝                      Put ESACREPPUesacrewol in reg1
            ,                     Fetch input.
             `             `Mεj   Map over the characters in string as list, joining result
              ;╜íu                Find 1-index of character in UPPERCASElowercase
                  W     0WX       If it is positive (present): 
                   D              Convert back to 0-index
                    ╛E            Look it up in ESACREPPUesacrewol
                      (X          Delete the original character.
                                  (Else just leave the original character unchanged.)

Acabei de perceber que as especificações dizem que não há espaço em branco adicional, mas não há como suprimir novas linhas à saída do Seriously, portanto, não há uma solução seriamente.


11
O que ESACREPPUesacrewolsignifica isso ?
Downgoat

3
@ Doᴡɴɢᴏᴀᴛ MAIÚSCULAS invertidas LOWERCASE invertidas
Mama Fun Roll

2
o alfabeto em maiúsculas colocado no início do alfabeto em minúsculas invertida revertida
quintopia

4

Ruby, 40 bytes

Nova solução: roubou esse pouco lançando mágica de alguns dos outros posts aqui:

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

Ruby, 55 46 bytes

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

9 bytes de desconto graças a @manatwork


execução de teste:

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


3

𝔼𝕊𝕄𝕚𝕟 2, 12 caracteres / 26 bytes (não competitivo)

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

Try it here (Firefox only).

Adicionada função transliterada após o lançamento do desafio.

Explicação

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

Eu pensei que 𝔼𝕊𝕄𝕚𝕟 2 seria chamado 𝔼𝕊 ∞?
Downgoat

11
Não, decidi guardar isso para um idioma complementar (mas diferente) para 𝔼𝕊𝕄𝕚𝕟.
Mama Fun Roll

IIRC Existe um quadro-negro em negrito 2.
Conor O'Brien

@ ՊՓԼՃՐՊՃՈԲՍԼ Chame-o de ESMax (em duplo golpe).
mbomb007

3

CJam, 21 bytes

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

Ainda não é uma solução ideal ... Experimente online

É difícil de explicar sem agrupar as coisas, então aqui está uma explicação geral: obtém entrada, empurra o alfabeto maiúsculo e minúsculo duas vezes, gira as coisas ao redor, combina cadeias maiúsculas e minúsculas, inverte uma e usa transliteração (semelhante à resposta da Retina).


Isso gera uma nova linha à direita?
precisa saber é o seguinte

@ LegionMammal978 Não deveria, a menos que o aditsu alterasse a saída da pilha.
GamrCorps

@ LegionMammal978 eu não.
Martin Ender


3

PostgreSQL, 118 125 bytes

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

Resultado:

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

Entrada: SELECT text'...'s


EDITAR:

Entrada como tabela:

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

SqlFiddleDemo

Resultado:

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

Hey lad2025, penso que este é menor do que 118, mas não sou especialista nas regras de contagem
t-clausen.dk

2

Python 3, 195 169 168 166 bytes

Graças a @TrangOul por -2 bytes!

Como eu não vi que eu poderia ter jogado isso antes?

x=__import__('string').ascii_letters;y,z=x[26:],x[:26];a,b=y[::-1],z[::-1];print(''.join(b[z.index(i)]if i in b else a[y.index(i)]if i in a else i for i in input()))

(sorta) ungolfed:

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

Experimente no Ideone!


11
Você pode salvar 2 bytes removendo o mais externo []de join.
Trang Oul

@TrangOul realmente? É uma compreensão da lista, então eu pensei que ele precisa ser uma lista ou então você começa generator object <genexpr> at..., mas vou testá-lo
gato

@TrangOul Nevermind, eu aprendi alguma coisa, obrigado!
gato

Qualquer iterável [contendo strvalores] pode ser passado para a join()função.
precisa saber é o seguinte

2

Python, 61 bytes

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

Uma função anônima. Nas letras, faz a operação de reversão na representação de bits adicionando 4 e depois invertendo os últimos cinco bits, semelhante à resposta Javascript da ETHproductions .


Assim escreveu exatamente a mesma coisa haha
sagiksp

2

Haskell, 119 104 bytes

Economizou 15 bytes graças a @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

Uso:

f "abcdefghijklmnopqrstuvwxyz"
"zyxwvutsrqponmlkjihgfedcba"

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

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

Explicação

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

Eu sou novo em Haskell ... em programação funcional ... e no site, e sei que existem (muitas) respostas melhores para essa pergunta, mas tenha paciência comigo.


Algumas dicas de golfe: a) não há necessidade de usar let. Comece diretamente com c=fromEnum. Use (155-c x)e (219-c x). c) Truepode ser substituído por 1<2. - O código falha ao carregar para mim o erro "variável do tipo ambigioso" para funções ce s(ghci 7.10.2), mas isso pode ser facilmente corrigido com, em f[]=""vez de f[]=[].
N

Obrigado !, eu estava realmente me perguntando se era válido sem "let", pois não é executado diretamente no GHC.
orelhas fofas

2

Perl 6 , 28 bytes

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

Uso:

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

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

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

Quando executo isso, ele diz: Warning: Use of "ord" without parentheses is ambiguous at (eval 8)[/System/Library/Perl/5.18/perl5db.pl:732] line 2.Não sei nada sobre perl, então estou fazendo algo errado? Como eu correria isso?
Downgoat

@ Doᴡɴɢᴏᴀᴛ Se você notar que diz que este é escrito em Perl 6 Você pode ir a # perl6 na freenode e tipom: my &swap = {S:g/\w/{chr $/.ord+4+^31}/}; say swap ('a'..'z').join
Brad Gilbert b2gills

Ah, tudo bem, aparentemente eu não sei ler: P
Downgoat 5/02/16

@ Doᴡɴɢᴏᴀᴛ acrescentei uma nota que você pode testá-lo em # perl6 na freenode
Brad Gilbert b2gills

2

Java, 136 bytes

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

Exemplo de uso:

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

Provavelmente o pior idioma comumente usado em termos de tamanho de bytes.



Eu sei que isso foi publicado há cerca de um ano e meio, mas você pode jogar golfe em algumas coisas como esta: 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

Ou ainda mais curto: 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 bytes )
Kevin Cruijssen

11
@KevinCruijssen Você também pode reorganizar os cálculos para negar a necessidade de parênteses, fazendo 90-(c-65)em -c+65+90 e 122-(‌​c-97)em -c+97+122, o que economiza um byte cada.
Zavada

2

Shell Unix + tr + printf, 35 bytes

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

Aqui está você, uma resposta canônica em tr. Eu pensei como poderia uma questão de transliteração do movimento alfabeto sem uma resposta canônica para tr ansliterate o alfabeto?

O tr por si só nem faz um "Olá, mundo!" e como tal não é uma linguagem de programação, marquei a resposta como não-competitiva [1] .

[1]: Edit: Na verdade, o shell Unix é a linguagem e tr é a biblioteca padrão . Agradeço ao Downgoat e ao Digital Trauma por me ajudarem a descobrir isso.


3
Eu acho que é bom reivindicar shell ou bash como uma linguagem e utilitários comuns ( trestá no coreutils) como a biblioteca padrão. Veja inúmeras das minhas respostas ;-)
Digital Trauma

11
Mas ele não funciona: tr: range-endpoints of 'Z-A' are in reverse collating sequence order. Eu acho que você tem que fazer algo assim tr A-Za-z $(printf %s {Z..A} {z..a})(e substituir $( )com acentos graves)
Digital Trauma

@DigitalTrauma, mas nem todo mundo tem printf em seu sistema.
user48538

7
Eu acho que você teria muita dificuldade em encontrar um sistema Unix que não possui printf- afinal, é especificado pelo Posix . Também é um builtin no bash que é bastante onipresente nos dias de hoje. Independentemente disso, ter algo pré-instalado no sistema de todos não é um pré-requisito para o código-golf - nem todos têm CJam em seu sistema, quer ;-)
Digital Trauma

11
O espaço entre }e {é necessário - caso contrário, a expansão se tornará algo parecido comZz Zy Zx ... Za Yz ... Aa
Digital Trauma


1

MATL , 21 28 bytes

Usa a versão 6.0.0 , que é anterior a esse desafio. O código é executado em oitava.

jttk2Y2mXK)o31Z~4-cK(

Exemplo

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

Explicação

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

Abordagem antiga, 28 bytes

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

1

MATLAB, 61 bytes

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

Eu tentei f=@ismember, e tornando o intervalo a=65:90uma variável e o faço 32+ana segunda ismemberchamada. Tudo isso encurtou o código, mas resultaria em um programa e, portanto, exigem tanto dispe input.

Isto dá:

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

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

1

Braquilog , 66 bytes

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

A falta de built-ins realmente dói aqui, então temos que recorrer a bons cálculos antigos de códigos ASCII.

O predicado brachylog_mainespera que uma sequência de códigos de caracteres seja entrada e não saída, por exemplobrachylog_main(`Hello, World!`,_).

Explicação

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

Como todo mundo está executando funções anônimas:

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

(Obrigado @ b2gills pela dica)

Usa o mesmo trecho de vodu que alguns dos outros posts. Eu não tinha certeza se incluiria a declaração de variável / função na contagem de bytes, por isso fiz apenas por precaução. Sem ela, esta solução tem apenas 34 bytes.

Uso:

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

Você pode usar *.trans(…)para torná-lo mais curto.
Brad Gilbert b2gills

1

Python 3, 164 159 bytes

def f(t,a="abcdefghijklmnopqrstuvwxyz",b=""):
 for c in t:u=64<ord(c)<91;c=c.lower();c=a[::-1][a.index(c)] if c in a else c;b+=c.upper() if u else c
 return b
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.