Scambia l'alfabeto


48

In questa sfida, sarà "invertire" l'alfabeto o lo scambio a-zcon z-a. Questo è comunemente noto come il cifrario Atbash .

Poiché questa trasformazione rende l'output simile a una lingua straniera, il codice dovrà essere il più breve possibile.


Esempi

abcdefghijklmnopqrstuvwxyz
zyxwvutsrqponmlkjihgfedcba

Programming Puzzles & Code Golf
Kiltiznnrmt Kfaaovh & Xlwv Tlou

Hello, World!
Svool, Dliow!

specificazione

  • L'input può contenere più righe e sarà solo ASCII
  • Nessuno spazio bianco aggiuntivo deve essere aggiunto all'output
  • Il caso deve essere conservato

Classifica


Questo è quindi vince il codice più breve in byte


24
+1 per la giustificazione "Poiché questa trasformazione fa apparire l'output come una lingua straniera, il codice dovrà essere il più breve possibile."
gatto

11
Qualche curiosità: questo è Atbash , un codice noto vecchio quanto la Bibbia.
Jacob

6
"Poiché questa trasformazione fa apparire l'output come una lingua straniera, il tuo codice dovrà essere il più breve possibile." Che tipo di logica è questa?? Poiché la tua descrizione solleva più punti interrogativi che se fosse scritta in una lingua straniera, la tua risposta a questa domanda dovrebbe essere in un linguaggio naturale comprensibile e una certa verbosità è apprezzata.
Bart,

Kiltiznnrmt Kfaaovh e Xlwv Tlou dovrebbero essere il nuovo sito per "Programmare Trivials & Code Bowling" ...
Erik the Outgolfer

Perché non permetti spazi bianchi aggiuntivi? Ciò rende impossibile in alcune lingue che hanno sempre una nuova riga finale. Non riesco a vederlo aggiungere nulla alla sfida.
Esolanging Fruit

Risposte:


11

Pyth, 8 byte

XXzG)rG1

@xnor ha suggerito questo approccio più semplice sulla risposta Pyth di @ FryAmTheEggman, quindi l'ho tradotto in Pyth.

Questo utilizza il pratico comportamento di X(translate) quando vengono dati solo due argomenti: si traduce dal secondo argomento al secondo argomento invertito. Lo facciamo prima con l'alfabeto minuscolo ( G) e poi con le maiuscole G.


16

C, 59 byte

Ci scusiamo per aver richiamato nuovamente C, ma sono rimasto un po 'deluso nel vedere solo le funzioni C qui. Avevo l'impressione che OP stesse cercando un prodotto utilizzabile.

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

Compilato su Ubuntu 14.04 con un semplice:

cc swalpha.c

L'eseguibile risultante legge qualsiasi numero di righe dallo stdin e scrive il risultato su stdout.

Grazie a tanti altri manifesti per il trucco XOR.


11

CJam, 17 byte

Volevo aiutare GamrCorps a giocare a golf con la sua soluzione CJam, ma il risultato è stato così diverso che ho deciso di dare una risposta separata.

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

Provalo online.

Spiegazione

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
Bene, sono contento che stavi cercando di aiutare! Questa è la soluzione che stavo cercando di trovare, non riuscivo a capire lo XOR. Bel lavoro!
GamrCorps,

1
L'evidenziazione della sintassi di SE odia gli esolang.
Cyoce,

@Cyoce Probabilmente non hanno tempo; dato quante lingue ci sono in questo sito. Detto questo, CJam è probabilmente uno dei più facili, in quanto non si modifica da solo e ha una struttura abbastanza chiara. Mi piacerebbe vederli provare ad aggiungere l'evidenziazione della sintassi a un linguaggio auto-modificante come ///.
Esolanging Fruit

@ Challenger5 afaik, l'evidenziazione della sintassi utilizza solo la pretesa di Google, in tal caso dovrebbe essere aggiunto il supporto per vari esolang.
Martin Ender,

11

JavaScript (ES6), 69 67 byte

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

Utilizza la stessa strategia della mia risposta 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.

Maledici i tuoi nomi di proprietà incredibilmente lunghi, JS ...


1
+1 per menzionare i nomi di proprietà estremamente lunghi di JS. Il mio preferito è ancora il famigeratodocument.getElementById
Cyoce

2
@Cyoce Try document.getElementsByClassNameoppure, su Firefox e Chrome,document.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC
Ismael Miguel

Questo sembra essere solo 66 byte non 67
Downgoat

@ Doᴡɴɢᴏᴀᴛ Hai ragione, grazie!
ETHproductions

Sembra che manchi una parentesi di chiusura alla fine del codice golf.
Starbeamrainbowlabs

10

Retina , 17 14 13 byte

Codice:

\T`w`_dZ-Az-a

Spiegazione:

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

Questo fa alcune cose magiche e completa il compito.

Provalo qui .


2
Fortunatamente te che ho aggiunto di recente \. Sfortunatamente tu non mi sono ancora preoccupato di aggiungere classi di caratteri per lettere e classi di caratteri invertiti.
Martin Ender,

@ MartinBüttner Davvero molto fortunato, che ha quasi invalidato la mia risposta :)
Adnan,

Per riferimento, a partire da Retina 0.7.2 potresti fare \T`lL`RlRL.
Martin Ender,

9

Pyth, 10 9

uXGr;H)2z

Grazie a Jakube per aver salvato un byte con la nuova funzionalità di ;!

Test Suite

Una rapida spiegazione: ridurre a partire dall'input sui numeri 0 e 1. L'operazione da eseguire è tradurre l'alfabeto minuscolo con una r...0o r...1che sono rispettivamente le funzioni inferiore e superiore di Python, e poi invertite.


1
9 byte a causa di una nuova funzionalità (nemmeno un giorno fa):uXGr;H)2z
Jakube

5
Puoi aggiungere una spiegazione?
TanMath,

1
Non puoi usare Xcon l'alfabeto e poi con l'alfabeto maiuscolo?
xnor

1
@xnor XXzG)rG1? Sembra funzionare.
lirtosiast,

Oppure, forse X sugli alfabeti minuscoli e maiuscoli concatenati, quindi scambiare il caso? Probabilmente è più lungo, in realtà.
xnor

6

Julia, 74 61 47 byte

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

Questa è una funzione lambda che accetta una stringa e restituisce una stringa. Per chiamarlo, assegnarlo a una variabile.

Abbiniamo ogni lettera usando un'espressione regolare e sostituiamo ogni lettera con il carattere ASCII corrispondente a 31 XOR il codice ASCII per la lettera, meno 4.


Caspita, è molto elegante. Ricevo un avviso di deprecazione per $cui potresti voler aggiornare . Non sapevo che puoi usare una funzione in replace.
niczky12,

5

C, 150 129 byte

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

Questa funzione converte semplicemente char in int e aggiunge l'offset appropriato a int prima della stampa. So che non è il più breve ma non ho visto un'implementazione in C.

Esempio di utilizzo

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

AGGIORNAMENTO: abbreviato un nome variabile.


Benvenuto in Puzzle di programmazione e scambio di code golf stack! Questo è un ottimo approccio. Si potrebbe giocare a golf più facendo tutte le variabili (incluso temp) esattamente di un carattere.
wizzwizz4,

Ahh hai ragione! Regolerò questo
Danwakeem il

1
Pensi di poter provare la mia sfida? Analizza la tua sedia
wizzwizz4

1
Sì, funzionerà senza le intestazioni. Avrai appena ricevuto un avvertimento del compilatore @ edc65 Ho pensato che poiché si compila e gira non sarebbe considerato imbroglio ma nel mondo reale dovresti sempre includere le intestazioni.
Danwakeem,

1
107 byte:i,t;r(char*s){for(;i<strlen(s);i++){t=s[i]+25;t=t<116?180-t:244-t;isalpha(s[i])?putchar(t):putchar(s[i]);}}
Spikatrix il

5

Japt, 23 22 byte

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

Provalo online!

Come funziona

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

Bella idea (che ho preso in prestito ...) di usare XOR per questo
Luis Mendo il

5

C, 64

Una funzione nulla che modifica la stringa in atto.

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

Test: ideone


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

@CoolGuy giusto, ma non mi piace il globale all'interno di una funzione ... sono solo io
edc65

Non sono 64 byte?
Downgoat,

@ Doᴡɴɢᴏᴀᴛ sì lo è .. grazie ..
edc65

5

R, 69 61 byte

Grazie a @Giuseppe per aver alcuni byte extra:

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

Versione precedente:

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

Questa è una funzione anonima. 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.

1
intToUtf8(c(122:97,90:65))invece delle rawconversioni, e puoi anche sbarazzartene cat. Sto prendendo l'abitudine di venire a golf con le tue risposte di 1+ anni ...
Giuseppe,

4

Scherzi a parte, 31 byte (non concorrenti)

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

Dump esadecimale:

a3a3962bbba352a396522bbc2c603bbda1755744be452858305758604dee6a

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

Ho appena realizzato che le specifiche non dicono spazi bianchi aggiuntivi, ma non c'è modo di sopprimere le nuove righe finali nell'output Seriously, quindi non esiste una soluzione Seriously.


1
Cosa ESACREPPUesacrewolsignifica?
Downgoat,

3
@ Doᴡɴɢᴏᴀᴛ MAIUSCOLO invertito MAIUSCOLO invertito
Mama Fun Roll

2
l'alfabeto maiuscolo invertito anteposto all'alfabeto minuscolo invertito
quintopia

4

Rubino, 40 byte

Nuova soluzione: ruba quel pizzico di magia lanciando alcuni degli altri post qui:

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

Rubino, 55 46 byte

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

9 byte di sconto grazie a @manatwork


prova:

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


3

𝔼𝕊𝕄𝕚𝕟 2, 12 caratteri / 26 byte (non competitivo)

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

Try it here (Firefox only).

Aggiunta la funzione di traslitterazione dopo la pubblicazione della sfida.

Spiegazione

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

Pensavo che 𝔼𝕊𝕄𝕚𝕟 2 sarebbe stato chiamato 𝔼𝕊 ∞?
Downgoat,

1
No, ho deciso di salvarlo per una lingua complementare (ma diversa) per 𝔼𝕊𝕄𝕚𝕟.
Mama Fun Roll

IIRC C'è una lavagna in grassetto 2.
Conor O'Brien,

@ ՊՓԼՃՐՊՃՈԲՍԼ Chiamalo ESMax (in doppio clic).
mbomb007,

3

CJam, 21 byte

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

Non è una soluzione ottimale ... ancora ... Provalo online

È difficile da spiegare senza raggruppare le cose, quindi ecco una spiegazione generale: ottiene input, sposta due volte l'alfabeto maiuscolo e due volte minuscolo, ruota le cose intorno, combina stringhe maiuscole e minuscole, inverte una e usa la traslitterazione (simile alla risposta Retina).


Questo produce una nuova riga finale?
LegionMammal978,

@ LegionMammal978 Non dovrebbe, a meno che aditsu non abbia modificato il modo in cui viene emesso lo stack.
GamrCorps il

@ LegionMammal978 Io no.
Martin Ender,


3

PostgreSQL, 118 125 byte

SELECT s,TRANSLATE(s,t||UPPER(t),REVERSE(t)||REVERSE(UPPER(t)))
FROM(SELECT text'Programming Puzzles & Code Golf's,text'abcdefghijklmnopqrstuvwxyz't)r

SqlFiddleDemo

Produzione:

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

Ingresso: SELECT text'...'s


MODIFICARE:

Inserisci come tabella:

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

SqlFiddleDemo

Produzione:

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

Ehi lad2025, penso che questo sia più corto di 118, ma non sono un esperto delle regole di conteggio
t-clausen.dk

2

Python 3, 195 169 168 166 byte

Grazie a @TrangOul per -2 byte!

Come non ho visto che avrei potuto giocare a golf prima?

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) non golfato:

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

Provalo su Ideone!


1
È possibile salvare 2 byte rimuovendo il più esterno []da join.
Trang Oul,

@TrangOul davvero? È una comprensione dell'elenco, quindi ho pensato che dovesse essere un elenco, altrimenti lo otterrai generator object <genexpr> at..., ma lo proverò
cat

@TrangOul Nevermind, ho imparato qualcosa, grazie!
gatto

Qualsiasi iterabile [contenente strvalori] può essere passato alla join()funzione.
Trang Oul,

2

Python, 61 byte

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

Una funzione anonima. Sulle lettere, esegue l'operazione di inversione sulla rappresentazione dei bit aggiungendo 4, quindi capovolgendo gli ultimi cinque bit, in modo simile alla risposta Javascript di ETHproductions .


Ho appena scritto la stessa identica cosa ahah
sagiksp

2

Haskell, 119 104 byte

15 byte salvati grazie 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!"

Spiegazione

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

Sono nuovo di Haskell ... nella programmazione funzionale ... e nel sito, e so che ci sono (molte) risposte migliori a questa domanda, ma abbiate pazienza.


Alcuni consigli sul golf: a) non è necessario utilizzarli let. Inizia direttamente con c=fromEnum. Usa (155-c x)e (219-c x). c) Truepuò essere sostituito da 1<2. - Il codice non riesce a caricarmi con l'errore "variabile di tipo ambigua " per le funzioni ce s(ghci 7.10.2), ma questo può essere facilmente risolto con f[]=""invece di f[]=[].
nimi,

Grazie !, in realtà mi chiedevo se fosse valido senza "let", dal momento che non funziona direttamente su GHC.
orecchie soffici

2

Perl 6 , 28 byte

{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 eseguo questo dice: Warning: Use of "ord" without parentheses is ambiguous at (eval 8)[/System/Library/Perl/5.18/perl5db.pl:732] line 2.Non so nulla di Perl, quindi sto facendo qualcosa di sbagliato? Come eseguirò questo?
Downgoat,

@ Doᴡɴɢᴏᴀᴛ Se noti che dice che è scritto in Perl 6 Puoi andare a # perl6 su freenode e digitarem: my &swap = {S:g/\w/{chr $/.ord+4+^31}/}; say swap ('a'..'z').join
Brad Gilbert b2gills

Ah va bene, a quanto pare non riesco a leggere: P
Downgoat,

@ Doᴡɴɢᴏᴀᴛ Ho aggiunto una nota che puoi testarlo su # perl6 su freenode
Brad Gilbert b2gills

2

Java, 136 byte

void x(String i){for(char c:i.toCharArray()){if(Character.isLetter(c))c=c<91?(char)(90-(c-65)):(char)(122-(c-97));System.out.print(c);}}

Esempio di utilizzo:

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

Probabilmente il peggior linguaggio comunemente usato in termini di dimensione dei byte.



So che questo è stato pubblicato circa 1,5 anni fa, ma è possibile giocare a golf parecchie cose come questa: 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 byte )
Kevin Cruijssen

O ancora più breve: void y(String i){for(int c:i.getBytes())System.out.print((char)(c>65&c<91|c>96&c<123?c<91?90-(c-65):122-(c-97):c));}( 116 byte )
Kevin Cruijssen,

1
@KevinCruijssen È inoltre possibile riorganizzare i calcoli per annullare la necessità di parentesi trasformandoli 90-(c-65)in -c+65+90 e 122-(‌​c-97)in -c+97+122, che consente di salvare un byte ciascuno.
Zavada,

2

Unix shell + tr + printf, 35 byte

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

Ecco a voi una risposta canonica in tr. Ho pensato come poteva una domanda per traslitterare l'alfabeto senza una risposta canonica a tr ansliterate l'alfabeto?

tr da solo non fa nemmeno un "Ciao, mondo!" e come tale non è un linguaggio di programmazione, quindi ho contrassegnato la risposta come non competitiva [1] .

[1]: Modifica: attualmente la shell Unix è la lingua e tr è la libreria standard . Grazie a Downgoat e Digital Trauma per avermi aiutato a individuarlo.


3
Penso che trsia corretto rivendicare shell o bash come linguaggio e utilità comuni ( è in coreutils) come libreria standard. Vedi innumerevoli mie risposte ;-)
Digital Trauma

1
Ma non funziona: tr: range-endpoints of 'Z-A' are in reverse collating sequence order. Penso che devi fare qualcosa del genere tr A-Za-z $(printf %s {Z..A} {z..a})(e sostituirlo $( )con i backtick)
Digital Trauma

@DigitalTrauma ma non tutti hanno printf sul proprio sistema.
user48538

7
Penso che avresti difficoltà a trovare un sistema Unix che non ha printf- dopo tutto, è specificato da Posix . Inoltre è un built-in bash che è abbastanza onnipresente in questi giorni. Indipendentemente da ciò, avere qualcosa di preinstallato sul sistema di tutti non è un prerequisito per il code-golf - non tutti hanno CJam sul proprio sistema ;-)
Digital Trauma

1
Lo spazio tra }e {è necessario - altrimenti l'espansione diventa qualcosa di simileZz Zy Zx ... Za Yz ... Aa
Digital Trauma


1

MATL , 21 28 byte

Utilizza la versione 6.0.0 , che è precedente a questa sfida. Il codice viene eseguito in Octave.

jttk2Y2mXK)o31Z~4-cK(

Esempio

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

Spiegazione

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

Vecchio approccio, 28 byte

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

1

MATLAB, 61 byte

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

Ho provato f=@ismember, e rendendo l'intervallo a=65:90una variabile e fare 32+anella seconda ismemberchiamata. Tutto ciò ha abbreviato il codice, ma si tradurrebbe in un programma e quindi richiederebbe entrambi dispeinput .

Questo da:

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

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

1

Brachylog , 66 byte

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

La mancanza di built-in fa davvero male qui, quindi dobbiamo ricorrere a buoni vecchi calcoli di codici ASCII.

Il predicato brachylog_mainprevede una stringa di codici carattere come input e nessun output, ad esbrachylog_main(`Hello, World!`,_).

Spiegazione

_                                                                  § If the input is empty,
                                                                   § return true
                                                                   §
 |                                                                 § Else
                                                                   §
  hH(                                            ),[X]:"~c"w       § Print variable X which
                                                                   § depends on the head of
                                                                   § the input as a char code
                                                                   §
                                                            ,?b:0& § Recursive call on the
                                                                   § tail of the input
                                                                   §
     :64>:91<,77-H+78=X                                            § If H is capital, X =
                                                                   § 77 - H + 78
                       ;                                           § Else if H is non-cap, X=
                        H:96>:123<,109-H+110=X                     § 109 - H + 110
                                              ;                    § Else (not a letter)
                                               HX                  § H = X    

1

Perl 6, 40 39 byte

Poiché tutti gli altri svolgono funzioni anonime:

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

(Grazie @ b2gills per la segnalazione)

Utilizza lo stesso bit lanciando voodoo di alcuni degli altri post. Non ero sicuro di includere la dichiarazione variabile / funzione nel conteggio dei byte, quindi l'ho fatto per ogni evenienza. Senza di essa questa soluzione è di soli 34 byte.

Uso:

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

Puoi usarlo *.trans(…)per renderlo più breve.
Brad Gilbert b2gills il

1

Python 3, 164 159 byte

def f(t,a="abcdefghijklmnopqrstuvwxyz",b=""):
 for c in t:u=64<ord(c)<91;c=c.lower();c=a[::-1][a.index(c)] if c in a else c;b+=c.upper() if u else c
 return b
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.