Atbash Kendini Palindromları


27

Atbash dönüşümünü göz önünde bulundurun :

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

A ⇔ Z ve L ⇔ O, örneğin, bazı kelimelerin paylaştığı ilginç bir özellik var. Bazı dizeler atbash eşdeğerlerine çevrildiğinde, söz konusu çeviri ters çevrilmiş orijinal kelimedir. Ben buna Atbash Self Palindromes diyorum .

Örnek olarak, WIZARD'ı çevirelim :

W → D
Ben → R
Z → A
A → Z
R → ben
D → K

Sonuç WIZARD olan DRAZIW . Böylece, WIZARD atbash öz palindromdur.

Amaç Bir yazdırılabilir ASCII karakter dizisi verildiğinde, bu dize bir atbash öz palindromu ve aksi takdirde bir falsey değeriyse bir gerçek değer verir veya verir. (Bu, STDIN, en yakın eşdeğer, işlevsel giriş vb. Yoluyla yapılır. Diliniz bunlardan herhangi birini yapamıyorsa , girişi zorlayabileceğiniz farklı bir dil seçmeyi düşünün .) Bunu büyük / küçük harf duyarsız yapmalısınız. Girdi bir palindrome ise ve atbash sırasından etkilenmiyorsa, bir palindrome + 'in bir palindrome olduğu için hala doğru çıkmalısınız. Bu bir , yani bayt cinsinden en kısa program kazanır.

Test durumları

"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

Liderler Sıralaması

Bu yazının altındaki Yığın Parçacığı, cevapları a) dil başına en kısa çözümün bir listesi olarak ve b) genel bir lider tablosu olarak oluşturur.

Cevabınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak cevabınızı bir başlık ile başlatın:

## Language Name, N bytes

Gönderinizin Nbüyüklüğü nerede ? Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

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

Başlığınıza birden fazla sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğundan veya tercüman bayrağı cezalarını ayrı ayrı listelemek istediğiniz için), gerçek puanın başlıktaki son sayı olduğundan emin olun :

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

Dil adını, daha sonra pasajda görünecek bir bağlantı da yapabilirsiniz:

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



4
AtBash aslında yeni bir şey değil. Kabala (Yahudi Tasavvufu) İbranice harf dönüşümü buna eşdeğerdir. İbranice yalnızca wovellerle yazıldığından, herhangi bir harf dizisi rasgele woveller eklenerek okunabilir. ATB (a) SH, Alef'i (ilk İbranice harf) Tav (son), Beis'i (ikinci) SHIN'e (sonuncuya) dönüştürmek için bir hatıradır.
Adám

1
Birinin çözüm kodunun kendisi atbash self palindrome ise -1000000 puan vermeyi düşünün? : p
kojiro

3
@kojiro Karşısına önemsiz değil code {Comment-symbol}{Atbash'ed Comment-symbol} Atbash'ed code...
Adám

1
@ mbomb007 Böyle önemsiz bir program bulunursa lütuf sunabileceğimi söyledim
Conor O'Brien

Yanıtlar:


8

RX , 9 8 bayt

Ağır Retina'dan esinlenerek birkaç gün önce yaptım. Kod:

prR`w$rM

Açıklama:

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.

Burada dene !


Peki dilin kendisi aslında nasıl çalışıyor? Bir tür yığın tabanlı dize işleme dili mi? Bu gerçekten etkileyicidir, ancak söyleyebildiğim kadarıyla, dilde ilmek yapmanın bir yolu yoktur; bu , bunun bir programlama dili standartlarımızı bu aşamada karşılaması ihtimalinin düşük olması anlamına gelir .
Martin Ender

@ MartinBüttner Bu dil temelde bir yığın model kullanarak girişin işlenmesine dayanmaktadır. Tamsayı kullanmaz (ve muhtemelen asla kullanmaz). Bir döngü uyguladım ancak bu sürüm henüz piyasaya sürülmedi.
Adnan

@Martin Regexes kendiliğinden ilkellik testini yapabilir, bu yüzden bunun geçerli olduğundan eminim.
lirtosiast

@ThomasKwa Görebildiğim kadarıyla, tercüman herhangi bir gerçek normal ifade kullanmaz.
Martin Ender

@ Martin Hmm, haklısın.
lirtosiast


6

Julia, 96 bayt

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

Bu, bir dizgeyi kabul eden ve bir dize döndüren bir lambda işlevidir. Aramak için değişkene atayın.

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

Bash + Linux programları, 56

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

Truthy ve - /dev/fd/63 differ: byte 1, line 1Falsey için olduğu gibi boş bir dizge çıktılar. Eğer bu kabul edilebilir değilse -s, fazladan 3 bayt ekleyebilir ve Başarı için 0 (Truthy) ve 1 Başarısızlık (Falsey) için standart Unix dönüş kodlarını kullanabiliriz.


5

Retina , 44 bayt

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

Yazdırır 1veya0 . Bayt sayısı, dosyanın ISO 8859-1 olarak kodlandığını varsayar.

Çevrimiçi deneyin!

Bu cevap, DigitalTrauma'nın sed cevabından büyük ölçüde ilham aldı . ancak daha sonra, yine de bu mücadeleye ilk bakışta pek fazla yaklaşım gelmediğini tahmin ediyorum.

açıklama

Ne zaman bir tane görürseniz , Retina, kodu satırlara böldükten sonra ilk yapan şey, bu satırların hepsini satır besleme ile değiştirmektir. Bu, satırlar Retina'nın sahne ayırıcısı olsa bile satır baytlarının tek bir bayt için eklenmesini sağlar.

$
¶$_

Girdiyi çoğaltarak başlıyoruz. Girişin sonuna eşleşir ve $girişin kendisiyle birlikte bir satır besleme ekleriz (kullanarak $_).

T`lL`Ro`.+$

Harf çevirisi aşaması. En regex ile başlayalım: .+$. Girişin ikinci kopyasıyla eşleşir (eşleşmenin dizenin sonuna kadar devam etmesini sağlayarak). Bu nedenle, ikinci kopyadaki sadece karakterler çevrilecektir. Harf çevirisi, çok yeni özelliklerden yararlanır. lve Lsırasıyla küçük ve büyük harfler için karakter sınıflarıdır. oHarf çevirisi diğer karakter kümesini ifade eder ve Ronu tersine çevirir. Böylece iki karakter kümesi genişler:

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba

Bunun Atbash şifresini yaparken davayı değiştirdiğini fark edeceksiniz, ancak nihai karşılaştırma vakasını duyarsızca yapacağız.

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

Şimdi ikinci kopyayı tersine çeviriyoruz. Ne yazık ki, Retina henüz bunu yapmanın uygun bir yoluna sahip değil, o yüzden bir kerede bir karakterin sonundan öne geçmesi gerekecek. Bu, hat besleme ayırıcısını, kısmı henüz ters çevrilmemiş bir işaretleyici olarak yeniden yerleştirerek yapılır. Bu kısmı eşleştiriyoruz, ancak son karakteri ayrı ayrı ele alıyoruz. Bu karakter öne doğru gider ve kalan kısım değişmez. +(Çünkü artık mümkün olana kadar tekrar tekrar bunu yapmak Retina söyler dizenin sonundadır).

i`^(.+)\1$

Son olarak, iki dizenin aynı olup olmadığını kontrol ederiz. iGeribaşvurularla da harf duyarsız bu araçlar olduğunu, .NET, elverişli - küçük harf duyarsız desen yapar. Orijinal girdi ile değiştirilmiş kopya arasında artık bir ayırıcı bulunmadığını fark edebilirsiniz. Yine de bir taneye ihtiyacımız yok, çünkü bunlar aynı uzunluktadır ve dizge şimdi tam olarak aynı diziden iki kez (duruma göre) oluşuyorsa, bunlar orijinal ve değiştirilmiş dizge olmalıdır. İşaretçi olarak kullandığımız izleyen satır beslemesine ne olduğunu merak ediyorsanız, hala orada, ancak birçok regex çeşidinde dizgenin son karakterinden önce$ eşleşiyorsa , bu karakter bir satır beslemesi ise eşleşir .

Bu aşama sadece tek bir çizgiden oluştuğundan, maç sayısını sayan bir maç aşaması olarak alınmaktadır. Girdi bir Atbash palindromuysa, tam olarak bir eşleşme elde ederiz ve çıktı 1. Eğer değilse, o zaman bu regex eşleşmeyecek ve çıktı olacaktır 0.


Sanırım, satır beslemelerinin sahne ayırıcılar olması ve pilotların tam tersi gerçek anlamıyla olması daha iyidir.
Conor O'Brien,

@ CᴏɴᴏʀO'Bʀɪᴇɴ Kolaylık sağlamak için, kaçış dizileriyle, \n regex ve $nikame halinde hat beslemeleri de ekleyebilirsiniz , ancak bu golf için baytları boşa harcar . ;)
Martin Ender

5

GNU Sed, 105

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

Truthy için 1 ve falsey için 0 çıktılar.

Bunu Retina'da yapmaya çalıştım, ancak Atbash'in harf çevirisinden önce ipi nasıl kaydedeceğimizi bilemedim. Belki daha iyi bir yol var.

Sed'in yharf çevirisi komutu arzulanan çok şey bırakıyor.


Evet, "depolamak" işleri Retina'da hala hantal. Dizeyi kopyalamanız ve sonra sadece bir kopyasını kopyalayıp ters çevirmeniz gerekir. Gelecekte bir çeşit dallanma / çatallanma özelliği eklemek istiyorum, ancak henüz ayrıntılar konusunda tam olarak emin değilim.
Martin Ender

Ah, sanırım görüyorum - benzer bir şey yapmayı denedim önce ve sonra dizeleri bir kolonla ayırarak. Sonunda regex ile düştüm T- sırayla her karaktere uygulandığını farz ediyordum, ancak eğer anlayışım doğruysa, çok daha kullanışlı olan tüm kalıp uzayına uygulanır
Digital Trauma

1
T'deki regex giriş dizgisine uygulanır. Harf çevirisi, yalnızca bu regex'in eşleşmeleri arasında gerçekleştirilir ve eşleşmeyen her şey değişmeden kalır. Düzenli ifade varsayılanı [\s\S]+geçersiz kılar, bunu reddederek, her şeyi çevirirsiniz.
Martin Ender


GNU sed olduğundan, ve -riçindeki ters eğik çizgiler için bayrak takas ederek bir bayttan tasarruf edebilirsiniz . Komutada sana katılıyorum ! \(\)y
Toby Speight

4

15, 15 karakter / 30 bayt

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

Try it here (Firefox only).

açıklama

ïþ)Ī(ᶐ,ᶐᴙ)ᴙ≔ïþ) // 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

Parentetik, 658 bayt

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

Sadece şu anda boşluk olmayan tüm büyük harfler için çalışır, komut dosyasının bu değiştirilmiş sürümünü kullanarak stdin'den okumayı destekler:

#!/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'

açıklama

(
  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
Kodunuzun en uzun olmasını ister misiniz? : P
Zorgatone

4

Python 3, 90 85 bayt

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

Girdiyi büyük harfe dönüştürürüz ve sonra büyük harfli alfabe aralığındalarsa, tüm sıraları 155'den çıkararak Atbashed dizesini hesaplar.


4

çentik , 73 bayt

Kerf, APL, J ve K ile aynı genel ailede bulunan özel bir dildir. Kriptik, kompakt oneliners yazmak ve açık döngüler kullanmaktan kaçınmak mümkündür:

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

Bununla birlikte, kısa işaretli semboller yerine komutlar için hecelenen takma adları kullanmak ve anlamlı tanımlayıcıları kullanmak, Kerf'e aşina olmasanız bile programı daha net ve takip etmesi oldukça kolaydır:

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

Eylemde:

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, özellikle de amaca yönelik dillere karşı, bir ton kod yarışması kazanmayacak, ancak APL ailesi dilleri fikrini seviyorsanız, ancak sözdizimini çok garip buluyorsanız, çözülmeye değer olabilir. ( Feragatname: Kerf referans kılavuzunun yazarıyım. )


3

Prolog, 121 bayt

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=[]).

Buna girdi olarak bir atomla denir, örneğin a('WIZARD')..


3

JavaScript (ES6), 91

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

ÖLÇEK

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 bayt

ASCII karakterlerinin sorduğu gibi, bu diğer kodlamaları da ele almaz.

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

açıklama

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

pDizenin sonunda başlayan bir işaretçi yaparız . Sonra döngü, hem hareketli sve pbirbirlerine doğrus sonuna ulaşıyoruz. Bu, her karakter çiftinin iki kez kontrol edileceği anlamına gelir, ancak bu, işaretçiler geçtikten hemen sonra durmaya kıyasla birkaç bayt tasarrufu sağlar.

Her tekrarda, *pbir harf olup olmadığını kontrol ederiz . Eğer öyleyse, kontrol *sharflerin aralıkta (yukarı doğru ASCII 64) içinde olduğunu ve *pve *s27 (mod 32) kadar ekleyin. 64 yaşından küçük olmayan harfler bu testi geçemez, bu yüzden kontrol etmemize gerek yokisalpha(*s) .

Eğer *pbir mektup değilse, o zaman sadece ona eşit olup olmadığını test ediyoruz *s. Her iki durumda da, önce döngü sona sve püzerinden geçin.

Eğer sve pgeçti biz gerçek dönmek böylece, o zaman harflerin her çifti, doğru uyumlu; Aksi takdirde yanlış döneriz.

Test programı

Test edilecek dizeleri komut satırı argümanları olarak iletin. Bu, tüm test durumları için doğru çıktı üretir. Boş dize için herhangi bir tedarik gereksinimi yoktur; Uygulamam bu girdi için yanlış döndürüyor.

#include <stdio.h>

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

fK&R tarzı prototip için tür beyanı bırakabilirsiniz :f(char*s)
cat 19

3

Perl 5, 70 bayt

Bir alt yordam:

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

Kullanımda görün:

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

2

MATL, 23 bayt

Mevcut sürümü kullanır .

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

Örnekler

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

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

2

CJam, 18 bayt

qeu_'[,65>_W%erW%=

Çevrimiçi deneyin

Girdiyi büyük harfe dönüştürerek, harflerin çevirisini gerçekleştirerek çalışır, dizgeyi çevirir ve eşitliği denetler.


2

Japt, 30 27 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

Bu, büyük ölçüde Alfabeyi Takasla ilgili Japt cevabımı temel alıyor .

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 bayt

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]

Temel olarak, çevirinin büyük harflerle yazılmış bir sözlüğü yapar ve giriş büyük harfle yazılır (eğer her şey küçükse, 5 bayt ekler). Ardından, büyük harfli girişdeki her karakter için, çeviriyi yapın ve karakter alfabe içinde değilse bir listeye ekleyin, bu durumda karakteri olduğu gibi ekleyin. Tüm listeye katılın ve ters çevrilmiş listeyle karşılaştırın.

@Artyer'a, tam olarak benden önce göndereceğim gibi yayınlamak için bağırdım. Ama onaylamam gerek, bu benim işim ve bunu bağımsız olarak yaptım .

Alex'in Julia cevabına göre. A. Burada deneyin


Sonra gereksiz bir boşluk var .get(i,i). +1.
Yytsi

1

05AB1E , 8 bayt ( yarışmaz )

Bu dil, mücadeleden sonraki özellikleri kullanır ve bu nedenle rekabet etmez.

Kod:

lDAAR‡RQ

Açıklama:

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

Çevrimiçi deneyin!


1

Faktör, 118 113 bayt

Bu anonim bir işlevdir.

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

Alfabenin ilişkisel bir dizisini oluşturmanın daha kısa bir yolunu bilmiyorum: c


1

Clojure, 100 bayt

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

Bunu, isimsiz bir fonksiyona kesmek mümkün olmalı, yaklaşık 10 bayt (beyannamelerden) daha fazla kesinti ama henüz bir yol bulamadım.


1

Ruby, 79 77 bayt

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

Komut satırı argümanı olarak test edilecek sözcüğü kabul eder. Bağımsız değişken bir atbash öz palindromuysa, kod 0'la (kabuğun gerçektir) veya aksi takdirde 1 koduyla çıkar.


1
putsSonuç bir üçlü ile çıkmaktan daha kısa olmaz mıydı ?
kedi,

Bilginize $*bir takma addır ARGV.
Ürdün

1

Ruby, 56 bayt

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

Bu bir dize ve döner alan bir anonim işlev var trueya false. Oldukça sakar: Bazı byte'ları kurtarmak için, yıkıcı değişkenini kullanır upcase(bununla !birlikte). upcase!ne yazık ki nilhiçbir şey değişmediyse döner (tüm sayısal girişler gibi), bu nedenle bazı baytlar bununla baş etmeye çalışırken kaybolur. Hala tho çalışıyor :)


1

MATLAB, 61 bayt

En kısa çözüm değil, ama yine de ilginç

f=@(a)~any(changem(upper(a),90:-1:65,65:90)-fliplr(upper(a)))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.