Atbash Self Palindromes


27

Розглянемо перетворення Атбаша :

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, зазначений переклад є оригінальним словом, відміненим. Я називаю цих Паліндром Атбаша .

Як приклад, давайте переведемо ЧАСТИНА :

Ш → Д
I → R
Z → A
A → Z
R → I
D → W

Результат - DRAZIW , який WIZARD перевернуто. Таким чином, WIZARD - це паліндром атбашу.

Завдання З огляду на рядок друкованих символів ASCII, виведіть або поверніть триєдине значення, якщо ця струна є палідендромом atbash, а значення фальси - в іншому випадку. (Це робиться через STDIN, найближчий еквівалент, функціональний вхід і т.д. Якщо ваша мова не може робити будь - якої з них, спробуйте вибрати іншу мову , ви можете жорстко вхід.) Ви повинні зробити це регістронезавісімого. Якщо вхід є паліндром і на нього не впливає послідовність atbash, все одно слід вивести істину, оскільки palindrome + сам є palindrome. Це , тому виграє найкоротша програма в байтах.

Тестові справи

"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

Таблиця лідерів

Фрагмент стека внизу цієї публікації генерує каталог з відповідей а) як список найкоротших варіантів для кожної мови та б) як загальний таблиця лідерів.

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон 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



4
AtBash насправді не нова річ. Саме перетворення буквеного івриту кабала (єврейський містицизм) є рівнозначним цьому. Оскільки іврит пишеться лише за допомогою ниток, будь-яку літеру можна прочитати, вставивши випадкові шви. ATB (a) SH - мнемоніка для перетворення Алефа (перша єврейська літера) в Тав (остання), Бейс (друга) в Шин (наступна до останньої).
Адама

1
Подумайте, чи дасть -1000000 балів, якщо чийсь код рішення сам по собі є паліндром атбаш? : p
kojiro

3
@kojiro Нетривіальний на відміну від code {Comment-symbol}{Atbash'ed Comment-symbol} Atbash'ed code...
Adám

1
@ mbomb007 Я сказав, що можу запропонувати винагороду, якщо знайдеться така нетривіальна програма
Conor O'Brien

Відповіді:


8

RX , 9 8 байт

Сильно натхненний Ретіною, я зробив це кілька днів тому. Код:

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 Ця мова в першу чергу заснована на обробці вхідних даних за допомогою моделі стека. Він не використовує цілих чисел (і, мабуть, ніколи не буде). Я реалізував цикл, але ця версія ще не була випущена.
Аднан

@Martin Regexes здатний самостійно перевірити первинність, тому я впевнений, що це справедливо.
ліртосіаст

@ThomasKwa Наскільки я бачу, інтерпретатор не використовує жодних фактичних регулярних виразів.
Мартін Ендер

@Martin Хм, ти маєш рацію.
lirtosiast

11

Pyth, 10 9 байт

qJrz0_XJG

Спробуйте цю загадку в Інтернеті або перевірити всі тестові справи одразу.

Пояснення

qJrz0_XJG
  rz0      Lowercase input
 J         Store a copy in J
     _XJG  Translate J with the reverse alphabet and reverse
q          Compare

3
Оскільки ви використовуєте rz0двічі, чи не коротше зберегти його до змінної?
xnor

1
Як @xnor пропонує, q_Jrz0XJGна один байт коротше.
PurkkaKoodari

6

Джулія, 96 байт

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

Це лямбда-функція, яка приймає рядок і повертає рядок. Щоб викликати його, призначте його змінній.

Безголівки:

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для Falsey. Якщо це не прийнятно, ми можемо додати -sще 3 байти і використовувати стандартні коди повернення Unix 0 для Успіх (Truthy) і 1 для Failure (Falsey).


5

Сітківка , 44 байти

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

Друкує 1або 0. Кількість байтів передбачає, що файл кодується як ISO 8859-1.

Спробуйте в Інтернеті!

Ця відповідь була в значній мірі натхненна сед-відповіддю DigitalTrauma, але, знову ж таки, я думаю, що не так багато підходів до цього виклику.

Пояснення

Щоразу, коли ви бачите , перше, що робить Retina після розбиття коду на рядки, - це замінити всі ці стовпчиками на стрічковий канал. Це дозволяє включити канали ліній для одного байту, навіть якщо канали ліній є розділовим етапом Retina.

$
¶$_

Почнемо з дублювання введення. Ми співставляємо кінець вводу з $і вставляємо подачу рядків разом із самим входом (використовуючи $_).

T`lL`Ro`.+$

Стадія транслітерації. Давайте почнемо з регулярним виразом: .+$. Він відповідає другій копії вводу (забезпечуючи відповідність до кінця рядка). Тож лише символи другого примірника будуть транслітеровані. Сама транслітерація використовує деякі дуже новітні функції. lі Lє класами символів для малих та малих букв відповідно. oпозначає інший набір символів транслітерації та Rреверсує його. Отже, два набори символів розширюються до:

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba

Ви помітите, що це міняє справу, роблячи кіт в Атбаші, але ми все одно зробимо остаточний випадок порівняння.

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

Тепер повертаємо другу копію. На жаль, у Retina поки що немає зручного способу для цього, тому нам доведеться переміщати одного персонажа з кінця вперед по черзі. Це робиться шляхом заміни сепаратора передачі рядків як маркера, частина якого ще не повернена. Ми співставляємо цю частину, але окремо фіксуємо останній символ. Цей персонаж йде попереду, а решта не змінюється. +Чи не говорить Retina зробити це кілька разів , поки не буде вже неможливо (тому що в кінці рядка).

i`^(.+)\1$

Нарешті ми перевіряємо, чи однакові дві струни. Це iробить шаблон нечутливим до регістру - зручно в .NET, це означає, що зворотні посилання також не залежать від регістру. Ви можете помітити, що у нас більше немає роздільника між оригінальним входом та модифікованою копією. Він нам не потрібен, оскільки вони однакової довжини, і якщо рядок тепер складається точно з тієї ж строки двічі (до регістру), то вони повинні бути оригінальною та модифікованою рядком. Якщо вам цікаво , що трапилося з завершальним переведенням рядка , яку ми використовували в якості маркера, він все ще там, але і в багатьох регулярних виразів ароматизаторів $також відповідає до того ланцюжка довжиною , якщо цей символ перекладу рядка.

Оскільки цей етап складається лише з одного рядка, він вважається етапом матчу, який підраховує кількість збігів. Якщо вхід є паліндром Атбаша, ми отримаємо рівно одну відповідність, а вихід - 1. Якщо ні, то цей регулярний вираз не збігається, і вихід буде 0.


Я думаю, що краще, щоб канали ліній були розділювачами сцени, а подушки були буквальнішими, ніж навпаки.
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Для зручності ви також можете вставляти лінійку годувань шляхом втечі послідовностей, \n в регулярному вираженні та $nзаміні, але це марно байти для гри в гольф. ;)
Мартін Ендер

5

GNU Sed, 105

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

Виходи 1 для тритуму та 0 для фальси.

Я спробував це зробити в Retina, але не зміг зрозуміти, як зберегти рядок перед транслітерацією Atbash для зворотного порівняння з after. Можливо, є кращий спосіб.

СЄПН yкоманди транслітерації залишає бажати багато кращого.


Так, "зберігання" речей все ще громіздко в Сітці. Вам потрібно буде дублювати рядок, а потім транслітерувати та повернути лише одну копію. Хочу в майбутньому додати якусь особливість розгалуження / розгалуження, але я ще не зовсім впевнений у деталях.
Мартін Ендер

А, я думаю, що бачу - я спробував зробити щось подібне, розділивши струни до і після двокрапки. Я впав з регулярним виразом в кінці T- я припускав, що він застосовується по черзі до кожного символу, але, якщо я розумію правильно, це стосується всього простору шаблону, що набагато корисніше
Digital Trauma

1
Регекс в T застосовується до вхідного рядка. Транслітерація є єдиною, що виконується в рамках відповідних регексів, і все незрівняне залишається незмінним. Регекс за замовчуванням до [\s\S]+цього, опустивши його, ви транслітеруєте все.
Мартін Ендер


Оскільки це 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)))

Ми перетворюємо вхід у великі регістри, а потім обчислюємо рядок Atbashed, віднімаючи всі порядки від 155, якщо вони знаходяться у великому діапазоні алфавіту.


4

Керф , 73 байти

Kerf - це власна мова в тій же загальній родині, що й APL, J та K. Можна писати криптовалютні, компактні лінійки та уникати використання явних циклів:

{[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]

Керф, мабуть, не збирається виграти багато змагань з кодогольфами, особливо проти цільових мов, але, можливо, варто задуматися, якщо вам подобається ідея мов сімейства APL, але вважати синтаксис занадто дивним. ( Відмова: Я - автор довідкового посібника для Kerf. )


3

Пролог, 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

С, 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який починається в кінці рядка. Потім ми петлюємо, рухаючись sі pвбік, і назустріч один одномуs доходимо до кінця. Це означає, що кожна пара символів буде перевірена двічі, але це економить пару байтів порівняно із зупинкою, як тільки вказівники перехрестяться.

При кожній ітерації ми перевіряємо, чи *pце лист. Якщо так, перевірте, чи *sзнаходиться в діапазоні літер (ASCII 64 вгору), а що, *pі *sдодайте до 27 (мод 32). Неписні листи, які перевищують 64 роки, не зможуть пройти тест, тому нам не потрібно перевірятиisalpha(*s) .

Якщо *pце не літера, то ми просто перевіряємо, чи дорівнює вона *s. У будь-якому випадку ми закінчуємо цикл перед sіp перекреслюємо.

Якщо s іp перекреслили, то кожна пара букв збігається правильно, тому ми повертаємо справжнє; інакше ми повернемо помилкові.

Тестова програма

Передайте рядки для тестування як аргументи командного рядка. Це дає правильний вихід для всіх тестових випадків. Немає поставленої вимоги до порожнього рядка; моя реалізація повертає помилку для цього вводу.

#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

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

Пітон, 156 112 байт

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, щоб розмістити повідомлення майже так, як я збирався дописувати перед собою. Але мені потрібно підтвердити, це моя робота, і я це робив самостійно .

На основі відповіді Джулії від Алекса А. Спробуйте тут


Після цього виникає непотрібний пробіл .get(i,i). +1.
Yytsi

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

Рубі, 79 77 байт

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

Приймає слово для тестування як аргумент командного рядка. Виходить із кодом 0 (який є істинним для оболонки), якщо аргумент є паліндром atbash, або з іншим кодом 1.


1
Невже putsрезультат не буде коротшим, ніж вихід з трійкою?
кіт

FYI $*- псевдонім для ARGV.
Йорданія

1

Рубін, 56 байт

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

Це анонімна функція, яка бере рядок і повертає trueабо false. Це досить незграбно: щоб зберегти кілька байтів, він використовує руйнівний варіант upcase!після нього). upcase!на жаль, повертається, nilякщо нічого не змінюється (як і всі числові введення), тому деякі байти втрачаються, намагаючись вирішити це. Ще працює тхо :)


1

MATLAB, 61 байт

Не найкоротше рішення, але все ж цікаве

f=@(a)~any(changem(upper(a),90:-1:65,65:90)-fliplr(upper(a)))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.