Atbash Self Palindromes


27

Considera la trasformazione di Atbash :

A|B|C|D|E|F|G|H|I|J|K|L|M
Z|Y|X|W|V|U|T|S|R|Q|P|O|N

Dove A ⇔ Z e L ⇔ O, ad es. Esiste una proprietà interessante che alcune parole condividono. Quando alcune stringhe vengono tradotte nel loro equivalente atbash, detta traduzione è la parola originale invertita. Chiamo questi Atbash Self Palindromes .

Ad esempio, traduciamo WIZARD :

W → D
I → R
Z → A
A → Z
R → I
D → W

Il risultato è DRAZIW , che è WIZARD invertito. Pertanto, WIZARD è un auto-palindromo atbash.

Obiettivo Data una stringa di caratteri ASCII stampabili, genera o restituisce un valore di verità se quella stringa è un auto-palindromo atbash e un valore di falsa in caso contrario. (Ciò avviene tramite STDIN, l'equivalente più vicino, l'input funzionale, ecc. Se la tua lingua non è in grado di eseguire nessuna di queste operazioni, considera la possibilità di scegliere una lingua diversa per codificare l'input.) Dovresti fare questo senza distinzione tra maiuscole e minuscole. Se l'input è un palindromo e non è influenzato dalla sequenza di atbash, dovresti comunque produrre true, poiché un palindromo + stesso è un palindromo. Questo è un , quindi vince il programma più breve in byte.

Casi test

"Input" => true, false

"WIZARD" => true
"Wizard" => true // case doesn't matter
"wIzArD" => true 
"W I Z A R D" => true
"W IZ ARD" => false // the atbash of this is D RA ZIW, which is not a palindrome of W IZ ARD
"ABCXYZ" => true // ZYXCBA
"345 09%" => false // is not a palindrome
"ev" => true // ve
"AZGDFSSF IJHSDFIU HFIA" => false
"Zyba" => true
"-AZ" => false // -ZA is not a reverse of -AZ
"Tree vvig" => true // Givv eert 
"$%%$" => true // palindrome
"A$&$z" => true // z$&$A

Classifica

Lo snippet di stack nella parte inferiore di questo post genera il catalogo dalle risposte a) come elenco della soluzione più breve per lingua eb) come classifica generale.

Per assicurarti che la tua risposta venga visualizzata, ti preghiamo di iniziare la risposta con un titolo, utilizzando il seguente modello Markdown:

## Language Name, N bytes

dov'è Nla dimensione del tuo invio. Se si migliora il punteggio, è possibile mantenere i vecchi punteggi nel titolo, colpendoli. Per esempio:

## Ruby, <s>104</s> <s>101</s> 96 bytes

Se si desidera includere più numeri nell'intestazione (ad es. Perché il punteggio è la somma di due file o si desidera elencare separatamente le penalità del flag dell'interprete), assicurarsi che il punteggio effettivo sia l' ultimo numero nell'intestazione:

## Perl, 43 + 2 (-p flag) = 45 bytes

Puoi anche rendere il nome della lingua un collegamento che verrà quindi visualizzato nello snippet:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


Correlati: scambia l'alfabeto .
nicael,

4
AtBash non è in realtà una novità. È la trasformazione della lettera ebraica di Kabala (misticismo ebraico) equivalente a questa. Poiché l'ebraico è scritto solo con i wovel, qualsiasi stringa di lettere può essere letta inserendo wovels casuali. ATB (a) SH è un mnemonico per trasformare Alef (prima lettera ebraica) in Tav (ultimo), Beis (secondo) in SHin (penultimo).
Adám,

1
Considerare di dare -1000000 punti se il codice della soluzione di qualcuno è esso stesso un atbash self palindrome? : p
kojiro,

3
@kojiro Non banale al contrario di code {Comment-symbol}{Atbash'ed Comment-symbol} Atbash'ed code...
Adám,

1
@ mbomb007 Ho detto che potrei offrire una taglia se venisse trovato un tale programma non banale
Conor O'Brien,

Risposte:


8

RX , 9 8 byte

Fortemente ispirato da Retina, l'ho realizzato pochi giorni fa. Codice:

prR`w$rM

Spiegazione:

prR`w$rM

p         # Start pattern
 r        # Reversed lowercase alphabet
  R       # Reversed uppercase alphabet
   `      # Next pattern
    w     # Equivalent to a-zA-Z_0-9 (word pattern)
     $    # End pattern and compute regex
      r   # Reverse input
       M  # Change mode to Match mode, compares the atbash string with the reversed string.

Provalo qui !


Quindi, come funziona effettivamente la lingua stessa? È una sorta di linguaggio di elaborazione delle stringhe basato su stack? Questo è davvero impressionante, ma per quanto ne so non c'è ancora modo di fare un ciclo nel linguaggio, il che significa che è altamente improbabile che questo soddisfi i nostri standard di un linguaggio di programmazione in questa fase.
Martin Ender

@ MartinBüttner Questa lingua si basa principalmente sull'elaborazione dell'input utilizzando un modello di stack. Non usa numeri interi (e probabilmente non lo farà mai). Ho implementato un ciclo, ma quella versione non è stata ancora rilasciata.
Adnan,

@Martin Regexes sono in grado di testare la primalità per conto proprio, quindi sono abbastanza sicuro che questo sia valido.
Lirtosiast

@ThomasKwa Per quanto posso vedere, l'interprete non usa espressioni regolari effettive.
Martin Ender,

@ Martin Hmm, hai ragione.
Lirtosiast,


6

Julia, 96 byte

s->join([get(Dict(zip([u=map(Char,65:90);],reverse(u))),c,c)for c=(S=uppercase(s))])==reverse(S)

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

Ungolfed:

function f(s::AbstractString)
    # Get all of the uppercase letters A-Z
    u = map(Char, 65:90)

    # Create a dictionary for the transformation
    D = Dict(zip(u, reverse(u)))

    # Uppercase the input
    S = uppercase(s)

    return join([get(D, c, c) for c in S]) == reverse(S)
end

5

Utilità Bash + Linux, 56

tr a-z `printf %s {z..a}`<<<${1,,}|cmp - <(rev<<<${1,,})

Emette la stringa vuota per Truthy e qualcosa di simile - /dev/fd/63 differ: byte 1, line 1per Falsey. Se ciò non è accettabile, possiamo aggiungere -s3 byte aggiuntivi e utilizzare i codici di ritorno Unix standard 0 per Success (Truthy) e 1 per Failure (Falsey).


5

Retina , 44 byte

$
¶$_
T`lL`Ro`.+$
+`(¶.*)(.)
$2$1
i`^(.+)\1$

Stampe 1o 0. Il conteggio dei byte presuppone che il file sia codificato come ISO 8859-1.

Provalo online!

Questa risposta è stata in gran parte ispirata dalla risposta sed di DigitalTrauma, ma suppongo che in primo luogo non ci siano molti approcci a questa sfida.

Spiegazione

Ogni volta che vedi a , la prima cosa che Retina fa dopo aver diviso il codice in righe è di sostituire tutte quelle corse con avanzamenti di riga. Ciò consente l'inclusione di avanzamenti di riga per un singolo byte anche se gli avanzamenti di riga sono il separatore di fase di Retina.

$
¶$_

Iniziamo duplicando l'input. Abbiniamo la fine dell'input $e inseriamo un avanzamento riga insieme all'input stesso (usando $_).

T`lL`Ro`.+$

Una fase di traslitterazione. Cominciamo con la regex: .+$. Corrisponde alla seconda copia dell'input (assicurandosi che la corrispondenza vada fino alla fine della stringa). Quindi solo i caratteri nella seconda copia verranno traslitterati. La stessa traslitterazione si avvale di alcune funzionalità molto recenti. le Lsono classi di caratteri per le lettere maiuscole e minuscole, rispettivamente. ofa riferimento all'altro set di caratteri della traslitterazione e la Rinverte. Quindi i due set di caratteri si espandono in:

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba

Noterai che questo scambia il caso mentre esegui il codice Atbash, ma faremo comunque il confronto finale senza distinzione di casi.

+`(¶.*)(.)
$2$1

Ora invertiamo la seconda copia. Sfortunatamente, Retina non ha ancora un modo conveniente per farlo, quindi dovremo spostare un personaggio dalla fine al fronte alla volta. Questo viene fatto riutilizzando il separatore di avanzamento riga come marcatore di cui la parte non è stata ancora invertita. Abbiniamo quella parte ma catturiamo l'ultimo personaggio separatamente. Quel personaggio va di fronte e il resto è invariato. Questo +dice a Retina di farlo ripetutamente fino a quando non è più possibile (perché è alla fine della stringa).

i`^(.+)\1$

Infine, controlliamo se le due stringhe sono uguali. La irende il modello caso-insensitive - convenientemente, in NET, questo significa che backreference sono case-insensitive. Potresti notare che non abbiamo più un separatore tra l'input originale e la copia modificata. Non ne abbiamo bisogno, però, perché hanno la stessa lunghezza e se la stringa ora consiste esattamente della stessa stringa due volte (fino al caso), allora devono essere la stringa originale e quella modificata. Se ti stai chiedendo cosa è successo all'avanzamento di riga finale che abbiamo usato come marker, è ancora lì, ma in molti regex i sapori $corrispondono anche prima dell'ultimo carattere della stringa se quel carattere è un avanzamento di riga.

Poiché questa fase consiste solo in una singola riga, viene considerata una fase della partita, che conta il numero di partite. Se l'input è un palindromo di Atbash, avremo esattamente una corrispondenza e l'output è 1. In caso contrario, questa regex non corrisponderà e l'output sarà 0.


Immagino sia meglio avere le linefeed come separatori di palcoscenici e le cavallette siano letterali che viceversa.
Conor O'Brien,

@ CᴏɴᴏʀO'Bʀɪᴇɴ Per comodità, puoi anche inserire avanzamenti di riga per sequenze di escape, \n in regex e $nin sostituzione, ma sono byte sprecati per il golf. ;)
Martin Ender

5

GNU Sed, 105

s/.*/\l&/
h
y/abcdefghijklmnopqrstuvwxyz/zyxwvutsrqponmlkjihgfedcba/
G
:
s/\(.\)\n\1/\n/
t
/^.$/{c1
q}
c0

Uscite 1 per verità e 0 per falsità.

Ho provato a farlo in Retina, ma non sono riuscito a capire come salvare la stringa prima della traslitterazione Atbash per il confronto inverso con after. Forse c'è un modo migliore.

Il ycomando di traslitterazione di Sed lascia molto a desiderare.


Sì, "conservare" le cose è ancora ingombrante in Retina. Dovresti duplicare la stringa, quindi traslitterare e invertire solo una copia. Voglio aggiungere una sorta di funzione di ramificazione / biforcazione in futuro, ma non sono ancora del tutto sicuro dei dettagli.
Martin Ender,

Ah, penso di vedere - ho provato a fare qualcosa di simile separando le stringhe prima e dopo con i due punti. Sono caduto con la regex alla fine del T- stavo assumendo che si applicasse a ciascun personaggio a sua volta, ma se la mia comprensione è giusta, si applica a tutto lo spazio del pattern, che è molto più utile
Digital Trauma

1
La regex in T viene applicata alla stringa di input. La traslitterazione è l'unica eseguita all'interno delle corrispondenze di quella regex e tutto ciò che non ha eguali viene lasciato invariato. Per impostazione predefinita regex [\s\S]+lo omette, stai traslitterando tutto.
Martin Ender


Dato che è GNU sed, puoi salvare un byte scambiando -rflag per le barre rovesciate in \(e\) . Sono d'accordo con te sul ycomando!
Toby Speight,

4

𝔼𝕊𝕄𝕚𝕟, 15 caratteri / 30 byte

ïþ)Ī(ᶐ,ᶐᴙ)ᴙ≔ïþ)

Try it here (Firefox only).

Spiegazione

ïþ)Ī(ᶐ,ᶐᴙ)ᴙ≔ïþ) // implicit: ï=input, ᶐ=A-Z
ïþ)             // ï.toUpperCase()
   Ī(ᶐ,ᶐᴙ)ᴙ     // transliterate input from A-Z to Z-A, then reverse
           ≔ïþ) // check if that's still equal to ï.toUpperCase()
                // implicit output

4

Tra parentesi, 658 byte

((()()())(()(((()))))((()()((())))))((()()())(()(((())))()()())((())()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()))((()()())(()(((())))())((()())((()(((())))()()))((()()()())((()(())(()))(()(((())))()())(()((()))))(()((())))((()((()))())((()(())(())())((()(()))(()(((())))()()())((()(()()))((())()()()()()()()()()()()()()()()()()()()()()()()()())((()(()()))((()(()())())((()((()))(()))(()(((())))()())))(()(((())))()()())))))((()(((())))())((()((()))()())(()(((())))()())))))))((()(())(()))((()()()(()))((()()()()())(()(((()))))))((()(((())))())((()()()()())(()(((())))))))

Funziona solo per tutti i tappi senza spazi bianchi in questo momento, usando questa versione modificata dello script in modo che supporti la lettura da stdin:

#!/usr/bin/env python
from collections import defaultdict
from itertools import izip
import copy
import operator
import os
import sys

# map from paren strings to english names
# for the predefined symbols (lambda, etc)
to_english = defaultdict(lambda:None,\
    {'()': 'lambda',
     '()()': 'define',
     '(())': 'plus',
     '(()())': 'minus',
     '()(())': 'mult',
     '(())()': 'div',
     '()()()': 'if',
     '((()))': 'empty',
     '()()()()': 'charsof',
     '()()(())': 'reverse',
     '()(())()': 'LE',
     '()(()())': 'not',
     '(()())()': 'intofchar',
     '()((()))': 'readline',
     '((()))()': 'cons',
     '(())(())': 'equal',
     '((()))(())': 'car',
     '((()))()()': 'cdr',
     '(())(())()': 'char',
     '(())()(())': 'string'})

# map from english to parenthetic
to_scheme = defaultdict(lambda:None)
for k,v in to_english.iteritems():
    to_scheme[v] = k

def Error(errorString = 'unmatched parens', debug_mode = True):
    if debug_mode:
        print "Error: " + errorString
        sys.exit()
    else:
        raise Exception('paren mismatch')

def bracketsMatch(chars):
    """Returns False if any parentheses in `chars` are not matched
    properly. Returns True otherwise.
    """
    level = 0
    for p in chars:
        if p == '(':
            level += 1
        elif p == ')':
            level -= 1
        if level < 0:
            return False    
    return level == 0

def get_exprs(chars):
    """Returns a list of character sequences such that for each sequence,
    the first and last parenthesis match.
    For example, "(())()()" would be split into ["(())", "()", "()"]
    """
    level = 0
    current = []
    for p in chars:
        if p == '(' or p == ')':
            current.append(p)
        if p == '(':
            level += 1
        elif p == ')':
            level -= 1
        if level == 0:
            yield current
            current = []

## built-in functions ##
def builtin_accumulate(init, accumulate, environment, params):
    """Helper function that handles common logic for builtin functions.
    Given an initial value, and a two-parameter function, the environment, and
    a list of params to reduce, this function will reduce [init] + params using
    the accumulate function and finally returns the resulting value.
    """
    result = init
    for param in params:
        value = interpret(param, environment)
        try: result = accumulate(result, value)
        except: Error(str(value) + ' is not the correct type')
    return result

def builtin_plus(environment, params):
    if len(params) >= 1:
        return builtin_accumulate(interpret(params[0], environment), operator.add, environment, params[1:])
    else:
        return 0.0

def builtin_minus(environment, params):
    if len(params) == 0:
        Error('subtraction requires at least 1 param')
    return builtin_accumulate(interpret(params[0], environment), operator.sub, environment, params[1:])

def builtin_mult(environment, params):
    return builtin_accumulate(1.0, operator.mul, environment, params)

def builtin_div(environment, params):
    if len(params) == 0:
        Error('division requires at least 1 param')
    return builtin_accumulate(interpret(params[0], environment), operator.div, environment, params[1:])

def builtin_LE(environment, params):
    return interpret(params[0], environment) <= interpret(params[1], environment)

def builtin_lambda(environment, params):
    bodies = [body for body in params[1:]]
    params = params[0][1]
    if len(bodies) == 0:
        Error("a function had no body")
    for kind, name in params:
        if kind != 'symbol':
            Error('lambda must have only symbols as arguments')
    def ret(old_environment, arguments):
        #print bodies
        try:
            # create new environment based on args
            environment = copy.copy(old_environment)
            for param, arg in izip(params, arguments):
                environment[param[1]] = interpret(arg, old_environment)
            # evaluate the function bodies using the new environment
            return interpret_trees(bodies, environment, False)
        except:
            Error("Error evaluating a function")
    return ret

def builtin_equal(environment, params):
    for param1, param2 in izip(params[:-1], params[1:]):
        if interpret(param1, environment) != interpret(param2, environment):
            return False
    return True

def builtin_if(environment, params):
    if len(params) != 3:
        Error("'if' takes in exactly 3 params")    
    if interpret(params[0], environment):
        return interpret(params[1], environment)
    return interpret(params[2], environment)

def builtin_not(environment, params):
    return False if interpret(params[0], environment) else True

def builtin_cons(environment, params):
    return (interpret(params[0], environment), interpret(params[1], environment))

def builtin_car(environment, params):
    result = interpret(params[0], environment)
    if not isinstance(result, tuple):
        Error("car must only be called on tuples")
    return result[0]

def builtin_cdr(environment, params):
    result = interpret(params[0], environment)
    if not isinstance(result, tuple):
        Error("cdr must only be called on tuples")
    return result[1]

def builtin_char(environment, params):
    result = interpret(params[0], environment)
    if result != int(result):
        Error("char must only be called on integers")
    return chr(int(result))

def builtin_intofchar(environment, params):
    result = interpret(params[0], environment)
    result = ord(result)
    return result

def builtin_string(environment, params):
    result = ''
    cur = interpret(params[0], environment)
    while cur != ():
        if not isinstance(cur, tuple) or not isinstance(cur[1], tuple):
            Error("string only works on linked lists")
        result += cur[0]
        cur = cur[1]
    return result

def unmakelinked(llist):
    result = ()
    while llist != ():
        if not isinstance(llist, tuple) or not isinstance(llist[1], tuple):
            Error("only works on linked lists")
        result += (llist[0],)
        llist = llist[1]
    return result

def makelinked(tup):
    result = ()
    while tup != ():
        result = (tup[-1],result)
        tup = tup[:-1]
    return result

def builtin_reverse(environment, params):
    result = interpret(params[0], environment)
    result = makelinked(unmakelinked(result)[::-1])
    return result

def builtin_charsof(environment, params):
    result = interpret(params[0], environment)
    result = makelinked(tuple(result))
    return result

def builtin_readline(environment, params):
    result = raw_input()
    return result

# define the default (top-level) scope
default_environment = \
    {to_scheme['plus']: builtin_plus,
     to_scheme['minus']: builtin_minus,
     to_scheme['mult']: builtin_mult,
     to_scheme['div']: builtin_div,
     to_scheme['lambda']: builtin_lambda,
     to_scheme['if']: builtin_if,
     to_scheme['equal']: builtin_equal,
     to_scheme['LE']: builtin_LE,
     to_scheme['not']: builtin_not,
     to_scheme['empty']: (),
     to_scheme['car']: builtin_car,
     to_scheme['cdr']: builtin_cdr,
     to_scheme['cons']: builtin_cons,
     to_scheme['char']: builtin_char,
     to_scheme['string']: builtin_string,
     to_scheme['readline']: builtin_readline,
     to_scheme['charsof']: builtin_charsof,
     to_scheme['reverse']: builtin_reverse,
     to_scheme['intofchar']: builtin_intofchar}

# parse the tokens into an AST
def parse(tokens):
    """Accepts a list of parentheses and returns a list of ASTs.
    Each AST is a pair (type, value).
    If type is 'symbol', value will be the paren sequence corresponding
    to the symbol.
    If type is 'int', value will be a float that is equal to an int.
    If type is expr, value will be a list of ASTs.
    """
    # check for errors
    if not bracketsMatch(tokens):
        Error('paren mismatch')
    # to return - a list of exprs
    exprs = []
    for expr in get_exprs(tokens):
        # check for errors
        if len(expr) < 2:
            Error('too few tokens in: ' + ''.join(expr))
        elif expr[0] != '(' or expr[-1] != ')':
            Error('expression found without () as wrapper')
        # pop off starting and ending ()s
        expr = expr[1:-1]
        # symbol
        if expr[:2] == ['(', ')'] and len(expr) > 2:
            exprs.append(('symbol', ''.join(expr[2:])))
        # integer
        elif expr[:4] == ['(', '(', ')', ')'] and len(expr) >= 4:
            exprs.append(('num', expr[4:].count('(')))
        # expr
        else:
            exprs.append(('expr', parse(expr)))
    return exprs

def interpret(tree, environment):
    """Interpret a single tree (may not be a define) and return the result"""
    kind, value = tree
    if kind == 'num':
        return float(value)
    elif kind == 'symbol':
        if value in environment:
            return environment[value]
        else:
            Error('Unresolved symbol - ' + value)
    elif kind == 'expr':
        function = interpret(value[0], environment)
        if not hasattr(function, '__call__'):
            Error('Symbol "'+value[0]+'" is not a function.')
        return function(environment, value[1:])
    else:
        Error("Unknown tree kind")

def interpret_trees(trees, environment, doprint = True):
    """Interpret a sequence of trees (may contain defines)
    and output the result.
    The trees passed in should be ASTs as returned by parse().
    If doprint is true, the post-interpretation value of each tree is printed.
    """
    environment = copy.copy(environment)
    # hoist define statements (note: trees.sort is stable)
    #trees.sort(key = lambda x: 0 if x[0] == 'expr' and x[1][0][1] == to_scheme['define'] else 1)
    ret = None
    for tree in trees:
        if tree[0] == 'expr' and tree[1][0][0] == 'symbol' and tree[1][0][1] == to_scheme['define']:
            try:
                symbol = tree[1][1]
                if symbol[0] != 'symbol':
                    Error('first argument to define must be a symbol')
                symbol = symbol[1]
                value = tree[1][2]
                environment[symbol] = interpret(value, environment)
            except:
                Error('error evaluating define statement')
        else:
            ret = interpret(tree, environment)
            if doprint:
                print ret,
    return ret

# read in the code ignoring all characters but '(' and ')' 
f = open(sys.argv[1],'r')
code = []
for line in f.readlines():
    code += [c for c in line if c in '()']

# parse and interpret the code. print 'Parenthesis Mismatch'
# if an error occured.
#try:
syntax_trees = parse(code)
interpret_trees(syntax_trees, default_environment)
#except:
#    print 'Parenthesis Mismatch'

Spiegazione

(
  define
  (() ()())
  input [[[[]]]]
  (() (((()))))
  exec readline
  ( (() ()((()))) )
)
(
  define
  (() ()())
  value of 'A' [[[[]]]] [][][]
  (() (((())))()()())
  65
  ((()) ()()()()()()()()()()
        ()()()()()()()()()()
        ()()()()()()()()()()
        ()()()()()()()()()()
        ()()()()()()()()()()
        ()()()()()()()()()()
        ()()()()())
)
(
  define
  (() ()())
  atbash [[[[]]]] []
  (() (((())))())
  (
    lambda
    (() ())
    (
      list [[[[]]]] [][]
      (() (((())))()())
    )
    (
      if
      (() ()()())
      (
        equal
        (() (())(()))
        list
        (() (((())))()())
        empty
        (() ((())))
      )
      then return empty
      (() ((())))
      else
      (
        cons
        (() ((()))())
        (
          char
          (() (())(())())
          (
            plus
            (() (()))
            value of 'A' 65
            (() (((())))()()())
            (
              minus
              (() (()()))
              25
              ((()) ()()()()()()()()()()
                    ()()()()()()()()()()
                    ()()()()())
              (
                minus
                (() (()()))
                (
                  intofchar
                  (() (()())())
                  (
                    car
                    (() ((()))(()))
                    list
                    (() (((())))()())
                  )
                )
                value of 'A' 65
                (() (((())))()()())
              )
            )
          )
        )
        (
          atbash
          (() (((())))())
          (
            cdr
            (() ((()))()())
            list
            (() (((())))()())
          )
        )
      )
    )
  )
)

(
  equals
  (() (())(()))
  (
    reverse
    (() ()()(()))
    (
      charsof
      (() ()()()())
      input
      (() (((()))))
    )
  )
  (
    atbash
    (() (((())))())
    (
      charsof
      (() ()()()())
      input
      (() (((()))))
    )
  )
)

4
Vuoi che il tuo codice sia il più lungo? : P
Zorgatone,

4

Python 3, 90 85 byte

s=input().upper()
print(s[::-1]==''.join(chr([o,155-o][64<o<91])for o in map(ord,s)))

Convertiamo l'input in maiuscolo, quindi calcoliamo la stringa Atbashed sottraendo tutti gli ordinali da 155 se si trovano nell'intervallo dell'alfabeto maiuscolo.


4

taglio , 73 byte

Kerf è un linguaggio proprietario nella stessa famiglia generale di APL, J e K. È possibile scrivere oneliners criptici e compatti ed evitare l'uso di loop espliciti:

{[s]s:_ s;n:?isnull i:s search\<a:char 97+^26;f:(/a)[i];s match/f[n]:s[n]}

Tuttavia, l'uso degli alias scritti per i comandi anziché i simboli di stenografia e l'utilizzo di identificatori significativi rendono il programma molto più chiaro e abbastanza facile da seguire anche se non si ha familiarità con Kerf:

def atbash_palindrome(str) {
  str:       tolower str
  alpha:     char range(97, 123)
  indices:   str search mapleft alpha
  encoded:   (reverse alpha)[indices]
  notfound:  which isnull indices
  return     str match reverse encoded[notfound]:str[notfound]
}

In azione:

KeRF> p: {[s]s:_ s;n:?isnull i:s search\<a:char 97+^26;f:(/a)[i];s match/f[n]:s[n]};

KeRF> p mapdown ["WIZARD","Wizard","W I Z A R D","ABCXYZ","345 09%","ev","Zyba","$%%$","-AZ"]
  [1, 1, 1, 1, 0, 1, 1, 1, 0]

Kerf probabilmente non vincerà un sacco di competizioni di codegolf, specialmente contro linguaggi appositamente costruiti, ma potrebbe valere la pena armeggiare se ti piace l'idea delle lingue della famiglia APL ma trovi la sintassi troppo strana. ( Dichiarazione di non responsabilità: sono l'autore del manuale di riferimento di Kerf. )


3

Prolog, 121 byte

a(W):-upcase_atom(W,X),atom_codes(X,C),b(C,Z),!,reverse(Z,C).
b([A|T],[R|S]):-(A>64,A<91,R is 77-A+78;R=A),(b(T,S);S=[]).

Questo viene chiamato con un atomo come input, ad es a('WIZARD')..


3

JavaScript (ES6), 91

x=>(x=[...x.toLowerCase()]).every(c=>((v=parseInt(c,36))>9?(45-v).toString(36):c)==x.pop())

TEST

F=x=>(x=[...x.toLowerCase()]).every(c=>((v=parseInt(c,36))>9?(45-v).toString(36):c)==x.pop())

console.log=x=>O.textContent+=x+'\n'

;[
 ["WIZARD", true]
,["Wizard", true] // case doesn't matter
,["wIzArD", true]
,["W I Z A R D", true]
,["W IZ ARD", false] // the atbash of this is D RA ZIW, which is not a palindrome of W IZ ARD
,["ABCXYZ", true] // ZYXCBA
,["345 09%", false] // is not a palindrome
,["ev", true] // ve
,["AZGDFSSF IJHSDFIU HFIA", false]
,["Zyba", true]
,["-AZ", false] // -ZA is not a reverse of -AZ
,["Tree vvig", true] // Givv eert 
,["$%%$", true] // palindrome
,["$%ZA%$", true]
].forEach(t=>{var i=t[0],x=t[1],r=F(i);
              console.log(i+' -> '+r+(x==r?' OK':' Fail (expected:'+x+')'))})
<pre id=O></pre>


3

C, 101 97 byte

Poiché la domanda specificava caratteri ASCII, questo non gestisce nessun altro tipo di codifica.

f(char*s){char*p=s+strlen(s);while(*s&&!(isalpha(*--p)?*s<64||*s+*p-27&31:*s-*p))++s;return s>p;}

Spiegazione

int f(char*s)
{
    char *p = s + strlen(s);
    while (*s && !(isalpha(*--p) ? *s<64||*s+*p-27&31 : *s-*p))
        ++s;
    return s > p;
}

Facciamo un puntatore pche inizia alla fine della stringa. Quindi eseguiamo il loop, spostando entrambi sep verso l'altros raggiungiamo la fine. Ciò significa che ogni coppia di caratteri verrà controllata due volte, ma ciò consente di risparmiare un paio di byte rispetto all'arresto non appena i puntatori si incrociano.

Ad ogni iterazione, controlliamo se *pè una lettera. In tal caso, controlla che *ssia compreso nell'intervallo di lettere (ASCII 64 verso l'alto) e che *pe *saggiungi fino a 27 (mod 32). Le non lettere oltre 64 non supereranno tale test, quindi non è necessario verificarle isalpha(*s).

Se *pnon è una lettera, testiamo semplicemente se è uguale a *s. In entrambi i casi, terminiamo il loop prima se pattraversiamo.

Se se si psono incrociati, allora ogni coppia di lettere corrisponde correttamente, quindi torniamo true; altrimenti restituiamo false.

Programma di test

Passa le stringhe da testare come argomenti della riga di comando. Questo produce un output corretto per tutti i casi di test. Non è richiesto alcun requisito per la stringa vuota; la mia implementazione restituisce false per quell'input.

#include <stdio.h>

int main(int argc, char **argv)
{
    while (*++argv)
        printf("\"%s\" => %s\n", *argv, f(*argv)?"true":"false");
    return 0;
}

puoi rilasciare fla dichiarazione di tipo per un prototipo in stile K&R:f(char*s)
cat

3

Perl 5, 70 byte

Una subroutine:

{$"='';reverse(map/[A-Z]/?chr(155-ord):$_,(@_=split'',uc$_[0]))eq"@_"}

Vedi in uso:

print sub{...}->("W i z a r d")

2

MATL, 23 byte

Utilizza la versione corrente .

jkt"@@2Y2m?_219+]h]tP=A

Esempi

>> matl
 > jkt"@@2Y2m?_219+]h]tP=A
 > 
> Tree vvig
1

>> matl
 > jkt"@@2Y2m?_219+]h]tP=A
 > 
> W IZ ARD
0

2

CJam, 18 byte

qeu_'[,65>_W%erW%=

Provalo online

Funziona convertendo l'input in maiuscolo, eseguendo la traduzione di lettere, capovolge la stringa e verifica l'uguaglianza.


2

Japt, 30 27 byte

U=Uv)w ¥Ur"[a-z]"_c +4^31 d

Provalo online!

Come funziona

Questo si basa in gran parte sulla mia risposta di Japt su Swap the Alphabet.

U=Uv)w ¥Ur"[a-z]"_c +4^31 d
U=Uv)      // Set U to U.toLowerCase().
w ¥        // Reverse it, and check if it is equal to:
Ur"[a-z]"  //  Take the input and replace each letter with:
 _c +4     //   Take its char code and add 4. This results in
           //   the string      "abc...xyz"
           //   becoming        "efg...|}~".
 ^31       //   XOR the result by 31. This flips its last five 5 bits.
           //   We now have     "zyx...cba".
 d         //   Convert back from a char code.
           // Implicit: output last expression

1

Python, 156 112 byte

a=map(chr,range(65,91))
s=raw_input().upper()
print ''.join([dict(zip(a,a[::-1])).get(i,i) for i in s])==s[::-1]

Fondamentalmente, crea un dizionario della traduzione con lettere maiuscole e l'input è in maiuscolo (se invece tutto fosse in minuscolo, ciò aggiungerebbe 5 byte). Quindi, per ogni carattere nell'input in maiuscolo, fai la traduzione e aggiungi a un elenco a meno che il carattere non sia nell'alfabeto, nel qual caso aggiungi il carattere così com'è. Unisciti all'intero elenco e confronta con l'elenco invertito.

Urla a @Artyer per aver pubblicato quasi esattamente come stavo per pubblicare prima di me. Ma devo confermare, questo è il mio lavoro e l'ho fatto in modo indipendente .

Basato sulla risposta di Julia di Alex A. Provalo qui


C'è uno spazio bianco non necessario dopo .get(i,i). +1.
Yytsi,

1

05AB1E , 8 byte (non concorrenti)

Questo linguaggio utilizza funzionalità che postdatano la sfida ed è quindi non competitivo.

Codice:

lDAAR‡RQ

Spiegazione:

l         # Lowercase the implicit input
 D        # Duplicate top of the stack
  AAR     # Push the lowercase alphabet (A) and the lowercase alphabet reversed (AR)
     ‡    # Transliterate a -> b
      R   # Reverse this string
       Q  # Compare with the input string

Provalo online!


1

Fattore, 118 113 byte

Questa è una funzione anonima.

[ >upper dup >array [ 1string 65 90 [a,b] [ 1string ] map dup reverse zip >hashtable at ] map "" join reverse = ]

Non conosco un modo più breve per generare una matrice associativa dell'alfabeto: c


1

Clojure, 100 byte

(defn x[b](let[a(.toUpperCase b)c(reverse a)](=(map #(char(if(<= 65(int %)90)(- 155(int %))%))a)c)))

Dovrebbe essere possibile ridurlo a un'unica funzione anonima, tagliando circa altri 10 byte (di dichiarazioni) ma non ho ancora trovato un modo.


1

Rubino, 79 77 byte

s=$*[0].upcase
exit(s==s.reverse.tr('A-Z','ZYXWVUTSRQPONMLKJIHGFEDCBA'))?0:1

Accetta la parola da testare come argomento della riga di comando. Esce con il codice 0 (che è vero per la shell) se l'argomento è un atbash self palindrome, o con il codice 1 in caso contrario.


1
Il putsrisultato non sarebbe più breve dell'uscita con un ternario?
gatto

FYI $*è un alias per ARGV.
Giordania,

1

Rubino, 56 byte

->s{s.upcase!;s==s.tr(x=[*?A..?Z]*'',x.reverse).reverse}

È una funzione anonima che accetta una stringa e restituisce trueo false. È piuttosto goffo: per salvare alcuni byte, usa la variante distruttiva di upcase(con un !dopo). upcase!purtroppo ritorna nilse non viene modificato nulla (come tutti gli input numerici), quindi alcuni byte vengono persi nel tentativo di gestirli. Funziona ancora comunque :)


1

MATLAB, 61 byte

Non è la soluzione più breve, ma comunque interessante

f=@(a)~any(changem(upper(a),90:-1:65,65:90)-fliplr(upper(a)))
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.