맹렬한 자기 회문


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 Self Palindromes 라고 부른다 .

예를 들어, WIZARD를 번역 해 봅시다 :

W → D
나는 → R
Z → A
A → Z
R → I
D → W

결과는 DRAZIW 이며 WIZARD는 반대로됩니다. 따라서 WIZARD 는 맹렬한 자기 회문입니다.

목표 인쇄 가능한 ASCII 문자 문자열이 제공되면 해당 문자열이 atbash 자체 회문이면 true 값을, 그렇지 않으면 false 값을 출력하거나 반환합니다. (이것은 STDIN, 가장 가까운 등가, 기능적 입력 등을 통해 수행됩니다. 언어에서 이러한 작업을 수행 할 수없는 경우 다른 언어선택 하여 입력을 하드 코딩 할 수 있습니다.) 대소 문자를 구분하지 않아야합니다. 입력이 회문 (palindrome)이고 atbash seqeunce의 영향을받지 않는 경우 회문 + 자체가 회문이기 때문에 여전히 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

리더 보드

이 게시물의 맨 아래에있는 스택 스 니펫은 답변 a) 언어 당 가장 짧은 솔루션 목록으로, b) 전체 리더 보드로 카탈로그를 생성합니다.

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

## 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는 실제로 새로운 것이 아닙니다. 이것에 해당하는 카발라 (유대 신비주의) 히브리어 문자 변환입니다. 히브리어는 삽으로 만 작성되므로 임의의 삽을 삽입하여 모든 문자열을 읽을 수 있습니다. ATB (a) SH는 Alef (첫 번째 히브리어 문자)를 Tav (마지막)로, Beis (두 번째)를 SHin (다음-마지막)으로 변환하기위한 니모닉입니다.
Adám

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.

여기에서 보십시오 !


언어 자체는 실제로 어떻게 작동합니까? 일종의 스택 기반 문자열 처리 언어입니까? 이것은 정말 인상적이지만 언어를 반복 할 수있는 방법이 없다고 말할 수 있는 한이 단계에서 프로그래밍 언어의 표준을 충족 시킬 가능성은 거의 없습니다 .
Martin Ender 2016 년

@ MartinBüttner이 언어는 주로 스택 모델을 사용한 입력 처리를 기반으로합니다. 정수를 사용하지 않으며 아마도 절대 사용하지 않을 것입니다. 루프를 구현했지만 해당 버전이 아직 릴리스되지 않았습니다.
Adnan

@Martin Regexes는 자체 테스트를 수행 할 수 있으므로 이것이 유효하다는 것을 확신합니다.
lirtosiast

@ThomasKwa 내가 볼 수있는 한, 인터프리터는 실제 정규 표현식을 사용하지 않습니다.
Martin Ender

@Martin 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)

문자열을 받아들이고 문자열을 반환하는 람다 함수입니다. 호출하려면 변수에 지정하십시오.

언 골프 드 :

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

배쉬 + 리눅스 유틸리티, 56

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

Truthy 및 - /dev/fd/63 differ: byte 1, line 1Falsey 와 같은 빈 문자열을 출력합니다 . 이것이 허용되지 않으면 -s3 바이트를 더 추가하고 성공 (Truthy)에 0, 실패 (Falsey)에 1의 표준 Unix 리턴 코드를 사용할 수 있습니다 .


5

레티 나 , 44 바이트

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

인쇄 1또는 0. 바이트 수는 파일이 ISO 8859-1로 인코딩 된 것으로 가정합니다.

온라인으로 사용해보십시오!

이 답변은 대부분 DigitalTrauma의 sed 답변에서 영감을 얻었 지만 다시 한 번이 도전에 대한 많은 접근 방식이 없다고 생각합니다.

설명

을 볼 때마다 코드를 여러 줄로 나눈 후 Retina가 수행하는 첫 번째 일은 모든 순례자를 줄 바꿈으로 바꾸는 것입니다. 이렇게하면 줄 바꿈이 Retina의 단계 구분자 인 경우에도 단일 바이트에 대한 줄 바꿈을 포함 할 수 있습니다.

$
¶$_

입력을 복제하여 시작합니다. 입력의 끝을 일치시키고 입력과 함께 $줄 바꿈을 삽입합니다 ( $_).

T`lL`Ro`.+$

음역 단계. 정규식으로 시작합시다 .+$. 문자열의 끝까지 일치하게함으로써 입력의 두 번째 사본과 일치합니다. 따라서 두 번째 사본의 문자 만 음역됩니다. 음역 자체는 최신 기능을 사용합니다. lL하부 및 상부 케이스 문자에 대한 문자 클래스는 각각이다. o음역의 다른 문자 집합을 참조하고 R반전합니다. 따라서 두 문자 세트는 다음과 같이 확장됩니다.

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba

이것이 Atbash 사이퍼를 수행하는 동안 케이스를 교체한다는 것을 알 수 있지만 어쨌든 대소 문자를 구분하지 않고 최종 비교를 수행합니다.

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

이제 두 번째 사본을 뒤집습니다. 불행히도 Retina는 아직 그렇게 할 수있는 편리한 방법이 없으므로 한 번에 한 문자 씩 끝에서 앞으로 이동해야합니다. 이것은 라인 피드 세퍼레이터를 부품이 아직 반전되지 않은 마커로 교체하여 수행됩니다. 우리는 그 부분과 일치하지만 마지막 문자를 개별적으로 캡처합니다. 그 캐릭터는 앞으로 가고 나머지는 변경되지 않습니다. The +Retina는 더 이상 가능하지 않을 때까지 ( 문자열의 끝에 있기 때문에 ) 이것을 반복적으로 수행하도록 지시 합니다.

i`^(.+)\1$

마지막으로 두 문자열이 같은지 확인합니다. 는 i역 참조는 대소 문자를 구별이 의미하는 것이, .NET에서 편리하게 - 대소 문자를 구별 패턴을 만든다. 더 이상 원본 입력과 수정 된 사본 사이에 구분 기호가없는 것을 알 수 있습니다. 길이가 같기 때문에 문자열이 필요하지 않으며 문자열이 동일한 문자열로 정확히 두 번 (대소 문자까지) 구성된 경우 원래 문자열과 수정 된 문자열이어야합니다. 우리가 마커로 사용한 후행 줄 바꿈이 어떻게되는지 궁금하다면 여전히 거기에 있지만, 많은 정규 표현식 에서는 줄 바꿈 문자 인 경우 문자열의 마지막 문자 앞에$ 일치 합니다.

이 단계는 한 줄로만 구성되므로 일치 횟수로 간주되는 일치 단계로 간주됩니다. 입력이 Atbash palindrome이면 정확히 하나의 일치 항목을 얻게되고 출력은 1입니다. 그렇지 않으면이 정규식이 일치하지 않고 출력은입니다 0.


줄 바꿈을 스테이지 구분 기호로 사용하고 필로우는 문자 그대로 문자 그대로 사용하는 것이 좋습니다.
코너 오브라이언

@ CᴏɴᴏʀO'Bʀɪᴇɴ 편의상 이스케이프 시퀀스, \n 정규식 및 $n대체 형식으로 줄 바꿈을 삽입 할 수도 있지만 이는 골프를 위해 낭비되는 바이트입니다. ;)
Martin Ender 2016 년

5

GNU 세드, 105

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

truey이면 1을 출력하고 false이면 0을 출력합니다.

Retina 에서이 작업을 시도했지만 Atbash 음역 전에 문자열을 저장하여 after와 역 비교하는 방법을 알 수 없었습니다. 아마도 더 좋은 방법이있을 것입니다.

Sed의 y음역 명령은 많이 남아 있습니다.


네, "저장"은 레티 나에서 여전히 번거 롭습니다. 문자열을 복제 한 다음 하나의 사본 만 음역하고 뒤집어 야합니다. 앞으로 일종의 분기 / 포킹 기능을 추가하고 싶지만 아직 세부 사항에 대해 잘 모르겠습니다.
Martin Ender

아, 나는 생각한다-나는 전후 문자열을 콜론으로 분리하여 비슷한 것을 시도했다. 나는 말에 정규식 아래로 떨어졌다 T- 나는 그것이 차례로 각각의 문자에 적용 가정했지만, 내 이해가 옳다면 그것은 훨씬 더 유용 전체 패턴 공간에 적용
디지털 외상

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

파이썬 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

커프 , 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]

커프는 아마도 특별히 개발 된 언어와 비교하여 많은 코드 골프 경쟁에서 이길 수는 없지만 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

자바 스크립트 (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문자열의 끝에서 시작 하는 포인터 를 만듭니다 . 우리는 다음 루프, 모두 이동 s하고 p서로를 향해을s 끝까지 도달합니다. 즉, 모든 문자 쌍을 두 번 검사하지만 포인터가 교차되는 즉시 중지하는 것과 비교하여 몇 바이트를 절약합니다.

반복 할 때마다 *p문자 인지 확인합니다 . 그렇다면 *s글자 범위 (ASCII 64 이상)인지 확인 *p하고 *s최대 27 개 (mod 32)까지 추가하십시오. 64 개가 넘는 편지가 아닌 경우 해당 테스트에 실패하므로 확인할 필요가 없습니다 isalpha(*s).

*p문자가 아닌 경우 단순히 문자가 같은지 테스트합니다 *s. 두 경우 모두 루프를 종료 s하고 p교차합니다.

만약 sp 교차 한 우리가 true를 반환하므로, 다음 문자의 모든 쌍을 올바르게 일치; 그렇지 않으면 우리는 거짓을 반환합니다.

테스트 프로그램

테스트 할 문자열을 명령 행 인수로 전달하십시오. 모든 테스트 사례에 대해 올바른 출력을 생성합니다. 빈 문자열에 대한 요구 사항은 없습니다. 내 구현은 해당 입력에 대해 false를 반환합니다.

#include <stdio.h>

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

fK & R 스타일 프로토 타입에 대한 형식 선언을 삭제할 수 있습니다 .f(char*s)
cat

3

펄 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

apt, 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에게 소리 쳤다. 그러나 나는 확인해야한다. 이것은 나의 일이고 나는 이것을 독립적으로했다 .

Alex A의 Julia 답변을 바탕으로 시도하십시오.


뒤에 불필요한 공백이 .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 바이트

이것은 익명의 기능입니다.

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

나는 알파벳의 연관 배열을 생성하는 더 짧은 방법을 모른다 : c


1

클로저, 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

테스트 할 단어를 명령 줄 인수로 받아들입니다. 인수가 atbash 자체 회 문인 경우 코드 0 (쉘에 진실 임)으로 종료하거나 그렇지 않으면 코드 1로 종료합니다.


1
하지 않을까요 puts삼항와 출구보다 짧게 결과를 보내고?
cat

참고 $*로의 별칭입니다 ARGV.
Jordan

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)))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.