एक कार्यक्रम को एक पलिंडोमिक प्रोग्राम में बदलें


15

एक पैलिंड्रोम एक स्ट्रिंग है जो आगे और पीछे एक ही है, जैसे "रेसकार"।

कुछ भाषा L में एक प्रोग्राम लिखें, जो किसी भी प्रोग्राम P1 को भाषा L में इनपुट के रूप में लेता है, और भाषा L में एक palindromic प्रोग्राम P2 को आउटपुट करता है जो P1 के समान काम करता है।

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

यह कोड गोल्फ है , इसलिए सबसे कम संख्या में बाइट्स जीतता है।


क्या हम भाषा L को परिभाषित कर सकते हैं?
ग्रेग हेविल

1
@GregHewgill हाँ। L वह भाषा है जिसमें आप अपना प्रोग्राम लिखना चाहते हैं।
जस्टिन

कुछ भाषाओं में, यह आश्चर्यजनक रूप से कठिन है।
जस्टिन

3
पायथन के एक संपूर्ण ट्यूरेट के साथ, यह एक मान्य प्रविष्टि है x=input();print(x+'#'+x[::-1]):। सबसेट उन सभी प्रोग्रामों का समूह है, जिनमें न्यूलाइन्स शामिल नहीं हैं।
जस्टिन

जवाबों:


17

पर्ल, 55 54 बाइट्स

undef$/;$a=<>."\n__END__\n";print$a,scalar reverse$a;

स्टड से प्रोग्राम स्रोत पढ़ता है और स्टडआउट को लिखता है।

खुद को चलाने का परिणाम:

undef$/;$a=<>."\n__END__\n";print$a,scalar reverse$a;

__END__

__DNE__

;a$esrever ralacs,a$tnirp;"n\__DNE__n\".><=a$;/$fednu

+1 टिप्पणियों का उपयोग नहीं करने के लिए

3
मुझे यह पसंद है कि यह "DNE" के साथ नीचे स्पष्ट अस्पष्टता को चिह्नित करता है - "Do Not Erase" के लिए एक सामान्य शॉर्टहैंड, चॉकबोर्ड / व्हाइटबोर्ड पर चीजों को चिह्नित करने के लिए उपयोग किया जाता है ताकि लोग उन्हें महत्वहीन scblblings के लिए गलती न करें और उन्हें मिटा दें।
अनएक्सिमैंडर

यह कैसे काम करता है, मैं नहीं जानता कि पर्ल, अधिक विशेष रूप से यह कैसे करता है (लाइन है कि यह उलट है) मिलता है?
क्रंचर

2
1+ ज्यादातर मामलों में काम करता है सिवाय इसके __DATA__कि जब प्रोग्राम खत्म होता है तो पढ़ा जाता है। उदा। print while(<DATA>);\n__DATA__व्यवहार में बदलाव लाएगा।
सिल्वेस्टर

1
@ सिलवेस्टर: सच। यह पर्ल स्क्रिप्ट के सबसेट के लिए काम करता है जो उपयोग नहीं करते हैं __DATA__। :)
ग्रेग हेवगिल

11

जावा, 225 बाइट्स

class c{public static void main(String[]a){String s="";java.util.Scanner r=new java.util.Scanner(System.in);while(r.hasNext())s+=r.nextLine()+"\n";s=s.replace("\n","//\n");System.out.print(s+new StringBuilder(s).reverse());}}

खुद पर आउटपुट (जब पहले से तय हो गया हो):

class c {//
    public static void main(String[] a) {//
        String s = "";//
        java.util.Scanner r = new java.util.Scanner(System.in);//
        while (r.hasNext()) s += r.nextLine() + "\n";//
        s = s.replace("\n", "//\n");//
        System.out.print(s + new StringBuilder(s).reverse());//
    }//
}//

//}
//}
//;))(esrever.)s(redliuBgnirtS wen + s(tnirp.tuo.metsyS        
//;)"n\//" ,"n\"(ecalper.s = s        
//;"n\" + )(eniLtxen.r =+ s ))(txeNsah.r( elihw        
//;)ni.metsyS(rennacS.litu.avaj wen = r rennacS.litu.avaj        
//;"" = s gnirtS        
//{ )a ][gnirtS(niam diov citats cilbup    
//{ c ssalc

1
समस्या अगर टिप्पणी * में समाप्त हो रही है। टिप्पणी
edc65

10

पायथन 2, 68 बाइट्स

import sys
x=''.join(l[:-1]+'#\n'for l in sys.stdin)
print x+x[::-1]

यदि IDLE से चलाया जाता है तो काम नहीं करता है, क्योंकि आपको इनपुट पर प्रतीक्षा करने से प्रोग्राम को रोकने के लिए एक EOF चरित्र उत्पन्न करना होगा।

आउटपुट जब अपने आप चलता है:

import sys#
x=''.join(l[:-1]+'#\n'for l in sys.stdin)#
print(x+x[::-1])#

#)]1-::[x+x(tnirp
#)nidts.sys ni l rof'n\#'+]1-:[l(nioj.''=x
#sys tropmi

समस्याओं को दूर करने और गोल्फ में मदद करने के लिए ग्रेग हेवगिल का धन्यवाद।


अच्छा काम, मेरी तरह लंगड़ा अजगर प्रयास धड़कता है।
ग्रेग हेविल

1
@GregHewgill मैं एक अच्छी टिप्पणी के लिए एक अच्छा upvote पसंद करता हूं ;-)
जस्टिन

1
ठीक है ... मैं आमतौर पर अपने खिलाफ वोट नहीं देता। :)
ग्रेग हेविल

5
@GregHewgill मैं "अपने आप को बहुत " के खिलाफ वोट देता हूं । मैं उनके गुणों के आधार पर उत्तर देता हूं, इस बात पर आधारित नहीं कि मैंने उत्तर दिया है या नहीं।
जस्टिन

8

GolfScript, 10 9 बाइट्स

"
}"+.-1%

मिनिटेक के समाधान के समान काफी है , लेकिन यह newlines के साथ अच्छी तरह से काम करता है। यह एक बेजोड़ (और असुविधाजनक) }, साथ ही साथ इसके बाद आने वाली हर चीज को नजरअंदाज करने के लिए गोल्फक्राफ्ट के मजाकिया (और अनिर्दिष्ट) व्यवहार पर निर्भर करता है।

यदि इनपुट में कोई बेजोड़ सामग्री है {, तो यह विफल हो जाएगा , लेकिन यह तकनीकी रूप से एक वाक्यविन्यास त्रुटि होगी।

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

"
}"   # Push the string "\n}".
+    # Concatenate it with the input string.
.    # Duplicate the modified string.
-1%  # Reverse the copy.

उदाहरण

$ echo -n '1{"race{car"}
> {"foo\"bar"}
> if#' | golfscript make-palindrome.gs
1{"race{car"}
{"foo\"bar"}
if#
}}
#fi
}"rab"\oof"{
}"rac{ecar"{1
$ echo '1{"race{car"}
> {"foo\"bar"}
> if#
> }}
> #fi
> }"rab"\oof"{
> }"rac{ecar"{1' | golfscript
race{car

अपने इनपुट के रूप में प्रयास करें 1\n2#( \nएक वास्तविक न्यूलाइन वर्ण होगा)।
जस्टिन

1
@Quincunx: पेस्की टिप्पणियां ... घुंघराले ब्रैकेट से पहले एक नई लाइन को ठीक करना चाहिए।
डेनिस

पहले और बाद में। पलिंद बने रहने की जरूरत है।
जस्टिन

@Quincunx: बिल्कुल। यह अब काम करना चाहिए।
डेनिस

5

डॉस पर x86 मशीन कोड (.com फाइल) - 70 बाइट्स

.COM फ़ाइलों के साथ काम करना, एक पैलेन्ड्रोम बनाना आसान है - चूंकि COM "लोडर" सिर्फ फाइल की सामग्री को पते पर रखता है 100hऔर वहां कूदता है, इसलिए प्रोग्राम को पहले से ही किसी भी तरह से इसके अंत में हार्डकोड करना चाहिए और इसके बाद सब कुछ अनदेखा करना चाहिए, इसलिए हम सिर्फ उधार दे सकते हैं पहले N-1 बाइट्स का उल्टा होना (केवल कैविएट: यदि प्रोग्राम किसी तरह फ़ाइल की लंबाई के साथ ट्रिक्स करने की कोशिश करता है तो सब कुछ टूट जाता है)।

यहाँ मेरे .COM-yndromromizing के हेक्स डंप है .COM:

00000000  31 db 8a 1e 80 00 c6 87  81 00 00 ba 82 00 b8 00  |1...............|
00000010  3d cd 21 72 30 89 c6 bf  ff ff b9 01 00 ba fe 00  |=.!r0...........|
00000020  89 f3 b4 3f cd 21 3c 01  75 18 b4 40 bb 01 00 cd  |...?.!<.u..@....|
00000030  21 85 ff 75 e5 89 f3 f7  d9 88 ee b8 01 42 cd 21  |!..u.........B.!|
00000040  eb d8 47 74 f0 c3                                 |..Gt..|

यह कमांड लाइन पर इनपुट फ़ाइल लेता है, और आउटपुट को stdout पर लिखता है; अपेक्षित उपयोग कुछ ऐसा हैcompalyn source.com > out.com

टिप्पणी विधानसभा:

    org 100h

section .text

start:
    ; NUL-terminate the command line
    xor bx,bx
    mov bl, byte[80h]
    mov byte[81h+bx],0
    ; open the input file
    mov dx,82h
    mov ax,3d00h
    int 21h
    ; in case of error (missing file, etc.) quit
    jc end
    ; si: source file handle
    mov si,ax
    ; di: iteration flag
    ; -1 => straight pass, 0 reverse pass
    mov di,-1
loop:
    ; we read one byte at time at a bizarre memory
    ; location (so that dl is already at -2 later - we shave one byte)
    mov cx,1
    mov dx,0feh
    mov bx,si
    mov ah,3fh
    int 21h
    ; if we didn't read 1 byte it means we either got to EOF
    ; or sought before the start of file
    cmp al,1
    jne out
    ; write the byte on stdout
    mov ah,40h
    mov bx,1
    int 21h
    ; if we are at the first pass we go on normally
    test di,di
    jnz loop
back:
    ; otherwise, we have to seek back
    mov bx,si
    ; one byte shorter than mov cx,-1
    neg cx
    ; dl is already at -2, fix dh so cx:dx = -2
    mov dh,ch
    mov ax,4201h
    int 21h
    jmp loop
out:
    ; next iteration
    inc di
    ; if it's not zero we already did the reverse pass
    jz back
end:
    ret

खुद पर परीक्षण किया और पिछले प्रश्न के समाधान DosBox में ठीक काम करने लगता है, "कैनन" DOS निष्पादक पर कुछ और व्यापक परीक्षण का पालन करेंगे।


3

GolfScript, 8

.-1%'#'\

Newlines नहीं संभालता है, लेकिन कोई भी उन गोल्फस्क्रिप्ट में उपयोग नहीं करता है।


6
स्ट्रिंग लिटरल्स में न्यूलाइन का उपयोग करना काफी बार इस्तेमाल किया जा सकता है ;-)
हॉवर्ड

2

बैश + कोरुटिल्स, 39 बाइट्स

f="`cat`
exit"
echo "$f"
tac<<<"$f"|rev

STDIN से पढ़ता है और STDOUT को आउटपुट देता है:

$ cat hello.sh 
#!/bin/bash

echo 'Hello, World!'

$ ./palin.sh < hello.sh 
#!/bin/bash

echo 'Hello, World!'
exit
tixe
'!dlroW ,olleH' ohce

hsab/nib/!#
$ 

@ user23013 ठीक काम करने लगता है। कम से कम एक साधारण परीक्षा की तरह ( echo 'Hello, World!' )। के बाद सब कुछ बहुत उपेक्षा bash exit
डिजिटल ट्रामा

2

जावास्क्रिप्ट ( ईएस 6 ) मल्टी-लाइन - 71

Kinda sorta ने यहाँ Quincunx की टिप्पणी विधि चुराई :

alert((x=prompt().replace(/\n/g,'//\n')+'/')+[...x].reverse().join(''))

सिंगल लाइन - ४ ९

alert((x=prompt()+'/')+[...x].reverse().join(''))

2

सी ++, 214 209 बाइट्स

#include<cstdio>
#include<stack>
int main(){std::stack<char>s;int c;while((c=getc(stdin))>EOF){if(c=='\n')for(int i=2;i;i--)s.push(putchar('/'));s.push(putchar(c));}while(s.size()){putchar(s.top());s.pop();}}

खुद को चलाने का परिणाम:

#include<cstdio>//
#include<stack>//
int main(){std::stack<char>s;int c;while((c=getc(stdin))>EOF){if(c=='\n')for(int i=2;i;i--)s.push(putchar('/'));s.push(putchar(c));}while(s.size()){putchar(s.top());s.pop();}}//

//}};)(pop.s;))(pot.s(rahctup{))(ezis.s(elihw};))c(rahctup(hsup.s;))'/'(rahctup(hsup.s)--i;i;2=i tni(rof)'n\'==c(fi{)FOE>))nidts(cteg=c((elihw;c tni;s>rahc<kcats::dts{)(niam tni
//>kcats<edulcni#
//>oidtsc<edulcni#

विफलता जब निरंतरता 'char' का उपयोग किया जाता है। कोशिश करें [ ideone.com/TCZHr9]
edc65

@ edc65: हाँ, मैंने उस बारे में बाद में सोचा। एक ही स्पष्ट तरीका है कि मैं संभाल सकता हूँ कि पहले तह लाइनों को प्रकट करना होगा।
ग्रेग हेविगिल

छोटी कीमत पर किया जा सकता है - मेरा सी उत्तर
edc65

2

ब्रेनफैक, 749 बिना व्हाट्सएप (गोल्फ नहीं)

इससे ब्रेनफक प्रोग्राम तैयार होते हैं, जो पलिंड्रोम को प्रतिबिंबित करते हैं, अर्थात वे स्वयं की दर्पण छवियां हैं।

++++++++++
[->++++>+++++++++<<]>+++.>+..<.>++.
>>>>+[>,]<-[+<-]
>[
  [-<+<<+>>>]
  +<-------------------------------------------[-<+>>[-]<]>[-<<<.>>>]
  +<<-[->+>[-]<<]>>[-<<<.>>>]
  +<-[-<+>>[-]<]>[-<<<.>>>]
  +<<-[->+>[-]<<]>>[-<<<.>>>]
  +<--------------[-<+>>[-]<]>[-<<<.>>>]
  +<<--[->+>[-]<<]>>[-<<<.>>>]
  +<-----------------------------[-<+>>[-]<]>[-<<<.>>>]
  +<<--[->+>[-]<<]>>[-<<<.>>>]
  <[-]>>
]
<<<<[<]
<--.<.>++..--..<.>++.
>>[>]
<[
  [->+>>+<<<]
  +>-------------------------------------------[->+<<[-]>]<[->>>.<<<]
  +>>-[-<+<[-]>>]<<[->>>.<<<]
  +>-[->+<<[-]>]<[->>>.<<<]
  +>>-[-<+<[-]>>]<<[->>>.<<<]
  +>--------------[->+<<[-]>]<[->>>++.--<<<]
  +>>--[-<+<[-]>>]<<[->>>--.++<<<]
  +>-----------------------------[->+<<[-]>]<[->>>++.--<<<]
  +>>--[-<+<[-]>>]<<[->>>--.++<<<]
  >[-]<<
]
<--.<.>++..<.

एक प्रोग्राम को देखते हुए यह आउटपुट करता है

+[[+]PROGRAM[+]][[+]MIRROR[+]]+

कार्यक्रम के साथ PROGRAMऔर उसके MIRRORस्थान पर (बिना दिमाग के अक्षर) और उसकी दर्पण छवि।


2

C 168 175

सही ढंग से हैंडल सोर्स कोड के अंदर बची न्यूलाइन से बच गया

पिछली फिक्स्ड लाइन को
संपादित करते समय 1 फिक्स्ड बग को संपादित करें। टिप्पणी के अंदर लाइन समाप्त होने पर 2 फिक्स्ड बग को संपादित करें* : //टिप्पणी से पहले एक टैब चार जोड़ें
(और गोल्फिंग)

b[999999];main(c,z){char*p,for(p=b;(*p=c=getchar())>=0;z=c,p++)c-10||(z-92?*p++=9,*p++=47,*p++=47,*p=c:(p-=2));*p=47;for(p=b;*p;)putchar(*p++);for(;p>b;)putchar(*--p);}

C99 मानक, मान्य कोड, कई चेतावनी

Ungolfed

b[999999]; // working buffer ~ 4M on 32 bit machine, max source size
// c is current char, z is previous char,
main(c,z) // z  start as argv pointer, will be out of char range
{
  char *p;
  for(p = b; 
      (*p=c=getchar()) >= 0; // while testing EOF copy char to buffer set c variable
      z=c, p++) // at end loop increment p and set previous = current
  {
      c-'\n' || // if newline 
       (z - '\\' // check if escaped
          ? *p++='\t',*p++='/',*p++='/', *p=c // if not escaped, add tab,/,/ and newline
          : (p-=2) // if escaped, drop both escape and newline
       ); 
  }
  *p='/'; // if last newline missing, will add a comment anyway
  for(p=b;*p;) putchar(*p++); // ouput buffer 
  for(;--p>=b;) putchar(*p); // outbut buffer reversed
}

1
इसमें थोड़ा बग है। कोशिश/* *<NL> */int main(){}
jimmy23013

1

सी # - 174

using System;using System.Linq;class c{public static void Main(){var a="";var b="";while((a=Console.ReadLine())!="")b+=a+"//\n";Console.Write(b+string.Concat(b.Reverse()));}}

टेस्ट इनपुट:

using System; 
using System.Linq; 
class c 
{ 
    public static void Main() 
    { 
        var a = ""; 
        var b = ""; 
        while ((a = Console.ReadLine()) != "") 
            b += a + "//\n"; 
        Console.Write(b+string.Concat(b.Reverse())); 
    } 
} 

टेस्ट आउटपुट:

using System; 
using System.Linq; 
class c 
{ 
    public static void Main() 
    { 
        var a = ""; 
        var b = ""; 
        while ((a = Console.ReadLine()) != "") 
            b += a + "//\n"; 
        Console.Write(b+string.Concat(b.Reverse())); 
    } 
} 

// }
// }
// ;)))(esreveR.b(tacnoC.gnirts+b(etirW.elosnoC
// ;"n\//" + a =+ b
// )"" =! ))(eniLdaeR.elosnoC = a(( elihw
// ;"" = b rav
// ;"" = a rav
// {
// )(niaM diov citats cilbup
// {
// c ssalc
// ;qniL.metsyS gnisu
// ;metsyS gnisu

मुझे लगता है कि आप निर्देशों में से एक को गलत समझ सकते हैं। आपका कार्यक्रम किसी भी कार्यक्रम को इनपुट के रूप में लेने में सक्षम होना चाहिए , और एक पैलिंड्रोमिक प्रोग्राम लिखना चाहिए जो मूल कार्यक्रम के समान काम करता है।
ग्रेग हेविल

यह कर सकता है .. अगर मैं आपके जवाब से C ++ कोड इनपुट करता हूं, तो आपके पास वही है जो आपके पास है।
jzm

आपका सारा कार्यक्रम इसके इनपुट को उलट देता है। आपके प्रोग्राम का आउटपुट पूर्ण पैलिंड्रोमिक प्रोग्राम नहीं है।
ग्रेग हेवगिल

अरे हाँ, मैं फिर मिलता हूँ। अपडेट किया गया - अब बेहतर है?
jzm

2
हाँ, यह बात है। आपका परीक्षण आउटपुट //प्रत्येक पंक्ति के अंत में हालांकि होना चाहिए ।
ग्रेग हेवगिल

0

PHP, 96 बाइट्स

function a($b){
    echo $c = "a('$b')" . strrev("a)'" . $b . "'(");
    $d = substr($c, 0, strlen($b) + 5);
    eval("$d;");
}

नमूना उपयोग:

a('apple'); // echoes a('apple')('elppa')a until your bytes get exhausted

यह कुछ भी चालाक नहीं है। यह सिर्फ एक सरल कोड है जो काम करता है ... मैं खेलने के मूड में था। मुझे पता है कि यह कोड खराब प्रोग्रामिंग प्रथाओं के साथ व्याप्त है!

अंत में, मैं इस कोड के लिए किसी भी आलोचना और संपादन को सहर्ष स्वीकार करूंगा!


कोड गोल्फ में आपका स्वागत है। यह एक कार्य है, एक कार्यक्रम नहीं है। अन्य उत्तर देखें, वे अच्छे उदाहरण प्रदान करते हैं।
AL

0

कोबरा - 134

class P
    def main
        i=List<of String?>(Console.readLine.split('\n'))
        print '/#\n[i.reversed.join("\n")]\n#/#\n[i.join("\n")]\n#/'

0

रैकेट 133

(require srfi/13)(let((r read-line)(w display))(let l((i(r)))(when
(not(eq? eof i))(w i)(w";\n")(l(r))(w"\n;")(w(string-reverse i)))))

अघोषित (लेकिन अभी भी बहुत जरूरी है):

(require srfi/13)
(let recurse ((instr (read-line)))
  (when (not (eof-object? instr))
    (display instr)
    (display ";\n")
    (recurse (read-line))
    (display "\n;")
    (display (string-reverse instr))))

इनपुट के रूप में ungolfed संस्करण दिए जाने पर आउटपुट:

(require srfi/13);
(let recurse ((instr (read-line)));
  (when (not(eof-object? instr));
    (display instr);
    (display ";\n");
    (recurse (read-line));
    (display "\n;");
    (display (string-reverse instr))));

;))))rtsni esrever-gnirts( yalpsid(    
;)";n\" yalpsid(    
;))enil-daer( esrucer(    
;)"n\;" yalpsid(    
;)rtsni yalpsid(    
;))rtsni ?tcejbo-foe(ton( nehw(  
;)))enil-daer( rtsni(( esrucer tel(
;)31/ifrs eriuqer(
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.