Atbash Tự Palindromes


27

Hãy xem xét chuyển đổi 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

Trong đó A ⇔ Z và L O, ví dụ: Có một thuộc tính thú vị mà một số từ chia sẻ. Khi một số chuỗi được dịch sang tương đương atbash của chúng, bản dịch cho biết là từ gốc bị đảo ngược. Tôi gọi những Atbash Self Palindromes này .

Ví dụ: hãy dịch WIZARD :

W → D
Tôi → R
Z → A
A → Z
R → tôi
D → W

Kết quả là DRAZIW , được WIZARD đảo ngược. Do đó, WIZARD là một palindrom tự atbash.

Mục tiêu Đưa ra một chuỗi các ký tự ASCII có thể in được, xuất hoặc trả về một giá trị trung thực nếu chuỗi đó là một bảng tự đánh giá và một giá trị falsey khác. (Điều này được thực hiện thông qua STDIN, tương đương gần nhất, đầu vào chức năng, v.v. Nếu ngôn ngữ của bạn không thể thực hiện bất kỳ ngôn ngữ nào trong số này, hãy cân nhắc chọn một ngôn ngữ khác mà bạn có thể mã hóa đầu vào.) Bạn nên thực hiện trường hợp này một cách vô cảm. Nếu đầu vào là một palindrom và không bị ảnh hưởng bởi atbash seqeunce, bạn vẫn nên xuất đúng, vì bản thân palindrom + là một palindrom. Đây là một , vì vậy chương trình ngắn nhất tính bằng byte sẽ thắng.

Các trường hợp thử nghiệm

"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

Bảng xếp hạng

Đoạn trích Stack ở cuối bài đăng này tạo ra danh mục từ các câu trả lời a) dưới dạng danh sách các giải pháp ngắn nhất cho mỗi ngôn ngữ và b) dưới dạng bảng xếp hạng tổng thể.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

## Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

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

Nếu bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ của thông dịch viên), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

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

Bạn cũng có thể đặt tên ngôn ngữ thành liên kết sau đó sẽ hiển thị trong đoạn trích:

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



4
AtBash thực sự không phải là một điều mới. Đó là sự chuyển đổi chữ Hê-bơ-rơ Kabala (Do Thái huyền bí) tương đương với điều này. Vì tiếng Do Thái chỉ được viết bằng wovels, bất kỳ chuỗi ký tự nào cũng có thể được đọc bằng cách chèn wovels ngẫu nhiên. ATB (a) SH là một bản ghi nhớ để chuyển đổi Alef (chữ cái đầu tiên trong tiếng Do Thái) thành Tav (cuối cùng), Beis (thứ hai) thành SHin (tiếp theo cuối cùng).
Adám

1
Hãy xem xét cho -1000000 điểm nếu mã giải pháp của ai đó tự nó là một bảng tự đánh giá? : p
kojiro

3
@kojiro Không tầm thường trái ngược với code {Comment-symbol}{Atbash'ed Comment-symbol} Atbash'ed code...
Adám

1
@ mbomb007 Tôi đã nói rằng tôi có thể cung cấp tiền thưởng nếu chương trình không cần thiết như vậy được tìm thấy
Conor O'Brien

Câu trả lời:


8

RX , 9 8 byte

Lấy cảm hứng từ Retina, tôi đã làm điều này vài ngày trước. Mã số:

prR`w$rM

Giải trình:

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.

Hãy thử nó ở đây !


Vậy làm thế nào để ngôn ngữ thực sự hoạt động? Đây có phải là một số loại ngôn ngữ xử lý chuỗi dựa trên ngăn xếp? Điều này thực sự ấn tượng, nhưng theo như tôi có thể nói là không có cách nào lặp lại ngôn ngữ này, điều đó có nghĩa là rất khó có khả năng này đáp ứng các tiêu chuẩn của chúng tôi về ngôn ngữ lập trình ở giai đoạn này.
Martin Ender

@ MartinBüttner Ngôn ngữ này chủ yếu dựa trên việc xử lý đầu vào bằng mô hình ngăn xếp. Nó không sử dụng số nguyên (và có lẽ sẽ không bao giờ). Tôi đã thực hiện một vòng lặp, nhưng phiên bản đó chưa được phát hành.
Ad Nam

@Martin Regexes có khả năng tự kiểm tra tính nguyên thủy, vì vậy tôi khá chắc chắn rằng điều này là hợp lệ.
lirtosiast

@ThomasKwa Theo như tôi có thể thấy, trình thông dịch không sử dụng bất kỳ biểu thức chính quy thực tế nào.
Martin Ender

@Martin Hmm, bạn nói đúng.
lirtosiast

11

Bình thường, 10 9 byte

qJrz0_XJG

Hãy thử fiddle trực tuyến này hoặc xác minh tất cả các trường hợp thử nghiệm cùng một lúc.

Giải trình

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

3
Vì bạn đang sử dụng rz0hai lần, không phải là ngắn hơn để lưu nó vào một biến sao?
xnor

1
Giống như @xnor gợi ý, q_Jrz0XJGngắn hơn một byte.
PurkkaKoodari

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)

Đây là hàm lambda chấp nhận một chuỗi và trả về một chuỗi. Để gọi nó, gán nó cho một biến.

Ung dung:

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

Đồ dùng Bash + Linux, 56

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

Xuất ra chuỗi trống cho Truthy và một cái gì đó giống như - /dev/fd/63 differ: byte 1, line 1cho Falsey. Nếu điều này không được chấp nhận thì chúng ta có thể thêm -s3 byte và sử dụng mã trả về Unix tiêu chuẩn là 0 cho Thành công (Sự thật) và 1 cho Thất bại (Falsey).


5

Võng mạc , 44 byte

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

In 1hoặc 0. Số lượng byte giả định rằng tệp được mã hóa theo tiêu chuẩn ISO 8859-1.

Hãy thử trực tuyến!

Câu trả lời này phần lớn được lấy cảm hứng từ câu trả lời quyến rũ của DigitalTrauma nhưng sau đó tôi đoán rằng không có nhiều cách tiếp cận với thử thách này ngay từ đầu.

Giải trình

Bất cứ khi nào bạn nhìn thấy a , điều đầu tiên Retina làm sau khi chia mã thành các dòng là thay thế tất cả các hành hương đó bằng các đường truyền. Điều này cho phép bao gồm các nguồn cấp dữ liệu cho một byte mặc dù các nguồn cấp là phân tách giai đoạn của Retina.

$
¶$_

Chúng tôi bắt đầu bằng cách nhân đôi đầu vào. Chúng tôi khớp phần cuối của đầu vào với $và chèn một nguồn cấp dữ liệu cùng với chính đầu vào (sử dụng $_).

T`lL`Ro`.+$

Một giai đoạn chuyển ngữ. Hãy bắt đầu với regex : .+$. Nó khớp với bản sao thứ hai của đầu vào (bằng cách đảm bảo khớp cho đến hết chuỗi). Vì vậy, chỉ các ký tự trong bản sao thứ hai sẽ được phiên âm. Bản thân phiên âm sử dụng một số tính năng rất gần đây. lLlà các lớp ký tự cho chữ thường và chữ thường, tương ứng. ođề cập đến bộ ký tự khác của phiên âm và Rđảo ngược nó. Vì vậy, hai bộ ký tự mở rộng thành:

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba

Bạn sẽ nhận thấy rằng điều này hoán đổi trường hợp trong khi thực hiện Atpash cypher, nhưng dù sao chúng ta cũng sẽ thực hiện trường hợp so sánh cuối cùng - không nhạy cảm.

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

Bây giờ chúng tôi đảo ngược bản sao thứ hai. Thật không may, Retina chưa có cách thuận tiện để thực hiện điều đó, vì vậy chúng tôi sẽ phải di chuyển một nhân vật từ đầu đến cuối cùng một lúc. Điều này được thực hiện bằng cách tái sử dụng trình phân tách dòng cấp dưới dạng điểm đánh dấu phần chưa được đảo ngược. Chúng tôi khớp phần đó nhưng bắt riêng nhân vật cuối cùng. Nhân vật đó đi phía trước, và phần còn lại không thay đổi. Việc +bảo Retina thực hiện việc này nhiều lần cho đến khi không thể thực hiện được nữa (vì ở cuối chuỗi).

i`^(.+)\1$

Cuối cùng, chúng tôi kiểm tra xem hai chuỗi có giống nhau không. Điều này ilàm cho mẫu không phân biệt chữ hoa chữ thường - một cách thuận tiện, trong .NET, điều này có nghĩa là các phản hồi cũng không phân biệt chữ hoa chữ thường. Bạn có thể nhận thấy rằng chúng tôi không còn có dấu phân cách giữa đầu vào ban đầu và bản sao đã sửa đổi. Mặc dù vậy, chúng ta không cần một cái vì chúng có cùng độ dài và nếu bây giờ chuỗi bao gồm chính xác cùng một chuỗi hai lần (tùy theo trường hợp), thì chúng phải là chuỗi gốc và chuỗi đã sửa đổi. Nếu bạn đang tự hỏi điều gì đã xảy ra với linefeed trailing mà chúng ta đã sử dụng làm điểm đánh dấu, thì nó vẫn ở đó, nhưng trong nhiều hương vị regex $cũng khớp trước ký tự cuối cùng của chuỗi nếu ký tự đó là linefeed.

Vì giai đoạn này chỉ bao gồm một dòng duy nhất, nên nó được coi là giai đoạn khớp, trong đó tính số lượng trận đấu. Nếu đầu vào là một bảng màu Atbash, chúng ta sẽ có chính xác một trận đấu và đầu ra là 1. Nếu không, regex này sẽ không khớp và đầu ra sẽ là 0.


Tôi đoán sẽ tốt hơn nếu có các đường kẻ là dải phân cách sân khấu và người hành hương là nghĩa đen hơn là ngược lại.
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Để thuận tiện, bạn cũng có thể chèn các nguồn cấp dữ liệu bằng các chuỗi thoát, \n trong biểu thức chính quy và $nthay thế, nhưng điều đó gây lãng phí byte cho việc chơi gôn. ;)
Martin Ender

5

GNU Sed, 105

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

Kết quả 1 cho sự thật và 0 cho falsey.

Tôi đã cố gắng thực hiện điều này trong Retina, nhưng không thể tìm ra cách lưu chuỗi trước khi phiên âm Atbash để so sánh ngược với sau. Có lẽ có một cách tốt hơn.

yLệnh chuyển ngữ của Sed để lại rất nhiều mong muốn.


Vâng, "lưu trữ" mọi thứ vẫn còn cồng kềnh ở Retina. Bạn sẽ phải sao chép chuỗi và sau đó chuyển ngữ và chỉ đảo ngược một bản sao. Tôi muốn thêm một số tính năng phân nhánh / forking trong tương lai, nhưng tôi không chắc chắn lắm về các chi tiết.
Martin Ender

Ah, tôi nghĩ rằng tôi thấy - tôi đã thử làm một cái gì đó tương tự bằng cách tách các chuỗi trước và sau bằng một dấu hai chấm. Tôi đã rơi xuống với regex vào cuối T- Tôi đã giả sử nó lần lượt áp dụng cho từng nhân vật, nhưng nếu sự hiểu biết của tôi là đúng, nó sẽ áp dụng cho toàn bộ không gian mẫu, hữu ích hơn nhiều
Chấn thương kỹ thuật số

1
Regex trong T được áp dụng cho chuỗi đầu vào. Việc phiên âm là lần duy nhất được thực hiện trong các trận đấu của regex đó và mọi thứ không thể so sánh được giữ nguyên. Regex mặc định [\s\S]+như vậy bằng cách bỏ qua nó, bạn đang phiên âm mọi thứ.
Martin Ender


Vì đó là GNU sed, bạn có thể lưu một byte bằng cách giao dịch -rcờ cho dấu gạch chéo ngược trong \(\). Tôi đồng ý với bạn về ylệnh!
Toby Speight

4

, 15 ký tự / 30 byte

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

Try it here (Firefox only).

Giải trình

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

Parenthetic, 658 byte

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

Chỉ hoạt động cho tất cả các mũ mà không có khoảng trắng ngay bây giờ, sử dụng phiên bản sửa đổi của tập lệnh này để nó hỗ trợ đọc từ 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'

Giải trình

(
  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
Bạn có muốn mã của bạn dài nhất không? : P
Zorgatone

4

Con trăn 3 90 85 byte

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

Chúng tôi chuyển đổi đầu vào thành chữ hoa và sau đó tính toán chuỗi Atbashing bằng cách trừ tất cả các số thứ tự từ 155 nếu chúng nằm trong phạm vi bảng chữ cái viết hoa.


4

Kerf , 73 byte

Kerf là ​​một ngôn ngữ độc quyền trong cùng một họ với APL, J và K. Có thể viết các mật mã nhỏ gọn, khó hiểu và tránh sử dụng các vòng lặp rõ ràng:

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

Tuy nhiên, việc sử dụng các bí danh đánh vần cho các lệnh thay vì các ký hiệu tốc ký và sử dụng các định danh có ý nghĩa làm cho chương trình rõ ràng hơn và khá dễ theo dõi ngay cả khi bạn không quen thuộc với 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]
}

Trong hành động:

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 có lẽ sẽ không chiến thắng được rất nhiều cuộc thi về codegolf, đặc biệt là chống lại các ngôn ngữ được xây dựng có mục đích, nhưng nó có thể đáng để mày mò nếu bạn thích ý tưởng về ngôn ngữ gia đình APL nhưng lại thấy cú pháp quá kỳ lạ. ( Tuyên bố miễn trừ trách nhiệm: Tôi là tác giả của tài liệu tham khảo cho 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=[]).

Điều này được gọi với một nguyên tử là đầu vào, ví dụ a('WIZARD')..


3

JavaScript (ES6), 91

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

KIỂM TRA

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

Như câu hỏi đã chỉ định các ký tự ASCII, điều này không xử lý bất kỳ mã hóa nào khác.

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

Giải trình

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

Chúng tôi tạo một con trỏ pbắt đầu ở cuối chuỗi. Chúng tôi sau đó lặp lại, di chuyển cả hai spvề phía nhaus đến cuối cùng. Điều này có nghĩa là mỗi cặp ký tự sẽ được kiểm tra hai lần, nhưng điều này sẽ tiết kiệm được một vài byte so với việc dừng lại ngay khi con trỏ đi qua.

Ở mỗi lần lặp, chúng tôi kiểm tra xem có phải *plà một chữ cái không. Nếu vậy, hãy kiểm tra xem đó có *snằm trong phạm vi các chữ cái (ASCII 64 trở lên) không, *p*sthêm vào đó là 27 (mod 32). Các chữ cái trên 64 sẽ không vượt qua bài kiểm tra đó, vì vậy chúng tôi không cần kiểm tra isalpha(*s).

Nếu *pkhông phải là một chữ cái, thì chúng ta chỉ cần kiểm tra xem nó có bằng không *s. Trong cả hai trường hợp, chúng tôi chấm dứt vòng lặp trước spvượt qua.

Nếu spđã vượt qua, thì mỗi cặp chữ cái khớp chính xác, vì vậy chúng tôi trả về đúng; nếu không chúng tôi trả lại sai.

Chương trình kiểm tra

Truyền chuỗi để được kiểm tra làm đối số dòng lệnh. Điều này tạo ra đầu ra chính xác cho tất cả các trường hợp thử nghiệm. Không có yêu cầu được cung cấp cho chuỗi trống; việc thực hiện của tôi trả về false cho đầu vào đó.

#include <stdio.h>

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

bạn có thể thả fkhai báo kiểu cho nguyên mẫu kiểu K & R:f(char*s)
mèo

3

Perl 5, 70 byte

Một chương trình con:

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

Xem nó trong sử dụng:

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


2

CJam, 18 byte

qeu_'[,65>_W%erW%=

Dùng thử trực tuyến

Hoạt động bằng cách chuyển đổi đầu vào thành chữ hoa, thực hiện dịch các chữ cái, lật chuỗi và kiểm tra sự bằng nhau.


2

Japt, 30 27 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Điều này chủ yếu dựa trên câu trả lời Japt của tôi trên 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

Con trăn, 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]

Về cơ bản, nó tạo ra một từ điển dịch thuật với các chữ cái in hoa và đầu vào được viết hoa (nếu mọi thứ thay vào đó là chữ thường, điều đó sẽ thêm 5 byte). Sau đó, đối với mỗi ký tự trong đầu vào viết hoa, hãy thực hiện dịch và nối vào danh sách trừ khi ký tự không có trong bảng chữ cái, trong trường hợp này sẽ nối thêm ký tự đó. Tham gia toàn bộ danh sách và so sánh với danh sách đảo ngược.

Hét lên @Artyer vì đã đăng gần như chính xác như tôi sẽ đăng trước tôi. Nhưng tôi cần xác nhận, đây là công việc của tôi và tôi đã làm điều này một cách độc lập .

Dựa trên câu trả lời của Julia bởi Alex A. Hãy thử tại đây


Có một khoảng trắng không cần thiết sau .get(i,i). +1.
Yytsi

1

05AB1E , 8 byte (không cạnh tranh)

Ngôn ngữ này sử dụng các tính năng trì hoãn thử thách và do đó không cạnh tranh.

Mã số:

lDAAR‡RQ

Giải trình:

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

Hãy thử trực tuyến!


1

Yếu tố, 118 113 byte

Đây là một chức năng ẩn danh.

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

Tôi không biết một cách ngắn hơn để tạo ra một mảng kết hợp của bảng chữ cái: 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)))

Có thể cắt nó xuống một hàm ẩn danh duy nhất, cắt giảm thêm 10 byte (khai báo) nhưng tôi chưa tìm được cách nào.


1

Ruby, 79 77 byte

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

Chấp nhận từ để kiểm tra như một đối số dòng lệnh. Thoát với mã 0 (là trung thực với trình bao) nếu đối số là một bảng tự đánh giá, hoặc với mã 1 nếu không.


1
Sẽ không có putskết quả ngắn hơn lối ra với một ternary?
mèo

FYI $*là một bí danh cho ARGV.
Jordan

1

Ruby, 56 byte

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

Đây là một hàm ẩn danh có một chuỗi và trả về truehoặc false. Nó khá vụng về: Để tiết kiệm một số byte, nó sử dụng biến thể phá hủy của upcase(với một !sau nó). upcase!không may trả về nilnếu không có gì thay đổi (như tất cả các đầu vào số), vì vậy một số byte bị mất khi cố gắng xử lý điều đó. Vẫn hoạt động tho :)


1

MATLAB, 61 byte

Không phải là giải pháp ngắn nhất, nhưng vẫn thú vị

f=@(a)~any(changem(upper(a),90:-1:65,65:90)-fliplr(upper(a)))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.