阿特巴什自我回文症


27

考虑一下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

其中A⇔Z和L⇔O,例如,存在一些单词共有的有趣特性。当将某些字符串翻译成等同于atbash的字符串时,所说的翻译就是原始单词的反转。我称这些为Atbash自回文症

例如,让我们翻译WIZARD

W→D
我→R
Z→A
A→Z
R→我
D→W

结果是DRAZIW,它被向导反转了。因此,向导是一种atbash自我回文症。

目标给定一串可打印的ASCII字符,如果该字符串是atbash自回文,则输出或返回真实值,否则输出假值。(这是通过STDIN,最接近的等价函数,功能输入等完成的。如果您的语言不能执行任何这些操作,请考虑选择其他语言,您可以对输入进行硬编码。)您应该不区分大小写。如果输入是回文,并且不受atbash序列的影响,那么您仍然应该输出true,因为回文+本身就是回文。这是一个,因此以字节为单位的最短程序获胜。

测试用例

"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

排行榜

这篇文章底部的Stack Snippet会根据答案a)生成目录,a)作为每种语言最短解决方案的列表,b)作为整体排行榜。

为确保您的答案显示出来,请使用以下Markdown模板以标题开头。

## Language Name, N bytes

N您提交的文件大小在哪里。如果您提高了分数,则可以将旧分数保留在标题中,方法是将它们打掉。例如:

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

如果要在标头中包含多个数字(例如,因为您的分数是两个文件的总和,或者您想单独列出解释器标志罚分),请确保实际分数是标头中的最后一个数字:

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

您还可以将语言名称设置为链接,然后该链接将显示在代码段中:

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


相关:交换字母
nicael

4
AtBash实际上并不是什么新鲜事物。与此等效的是卡巴拉语(犹太神秘主义)希伯来字母转换。由于希伯来语仅与wovels一起编写,因此可以通过插入随机wovels来读取任何字母字符串。ATB(a)SH是用于将Alef(第一个希伯来字母)转换为Tav(最后一个),Beis(第二个)转换为SHin(下一个到最后)的助记符。
亚当

1
如果某人的解决方案代码本身是atbash自我回文,请考虑给予-1000000分?:p
kojiro

3
@kojiro不平凡,而不是code {Comment-symbol}{Atbash'ed Comment-symbol} Atbash'ed code...
亚当

1
@ mbomb007我说如果这样的我可以提供赏金平凡的程序被发现
康纳尔奥布莱恩

Answers:


8

接收9 8字节

受Retina的大力启发,几天前我做了这个。码:

prR`w$rM

说明:

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.

在这里尝试!


那么语言本身实际上是如何工作的呢?它是某种基于堆栈的字符串处理语言吗?这确实令人印象深刻,但据我所知,还没有办法循环使用该语言,这意味着在此阶段,这极不可能满足我们的编程语言标准
马丁·恩德

@MartinBüttner此语言主要基于使用堆栈模型的输入处理。它不使用整数(可能永远不会使用整数)。我确实实现了一个循环,但是该版本尚未发布。
阿德南(Adnan)2016年

@Martin Regexes能够自行进行素性测试,因此我很确定这是有效的。
lirtosiast

@ThomasKwa据我所知,解释器未使用任何实际的正则表达式。
马丁·恩德

@马丁Hmm,你是对的。
lirtosiast


6

朱莉娅96字节

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

这是一个lambda函数,它接受一个字符串并返回一个字符串。要调用它,请将其分配给变量。

取消高尔夫:

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实用程序,56

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

为Truthy输出空字符串,例如 - /dev/fd/63 differ: byte 1, line 1为Truthy为Falsey输出。如果这是不可接受的,那么我们可以添加-s额外的3个字节,并使用标准的Unix返回码:成功(Truthy)为0,失败(Falsey)为1。


5

视网膜,44字节

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

版画 10。字节计数假定文件编码为ISO 8859-1。

在线尝试!

这个答案很大程度上受到启发 DigitalTrauma的sed答案但是我想再次证明,针对这一挑战的方法并不多。

说明

每当您看到a时,Retina将代码分割成几行后,第一件事就是用换行符替换所有这些盗窃者。即使换行是Retina的阶段分隔符,这也允许包含单个字节的换行。

$
¶$_

我们从复制输入开始。我们将输入的结尾与匹配,$并与输入本身一起插入换行符(使用$_)。

T`lL`Ro`.+$

音译阶段。让我们从正则表达式开始:.+$。它匹配输入的第二个副本(通过确保匹配持续到字符串的末尾)。因此,只有第二个副本中的字符会被音译。音译本身利用了一些非常新的功能。lL分别是大写和小写字母的字符类。o指音译的另一个字符集并将其R反转。因此,这两个字符集扩展为:

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba

您会注意到,这在执行Atbash密码时会交换大小写,但是无论如何我们将不区分大小写地进行最终比较。

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

现在我们反转第二个副本。不幸的是,Retina还没有方便的方法,因此我们必须一次将一个字符从末尾移动到前面。通过重新使用换行分隔符作为尚未反转的零件的标记,可以完成此操作。我们匹配该部分,但分别捕获最后一个字符。该字符位于最前面,其余字符保持不变。该+告诉视网膜反复做,直到它不再是可能的(因为是在字符串的结尾)。

i`^(.+)\1$

最后,我们检查两个字符串是否相同。这i使得模式不区分大小写-在.NET中,这很方便,这意味着反向引用也不区分大小写。您可能会注意到,我们在原始输入和修改后的副本之间不再有分隔符。但是,我们不需要一个,因为它们的长度相同,并且如果该字符串现在完全由相同的字符串组成两次(最多不超过1个),则这些字符串必须是原始字符串和修改后的字符串。如果您想知道用作标记的尾随换行符发生了什么,它仍然存在,但是在许多正则表达式$,如果该字符是一个换行符字符串的最后一个字符。

由于此阶段仅包含一行,因此将其视为比赛阶段,该阶段计算比赛的次数。如果输入是Atbash回文,我们将得到一个完全匹配的结果,输出是1。如果不匹配,则此正则表达式将不匹配,输出将为0


我想让换行符成为舞台分隔符,让pilcrows作为文字更好,反之亦然。
科纳·奥布莱恩

@CᴏɴᴏʀO'Bʀɪᴇɴ为了方便起见,您还可以\n 在正则表达式和$n替换项中按转义序列插入换行符,但这浪费了打高尔夫球的字节数。;)
Martin Ender 2016年

5

GNU Sed,105岁

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

输出1为真,0为假。

我尝试在Retina中执行此操作,但无法弄清楚如何在Atbash音译之前保存字符串以与之后进行反向比较。也许有更好的方法。

Sed的y音译命令还有很多不足之处。


是的,在视网膜中“存储”东西仍然很麻烦。您只需要复制字符串,然后音译并只反转一个副本即可。我想在将来添加某种分支/分支功能,但是我不确定细节。
Martin Ender'1

嗯,我想我明白了-我尝试通过用冒号分隔前后字符串来做类似的事情。我在结尾处使用了正则表达式T-我假设它依次适用于每个字符,但是如果我的理解正确的话,它将适用于整个模式空间,这将更为有用
Digital Trauma

1
T中的正则表达式应用于输入字符串。音译是该正则表达式匹配项中唯一执行的,所有不匹配项均保持不变。正则表达式默认为[\s\S]+忽略它,所以您将音译所有内容。
Martin Ender


由于它是GNU sed,因此您可以通过交易节省一个字节 -r标志换成\(和中的反斜杠\)。我同意你的y命令!
Toby Speight

4

𝔼𝕊𝕄𝕚𝕟,15个字符/ 30个字节

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

Try it here (Firefox only).

说明

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

括号,658字节

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

使用此脚本的修改后的版本,现在仅适用于所有不带空格的大写字母,以便支持从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'

说明

(
  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
您想让代码最长吗?:P
Zorgatone

4

Python 3,90 85字节

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

我们将输入转换为大写,然后通过从155中减去所有序号(如果它们在大写字母范围内)来计算Atbashed字符串。


4

Kerf,73个字节

Kerf是与APL,J和K相同的通用家族中的一种专有语言。可以编写神秘的,紧凑的oneliner,并避免使用显式循环:

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

但是,对命令使用拼写别名而不是速记符号,并使用有意义的标识符可以使程序更加清晰,并且即使您不熟悉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]
}

实际上:

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可能不会赢得大量的Codegolf竞赛,尤其是针对专用语言的竞赛,但是如果您喜欢APL族语言的想法却发现语法太怪异,那么也许值得一试。(免责声明:我是Kerf参考手册的作者。


3

Prolog,121个字节

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

这被称为以原子作为输入,例如a('WIZARD').


3

JavaScript(ES6),91

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

测试

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字节

由于问题指定了ASCII字符,因此无法处理其他任何编码。

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

说明

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

我们创建一个p从字符串末尾开始的指针。然后,我们循环,同时移动sp相向s到达终点。这意味着每对字符将被检查两次,但是与指针越过立即停止相比,这节省了几个字节。

在每次迭代中,我们检查是否*p为字母。如果是这样,请检查该*s字符是否在字母范围内(ASCII 64以上),*p*s加起来最多为27(mod 32)。大于64的非字母将无法通过该测试,因此我们不需要检查isalpha(*s)

如果*p不是字母,那么我们只需测试它是否等于*s。无论哪种情况,我们都在循环之前终止sp交叉。

如果sp交叉,则每对字母正确匹配,因此我们返回true;否则,返回true。否则,我们返回false。

测试程序

将要测试的字符串作为命令行参数传递。这会为所有测试用例产生正确的输出。没有提供空字符串的要求;我的实现对该输入返回false。

#include <stdio.h>

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

你可以滴f:的类型声明的K&R风格的原型f(char*s)

3

Perl 5,70个字节

子程序:

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

看到它在使用中:

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

2

MATL,23个字节

使用当前版本

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

例子

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

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

2

CJam,18个字节

qeu_'[,65>_W%erW%=

在线尝试

通过将输入转换为大写字母,翻译字母,翻转字符串并检查是否相等来工作。


2

Japt,30 27字节

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

在线尝试!

怎么运行的

这主要是基于我对交换字母的Japt回答

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,156112字节

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]

基本上,它将字典翻译成大写字母,并且将输入大写(如果所有内容均为小写,则将增加5个字节)。然后,对于大写输入中的每个字符,进行翻译并追加到列表中,除非该字符不在字母表中,在这种情况下,按原样追加字符。加入整个列表并与反向列表进行比较。

大声疾呼@Artyer几乎完全按照我要在我之前发布的方式发布。但是我需要确认,这是我的工作,我是独立完成的

基于Alex A的Julia回答。请在此处尝试


之后有多余的空格.get(i,i)。+1。
Yytsi'8

1

05AB1E,8个字节(非竞争)

该语言使用的功能可以推迟挑战,因此是非竞争性的。

码:

lDAAR‡RQ

说明:

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

在线尝试!


1

因子,118个 113字节

这是一个匿名函数。

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

我不知道生成字母关联数组的更短方法:c


1

Clojure,100字节

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

应该可以将其缩减为单个匿名函数,从而减少大约10个字节的(声明)字节,但是我还没有找到解决方法。


1

Ruby,79 77字节

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

接受要测试的单词作为命令行参数。如果自变量是atbash自回文,则以代码0(对于外壳是正确的)退出,否则以代码1退出。


1
岂不puts荷兰国际集团的结果是比用三元退出短?

FYI $*是一个别名ARGV
约旦

1

Ruby,56个字节

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

这是一个匿名函数,它接收字符串并返回truefalse。这很笨拙:为了节省一些字节,它使用了破坏性的变体upcase(带有一个!after)。upcase!不幸的nil是,如果不进行任何更改(例如所有数字输入),则返回,因此尝试处理该操作会丢失一些字节。仍然可以通过:)


1

MATLAB,61字节

不是最短的解决方案,但仍然很有趣

f=@(a)~any(changem(upper(a),90:-1:65,65:90)-fliplr(upper(a)))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.