एतबाश सेल्फ पालिंड्रोम्स


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 is Z और L, O, उदा। एक दिलचस्प संपत्ति है जो कुछ शब्द साझा करते हैं। जब कुछ तारों को उनके अटैश-समतुल्य अनुवाद किया जाता है, तो कहा जाता है कि अनुवाद मूल शब्द है। मैं इन Atbash स्व Palindromes कहते हैं

एक उदाहरण के रूप में, हम WIZARD का अनुवाद करते हैं :

डब्ल्यू → डी
मैं → आर
जेड → ए
ए → जेड
आर → आई
डी → डब्ल्यू

नतीजा DRAZIW है , जो कि WIZARD उलट है। इस प्रकार, WIZARD एक atbash self palindrome है।

उद्देश्य मुद्रण योग्य ASCII वर्णों की एक स्ट्रिंग को देखते हुए, आउटपुट या एक सत्य मान लौटाते हैं यदि वह स्ट्रिंग एक एटबश स्वयं पैलिंड्रोम है, और एक फ़ासी मूल्य अन्यथा। (यह STDIN, निकटतम समकक्ष, कार्यात्मक इनपुट, आदि के माध्यम से किया जाता है। यदि आपकी भाषा इनमें से कुछ भी नहीं कर सकती है, तो एक अलग भाषा चुनने पर विचार करें जो आप इनपुट को हार्डकोड कर सकते हैं।) आपको यह मामला असंवेदनशील होना चाहिए। यदि इनपुट एक palindrome है और atbash seqeunce द्वारा अप्रभावित है, तो आपको अभी भी सच होना चाहिए, क्योंकि एक 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

लीडरबोर्ड

इस पोस्ट के निचले हिस्से में स्टैक स्निपेट उत्तर से सूची बनाता है) क) प्रति भाषा में सबसे छोटे समाधान की सूची के रूप में और बी) एक समग्र लीडरबोर्ड के रूप में।

यह सुनिश्चित करने के लिए कि आपका उत्तर दिखाई देता है, कृपया अपना उत्तर शीर्षक मार्कडाउन टेम्पलेट का उपयोग करके शीर्षक के साथ शुरू करें:

## 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 वास्तव में एक नई चीज नहीं है। यह इसके बराबर काबाला (यहूदी रहस्यवाद) हिब्रू पत्र परिवर्तन है। चूंकि हिब्रू केवल फावड़ियों के साथ लिखी जाती है, किसी भी अक्षर स्ट्रिंग को यादृच्छिक फावड़ियों को सम्मिलित करके पढ़ा जा सकता है। एटीबी (ए) एसएच एलेफ (पहला हिब्रू पत्र) को तव (अंतिम), बीइस (दूसरा) को शाइन (अगले-से-अंतिम) में बदलने के लिए एक महामारी है।
आदम

1
-1000000 अंक देने पर विचार करें कि क्या किसी का समाधान कोड स्वयं एक Atbash स्वयं पैलिंड्रोम है? : पी
कोजिरो '

3
@kojiro गैर-तुच्छ के रूप में code {Comment-symbol}{Atbash'ed Comment-symbol} Atbash'ed code...
Adám

1
@ mbomb007 मैंने कहा कि मैं इस तरह के एक नॉनवेज प्रोग्राम पाया जाता है तो मैं एक इनाम की पेशकश कर सकता हूं
कॉनर ओ'ब्रायन

जवाबों:


8

आरएक्स , 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.

यहाँ यह कोशिश करो !


तो भाषा वास्तव में कैसे काम करती है? क्या यह स्टैक-आधारित स्ट्रिंग प्रसंस्करण भाषा का कुछ प्रकार है? यह वास्तव में प्रभावशाली है, लेकिन जहां तक ​​मैं बता सकता हूं कि भाषा में लूप करने का कोई तरीका नहीं है, जिसका अर्थ है कि यह अत्यधिक संभावना नहीं है कि यह इस स्तर पर एक प्रोग्रामिंग भाषा के हमारे मानकों को पूरा करता है ।
मार्टिन एंडर

@ मार्टिनबटनर यह भाषा मुख्य रूप से स्टैक मॉडल का उपयोग करके इनपुट के प्रसंस्करण पर आधारित है। यह पूर्णांक (और शायद कभी नहीं) का उपयोग नहीं करता है। मैंने एक लूप लागू किया है, लेकिन वह संस्करण अभी तक जारी नहीं किया गया है।
अदनान

@ मर्टिन रेगेक्स अपने दम पर प्राण परीक्षण में सक्षम हैं, इसलिए मुझे पूरा यकीन है कि यह मान्य है।
lirtosiast

@ThomasKwa जहाँ तक मैं देख सकता हूँ, दुभाषिया किसी भी वास्तविक नियमित अभिव्यक्ति का उपयोग नहीं करता है।
मार्टिन एंडर

@ मर्टिन हम्म, आप सही कह रहे हैं।
lirtosiast

11

अजगर, 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एक बाइट कम है।
पुरकाकूदरी

6

जूलिया, 96 बाइट्स

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

यह एक लंबोतरा फ़ंक्शन है जो एक स्ट्रिंग को स्वीकार करता है और एक स्ट्रिंग लौटाता है। इसे कॉल करने के लिए, इसे एक वैरिएबल पर असाइन करें।

Ungolfed:

function f(s::AbstractString)
    # Get all of the uppercase letters A-Z
    u = map(Char, 65:90)

    # Create a dictionary for the transformation
    D = Dict(zip(u, reverse(u)))

    # Uppercase the input
    S = uppercase(s)

    return join([get(D, c, c) for c in S]) == reverse(S)
end

5

बैश + लिनक्स के बर्तन, 56

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

ट्रू के लिए खाली स्ट्रिंग और फाल्सी के लिए कुछ की तरह - /dev/fd/63 differ: byte 1, line 1आउटपुट। यदि यह स्वीकार्य नहीं है, तो हम -sएक अतिरिक्त 3 बाइट्स के लिए जोड़ सकते हैं और सफलता (सच्चाई) के लिए 0 और असफलता (झूठी) के लिए मानक यूनिक्स रिटर्न कोड का उपयोग कर सकते हैं ।


5

रेटिना , 44 बाइट्स

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

प्रिंटों 1या 0। बाइट गिनती मानती है कि फ़ाइल आईएसओ 8859-1 के रूप में एन्कोडेड है।

इसे ऑनलाइन आज़माएं!

यह जवाब काफी हद तक DigitalTrauma के sed जवाब से प्रेरित था, लेकिन फिर मुझे लगता है कि पहली चुनौती में इस दृष्टिकोण के कई दृष्टिकोण नहीं हैं।

व्याख्या

जब भी आप एक देखते हैं , तो पहली बात यह है कि रेटिना को लाइनों में कोड को विभाजित करने के बाद उन सभी पायलटों को लाइनफीड के साथ बदलना है। यह एक ही बाइट के लिए लाइनफीड्स को शामिल करने की अनुमति देता है, भले ही लाइनफेट रेटिना के स्टेज सेपरेटर हो।

$
¶$_

हम इनपुट को डुप्लिकेट करके शुरू करते हैं। हम इनपुट के अंत के साथ मेल खाते हैं $और इनपुट के साथ ही लाइनफीड सम्मिलित करते हैं (उपयोग करते हुए $_)।

T`lL`Ro`.+$

एक लिप्यंतरण चरण। चलो regex के साथ शुरू करते हैं .+$:। यह इनपुट की दूसरी प्रति से मेल खाता है (यह सुनिश्चित करके कि मैच स्ट्रिंग के अंत तक जाता है)। इसलिए दूसरी प्रति में केवल अक्षरों का अनुवाद किया जाएगा। लिप्यंतरण ही कुछ हालिया विशेषताओं का उपयोग करता है। lऔर Lक्रमशः निचले और ऊपरी मामलों के अक्षरों के लिए वर्ण वर्ग हैं। oलिप्यंतरण के अन्य वर्ण सेट को संदर्भित करता है और Rइसे उलट देता है। तो दो वर्ण सेटों का विस्तार होता है:

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba

आप देखेंगे कि यह Atbash cypher करते समय मामले को स्वैप कर देता है, लेकिन हम वैसे भी अंतिम तुलना केस-असंवेदनशील तरीके से करेंगे।

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

अब हम दूसरी प्रति उल्टा करते हैं। दुर्भाग्य से, रेटिना के पास ऐसा करने के लिए एक सुविधाजनक तरीका नहीं है, इसलिए हमें एक समय में एक चरित्र को अंत से सामने की ओर ले जाना होगा। यह लाइनफ़ोर्स विभाजक को एक मार्कर के रूप में पुन: व्यवस्थित करके किया जाता है, जिसमें से एक हिस्सा अभी तक उलट नहीं किया गया है। हम उस हिस्से से मेल खाते हैं लेकिन अंतिम चरित्र को अलग से कैप्चर करते हैं। वह चरित्र सामने आता है, और शेष अपरिवर्तित होता है। +रेटिना यह बताता है बार-बार ऐसा करने के लिए जब तक यह नहीं रह गया है संभव है (क्योंकि स्ट्रिंग के अंत में होता है)।

i`^(.+)\1$

अंत में, हम जांचते हैं कि क्या दो तार समान हैं। iपैटर्न बनाता केस-संवेदी - सुविधा, .NET में, इस का मतलब है कि backreferences भी केस-संवेदी है। आप देख सकते हैं कि अब हमारे पास मूल इनपुट और संशोधित प्रति के बीच विभाजक नहीं है। हालांकि हमें एक की आवश्यकता नहीं है, क्योंकि वे एक ही लंबाई के हैं, और यदि स्ट्रिंग में अब एक ही स्ट्रिंग के दो बार (मामले तक) बिल्कुल होते हैं, तो उन मूल और संशोधित स्ट्रिंग होना चाहिए। यदि आप सोच रहे हैं कि हम एक मार्कर के रूप में उपयोग किए जाने वाले ट्रेलिंग लाइनफीड के साथ क्या हुआ, तो यह अभी भी है, लेकिन कई रेगेक्स फ्लेवर्स स्ट्रिंग के अंतिम चरित्र से पहले$ भी मेल खाते हैं यदि यह चरित्र एक लाइनफीड है।

चूंकि इस चरण में केवल एक ही रेखा होती है, इसलिए इसे एक मैच चरण के रूप में लिया जाता है, जो मैचों की संख्या को गिनता है। यदि इनपुट एक Atbash palindrome है, तो हमें ठीक एक मैच मिलेगा और आउटपुट है 1। यदि नहीं, तो यह regex मेल नहीं खाएगा और आउटपुट होगा 0


मुझे लगता है कि यह बेहतर है कि मंच के विभाजक होने के लिए लाइनफीड होना बेहतर है और इसके विपरीत पायलटों को शाब्दिक होना चाहिए।
कॉनर ओ'ब्रायन

@ C @O'Bʀɪᴇɴ सुविधा के लिए, आप एग्जिट सीक्वेंस में, \n रेगेक्स में और $nप्रतिस्थापन में भी लाइनफीड डाल सकते हैं , लेकिन यह गोल्फ के लिए बाइट्स व्यर्थ है। ;)
मार्टिन एंडर

5

जीएनयू सैड, 105

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

सत्य के लिए आउटपुट 1 और झूठी के लिए 0।

मैंने इसे रेटिना में करने की कोशिश की, लेकिन इसके बाद रिवर्स तुलना के लिए एटाबाश लिप्यंतरण से पहले स्ट्रिंग को बचाने के तरीके का पता नहीं लगा सका। शायद एक बेहतर तरीका है।

सैड की yलिप्यंतरण आदेश वांछित होने के लिए बहुत कुछ छोड़ देता है।


हां, रेटिना में "भंडारण" चीजें अभी भी बोझिल हैं। आपको स्ट्रिंग को डुप्लिकेट करना होगा और फिर केवल एक कॉपी को अनपढ़ और रिवर्स करना होगा। मैं भविष्य में कुछ प्रकार की शाखाओं में बंटवारे / जाली सुविधा को जोड़ना चाहता हूं, लेकिन मैं विवरणों के बारे में अभी निश्चित नहीं हूं।
मार्टिन एंडर

आह, मुझे लगता है कि मैं देख रहा हूं - मैंने एक बृहदान्त्र के साथ तार के पहले और बाद में अलग करके कुछ ऐसा ही करने की कोशिश की। मैं रेगेक्स के अंत में नीचे गिर गया T- मैं यह मान रहा था कि यह बदले में प्रत्येक वर्ण पर लागू होता है, लेकिन अगर मेरी समझ सही है, तो यह पूरे पैटर्न स्पेस पर लागू होता है, जो बहुत अधिक उपयोगी है
डिजिटल ट्रामा

1
टी में रेगेक्स को इनपुट स्ट्रिंग पर लागू किया जाता है। लिप्यंतरण उस रेगेक्स के मैचों के भीतर ही किया जाता है और बेजोड़ सब कुछ अपरिवर्तित रह जाता है। रेगेक्स [\s\S]+इसे छोड़ कर चूक करता है, आप हर चीज का अनुवाद कर रहे हैं।
मार्टिन एंडर


चूंकि यह जीएनयू सेड है, आप -rबैकस्लैश के लिए ( \(और) में ट्रेडिंग फ्लैग द्वारा एक बाइट बचा सकते हैं \)। मैं आपके साथ yआज्ञा पर सहमत हूँ !
स्पाइट

4

S, 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 बाइट्स

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

स्क्रिप्ट के इस संशोधित संस्करण का उपयोग करके अभी व्हॉट्सएप के बिना सभी कैप के लिए काम करता है, ताकि यह स्टड से पढ़ने का समर्थन करे:

#!/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
क्या आप चाहते हैं कि आपका कोड सबसे लंबा हो? : पी
जरगटोन

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 से घटाकर एटबशेड स्ट्रिंग की गणना करते हैं यदि वे अपरकेस वर्णमाला सीमा में हैं।


4

केर्फ , 73 बाइट्स

केर्फ एपीएल, जे और के के समान सामान्य परिवार में एक मालिकाना भाषा है। क्रिप्टोकरंसी, कॉम्पैक्ट ऑनलिनर्स लिखना और स्पष्ट छोरों के उपयोग से बचना संभव है:

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

हालांकि, शॉर्टहैंड प्रतीकों के बजाय आज्ञाओं के लिए वर्तनी-रहित उपनामों का उपयोग करना और सार्थक पहचानकर्ताओं का उपयोग करना कार्यक्रम को बहुत स्पष्ट करता है, और यदि आप केर्फ से परिचित नहीं हैं तो भी इसका पालन करना काफी आसान है:

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]

केर्फ़ शायद कोडगॉल्फ प्रतियोगिताओं का एक टन जीतने नहीं जा रहा है, विशेष रूप से उद्देश्य-निर्मित भाषाओं के खिलाफ, लेकिन अगर आप एपीएल-परिवार की भाषाओं के विचार को पसंद करते हैं, तो यह आपके लिए बहुत ही अजीब हो सकता है। ( अस्वीकरण: मैं केर्फ के लिए संदर्भ पुस्तिका का लेखक हूं। )


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

जावास्क्रिप्ट (ईएस 6), 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और अंत तक पहुंचते हैं। इसका मतलब यह है कि हर जोड़े के पात्रों की दो बार जाँच की जाएगी, लेकिन संकेत के पार जाते ही रुकने की तुलना में यह कुछ बाइट्स बचाता है।ps

प्रत्येक पुनरावृत्ति पर, हम जांचते हैं कि क्या *pएक पत्र है। यदि ऐसा है, तो यह जांचें कि *sअक्षरों की सीमा में है (एएससीआईआई 64 ऊपर की ओर), और वह *pऔर *s27 (मॉड 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एक कश्मीर एंड आर शैली के प्रोटोटाइप के लिए घोषणा के प्रकार को छोड़ सकते हैं :f(char*s)
बिल्ली

3

पर्ल 5, 70 बाइट्स

एक सबरूटीन:

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

इसे उपयोग में देखें:

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


2

सीजाम, 18 बाइट्स

qeu_'[,65>_W%erW%=

इसे ऑनलाइन आज़माएं

अपरकेस के इनपुट को परिवर्तित करके, अक्षरों के अनुवाद को निष्पादित करके, स्ट्रिंग को फ़्लिप करता है, और समानता की जांच करता है।


2

जाप, 30 27 बाइट्स

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

इसे ऑनलाइन आज़माएं!

यह काम किस प्रकार करता है

यह काफी हद तक स्वैप द अल्फाबेट पर मेरे जाप उत्तर पर आधारित है ।

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 बाइट जोड़ देगा)। फिर, कैपिटल इनपुट में प्रत्येक वर्ण के लिए, एक सूची में अनुवाद और अपील करें जब तक कि वर्ण वर्णमाला में नहीं है, उस स्थिति में चरित्र को उसी रूप में जोड़ें। पूरी सूची में शामिल हों और उलट सूची की तुलना करें।

Shout-out के लिए @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 = ]

मुझे वर्णमाला के साहचर्य सरणी उत्पन्न करने के लिए एक छोटे तरीके का पता नहीं है: सी


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

कमांड-लाइन तर्क के रूप में परीक्षण करने के लिए शब्द को स्वीकार करता है। कोड 0 (जो कि शेल के लिए सत्य है) के साथ बाहर निकलता है यदि तर्क एक atbash आत्म palindrome है, या कोड 1 के साथ अन्यथा।


1
putsपरिणाम एक आईने के साथ बाहर निकलने से कम नहीं होगा ?
cat

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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.