Heterograms, Palindromes, ओह मेरी!


28

(पहली चुनौती, कृपया मुझे बताएं कि इसमें कोई समस्या है या नहीं।)

एक heterogram एक शब्द है जहाँ यह वर्णमाला का कोई पत्र एक बार से अधिक होता है, और एक विलोमपद एक मुहावरा है कि एक ही पीछे और आगे है।

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

यह कोड-गोल्फ है, इसलिए सबसे छोटा कोड जीतता है। सौभाग्य!

संपादित करें: पैरेन्स, कोष्ठक या अन्य प्रतीक जो बाएं और दाएं रूपों में हैं, उन्हें पैलिंड्रोम भाग के लिए स्पष्ट रूप से बदला जाना चाहिए। तो (हेलोलेह) एक पैलिंड्रोम है, लेकिन (हेलोलेलेह) (नहीं है। जाहिर तौर पर इसे एक सुविधाजनक पैलिंड्रोम कहा जाता है।

संपादित 2: आपको कोई खाली इनपुट नहीं मिलेगा, कई शब्दों के साथ इनपुट या अक्षरों के अलावा अन्य वर्णों के साथ इनपुट। तो इस बारे में चिंता मत करो :)


क्या कोष्ठक को पालिंड्रोमाइसिस के बराबर माना जाता है? वह है, (hellolleh)वैध पालि है? के लिए इसी तरह [], {}है, और <>(जहां उचित)।
Glen O

हाँ। क्षमा करें, मुझे यह समझाना चाहिए था।
एक

नई लाइनों के बारे में क्या, asdsaबराबर माना जाएगा asd\nsa?
wendelbsilva

नहीं, वे समकक्ष नहीं होंगे।
एक

5
मेरा मानना ​​है कि इसे एक सुविधाजनक पैलिंड्रोम कहा जाता है ।
२०:३६ पर lirtosiast

जवाबों:


9

पायथ - 11 बाइट्स

(अनुगामी और प्रमुख रिक्त स्थान आवश्यक और गिने जाते हैं)।

 z.{ z }.z 

टेस्ट सूट

<space>        Suppress print
 z             Input (for palindromness)
.{             Unique - actually does testing
  z            Input
<space>        Suppress print
  }            In operator
   .z          Cached input list
   <space>     At end of program makes empty tuple

माइक के पाइथ उत्तर को करने से पहले लोअरकेस में कनवर्ट हो जाता है। {, क्या आप सुनिश्चित हैं कि आपको भी ऐसा करने की आवश्यकता नहीं है?
शुक्राणु

18

पायथ, 17 बाइट्स

 Z.{rzZ.q.Zzr}.Z 

इसे यहाँ ऑनलाइन आज़माएँ।

अग्रणी स्थान आवश्यक है। मैंने इसे और बाइट की गिनती में पीछे चल रहे स्थान को गिना है।

यहाँ ब्रेकडाउन है:

     z            z is initialized to the input
    r Z           Z is initialized to 0, and r(string)0 converts the string to lowercase
  .{              .{ is pyth's builtin uniqueness test
       .q         .q terminates the program
         .Zzr}    This is just the program mirrored
              .Z  . requires a number to immediately follow it
                  If left blank the parser would throw an error
 Z                This is just mirrored from the end
                  The leading space suppresses the automatic printing of this 0
                  The trailing space mirrors the leading space

3
जीज़, और मैं चिंतित था कि यह बहुत कठिन होगा ... अच्छा काम!
एक स्पेगेटी

2
आपके पास .qआपकी टिप्पणियों में एक है, लेकिन .wआपके कार्यक्रम में।
जेम्स वेबस्टर

@JamesWebster कि बाहर इशारा करने के लिए धन्यवाद। यह होना चाहिए .q
माइक बुफ़र्देसी

16

पायथन 3, 125

मुख्य समस्या कोड को रिवर्स करने योग्य बनाना है। फिर हम इसे अपरिभाषित पहचानकर्ताओं से त्रुटि होने दे सकते हैं।

w=[str.lower][0]((input)())
(print)((max)((map)(w.count,w))<2)
(2>((w,tnuoc.w)(pam))(xam))(tnirp)
(()(tupni))[0][rewol.rts]=w

बहुत मामूली बात है, लेकिन नियमों से आपको दूसरे <को एक में बदलना चाहिए >!
जरमेक्स

12

पर्ल, 43 बाइट्स

print+m:^(?!.*(.).*\1|1/*.(.)*.!?)^:m+tnirp

उपयोग उदाहरण:

echo "abcde" | perl -n entry.pl

वाह कमाल है। अच्छी नौकरी!
एक

6

> <> , 137 131 बाइट्स

जब मैंने इस चुनौती को देखा, तो मुझे लगा कि <> अंततः भाषा का एक अच्छा विकल्प हो सकता है क्योंकि इसका उपयोग करने के बाद आप ज्यादातर palindromes को अनदेखा कर सकते हैं; यह सुनिश्चित करना सरल है कि सूचक केवल वही रहता है जहां उसे होना चाहिए। हालांकि यह सच है,> <> दुर्भाग्य से गोल्फ की स्थिति को कष्टदायी बनाता है (या सामान्य रूप से सिर्फ गोल्फिंग)। मुझे उम्मीद है कि मैंने इसके लिए क्षतिपूर्ति करने के लिए कुछ अजीब ट्रिक्स का उपयोग करने के बारे में सोचा था, लेकिन यहां एक "त्वरित" (वास्तव में, प्रोग्राम-वार और क्रिएशन-वार दोनों) उत्तर नहीं है। आप इसे यहाँ ऑनलाइन कोशिश कर सकते हैं

i:0(?v>:"Z")?vl1-:1(?v&:{:@=?v$&e0.>
  ;n1<^  -*48<   .00~<  ;n-10<01-n;  >~00.   >84*-  ^>1n;
<.0e&$v?=@:}:&v?)1:-1lv?("Z":<v?)0:i

सच के लिए 1 रिटर्न और झूठ के लिए -1 (मैं इसे 0 में बदल सकता था लेकिन लंबाई वही रहेगी, दुर्भाग्य से)

हमेशा की तरह, मुझे बताएं कि क्या यह काम नहीं करता है और यदि आपके पास कोई विचार है कि इसे नीचे कैसे किया जाए। मैंने कुछ परीक्षण मामलों के खिलाफ इसका परीक्षण किया, लेकिन हमेशा एक अपवाद हो सकता है।

यहां एक और संस्करण है, एक जो मुझे लगता है कि थोड़ा अधिक चतुर है, लेकिन अफसोस दस बाइट्स अधिक है। इस समय सत्य / गलत मान 1 और त्रुटि हैं ( something smells fishy...):

>i:0(?v>:"Z")?vl: 2(?v&{:@$:@=01-*2.
 < ;n1<^  -*48<f6+0.0<
 &1-:1)e*1.1*e(1:-1& 
>0.0+6f>84*-  ^>1n; > 
.2*-10=@:$@:}&v?)2 :lv?("Z":<v?)0:i<

स्पष्टीकरण:

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

i:0(?v>:"Z")?vl1-:1(?v&:{:@=?v$&e0.>
  ;n1<^  -*48<   .00~<  ;n-10<

पंक्ति 1:

i:0(?v>:"Z")?vl1-:1(?v&:{:@=?v$&e0.>
i:0(?v                                 #Pushes input and directs down if negative
      >:"Z")?v                         #Directs down if input is greater than "Z"
                                       #(reduces lowercase input to uppercase)
              l                        #Pushes length

                                       #Main loop begins
               1-:1(?v                 #Decrements top, and then directs down if less than 1
                      &                #Pushes top of stack onto register (length minus 1)
                       :{              #Duplicates top, shifts stack to the left
                         :@            #Duplicates top, shifts top three values of the stack to the right

                           =?v         #If top two values are equal, directs down
                              $        #Swaps top two values of the stack
                               &       #Pushes register onto stack
                                e0.    #Jumps back to the "1" after "?vl"
                                       #Main loop ends

                                   >   #Makes sure when the pointer jumps back to i it goes the right way

यहां बताया गया है कि कैसे सजाया गया स्वैपिंग ( :{:@=?v$) काम करता है - मैं इस स्टैक के एक परीक्षण मामले का उपयोग करूंगा: [5,1,8,1]जहां अंतिम वर्ण शीर्ष है।

:{स्टैक के शीर्ष को डुप्लिकेट किया गया है: [5,1,8,1,1]और स्टैक बाईं ओर स्थानांतरित हो गया है:[1,8,1,1,5]

:@शीर्ष को डुप्लिकेट किया गया है: [1,8,1,1,5,5]फिर शीर्ष तीन मान दाईं ओर स्थानांतरित कर दिए गए हैं:[1,8,1,5,1,5]

=?v स्पष्टीकरण के इस भाग के लिए अनावश्यक नहीं है

$एक बार अधिक पैदावार करने पर शीर्ष मान की अदला-बदली की [1,8,1,5]जाती है, यदि आप ध्यान दें, तो मूल स्टैक एक बार में स्थानांतरित हो जाता है (जैसे {कि केवल कमांड था)।


तो यह अंग्रेजी में क्या करता है ("भगवान का शुक्र है, वह वास्तव में चीजों को समझा रहा है") शीर्ष मूल्य के खिलाफ पूरे स्टैक की जांच करें और यदि कोई मूल्य शीर्ष के बराबर है, तो दूसरी पंक्ति में एक बिंदु पर जाएं। यह जाँच आनुपातिक रूप से की जाती है कि स्टैक में कितने मान हैं ( l - 1, जहाँ स्टैक lकी लंबाई है) ताकि सभी मान एक-दूसरे के विरुद्ध जाँचें।

लाइन 2:

  ;n1<^  -*48<   .00~<  ;n-10<
   n1<                          #If input is less than 0 (i.e. there is none), print 1
  ;                             #and terminate

             <                  #If redirected because input is greater than "Z"
         -*48                   #Push 32, subtract (reducing lowercase to uppercase, numerically)
      ^                         #And move back to the portion that tests if input 
                                #is uppercase (which it will pass now)

                     <          #If counter is less than 1 (for main loop)
                 .00~           #Pop the counter and jump to the beginning (i)

                             <  #If any two values in the stack are equal
                          -10   #Push -1 (subtract 1 from 0)
                        ;n      #Print and terminate

खुशी है कि एक> <> उत्तर :)
एक

1
इसके अलावा, ><>खुद एक पैलिंड्रोम है (सिर्फ एक सुविधाजनक नहीं)
जो किंग

5

PHP, 126 बाइट्स

आप के साथ इस चलाने की आवश्यकता short_tagsआरं निर्देश दिया बंद 5.4 या इसके बाद के संस्करण में।

पहले गोल्फ कभी दो प्रतियाँ, पहले गलत / सत्य परिणाम के साथ कचरे का एक पूरा गुच्छा प्रिंट करती है:

<?=var_dump(max(array_count_values(str_split(end($argv))))<2)?><?(2>((((vgra$)dne)tilps_rts)seulav_tnuoc_yarra)xam)pmud_rav=?>

यह संस्करण किसी भी शब्दजाल (162 बाइट्स) को प्रिंट नहीं करेगा:

<?=var_dump(max(array_count_values(str_split(end($argv))))<2);__halt_compiler()?><?()relipmoc_tlah__;(2>((((vgra$)dne)tilps_rts)seulav_tnuoc_yarra)xam)pmud_rav=?>

कमांड लाइन से चलाएं

php -f golf.php heterogram

शायद थोड़ा और आगे गोल्फ हो सकता है


हालांकि, वैधता की सीमा को धक्का दे रहा है। शायद खेल के लिए टिप्पणियों के साथ एक समाधान के बारे में सोचें
मार्टिज़न

इसके बजाय ?><?, आप उपयोग कर सकते हैं //\\। उस आवश्यकता को दूर करना चाहिए। और __halt_compiler()उपयोग के बजायreturn;
इस्माइल मिगुएल

इसकी अवहेलना करें। आप टिप्पणियों का उपयोग नहीं कर सकते। लेकिन return;अभी भी मान्य है।
इस्माईल मिगुएल

2

05AB1E, 9 बाइट्स

lDÙQqQÙDl

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

* मेरी बहुत पहले चुनौती पर वापस जाने के बारे में कुछ डालें *

इस चुनौती के बाद 05AB1E से गैर-प्रतिस्पर्धा की गई।

व्याख्या

lDÙQqQÙDl
l           Take input and lowercase it.
 DÙ         Duplicate and uniquify.
   Q        Compare the two strings.
    q       Immediately exit.
     QÙDl   The rest of the program is ignored.

1
"इस चुनौती से पहले 05AB1E से गैर-प्रतिस्पर्धा की गई थी।" शायद आप इस चुनौती के बाद थे ? ;)
15

2

Brachylog , 3 बाइट्स, भाषा चुनौती देती है

DdD

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

यह बहुत कम प्रोग्रामों में से एक है जो Brachylog 1 और Brachylog 2 में काम करता है। TIO लिंक पुराने समय के लिए Brachylog 1 के लिए है। ब्रेशलॉग के लिए भी असामान्य रूप से, यह एक पूर्ण कार्यक्रम है, एक फ़ंक्शन नहीं। (ब्रिग्लॉग में पूरे कार्यक्रम निहित रूप से आउटपुट बूलियन हैं, जो इस प्रश्न के लिए बस यही चाहते हैं।)

यहाँ सामान्य सिद्धांत यह है कि समान अपरकेस अक्षरों की एक जोड़ी के बीच एक विधेय रखना एक जोर है कि वर्तमान मूल्य उस विधेय के तहत अपरिवर्तनीय है। तो आप अक्सर AoA"सॉर्ट किए गए" ("सॉर्टिंग के तहत अवायर्न") जैसी चीजों को देखते हैं ; A↔A(ब्रेकीलॉग 2 में) का अर्थ है "एक पैलिंड्रोम है" ("उलट के तहत अदर्शन"), और इसी तरह। यह कार्यक्रम "डुप्लिकेट को हटाने के तहत अपरिवर्तनीय" है, अर्थात "डुप्लिकेट को शामिल नहीं करता है"। यह वास्तव में सुविधाजनक है कि आक्रमण को निर्दिष्ट करने का यह तरीका एक पैलिंड्रोम होता है।



0

MATL , 7 बाइट्स

tuX=Xut

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

रिटर्न सूची [1, 1] यदि इनपुट एक हेमोग्राम है और [0, 0] यदि नहीं।

स्पष्टीकरण:

t       % duplicate the input
u       % remove duplicates from the original
X=      % check the two lists are equal
Xu      % unique rows (does nothing as we now have a boolean)
t       % duplicate the result
        % (implicit) convert to string and display
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.