แปลงโปรแกรมเป็นโปรแกรม palindromic


15

palindromeเป็นสตริงที่เป็นไปข้างหน้าและข้างหลังเดียวกันเช่น "รถแข่ง" a

เขียนโปรแกรมในภาษา L ซึ่งใช้โปรแกรม P1 ใด ๆ ในภาษา L เป็นอินพุตและส่งเอาต์พุตโปรแกรม palindromic P2 ในภาษา L ที่ทำเช่นเดียวกับ P1

คุณไม่จำเป็นต้องกังวลเกี่ยวกับการจัดการโปรแกรมอินพุตด้วยข้อผิดพลาดทางไวยากรณ์

นี่คือโค้ดกอล์ฟดังนั้นคำตอบที่มีจำนวนไบต์น้อยที่สุดจะเป็นผู้ชนะ


เราสามารถกำหนดภาษา L ได้หรือไม่?
Greg Hewgill

1
@ GregHewgill ใช่ L เป็นภาษาที่คุณเลือกเขียนโปรแกรมของคุณ
Justin

ในบางภาษานี่เป็นเรื่องที่น่าประหลาดใจมาก
Justin

3
ด้วยชุดย่อยที่สมบูรณ์ของ Python นี่คือรายการที่ถูกต้อง: x=input();print(x+'#'+x[::-1]). เซ็ตย่อยคือชุดของโปรแกรมทั้งหมดที่ไม่รวมบรรทัดใหม่
Justin

คำตอบ:


17

Perl, 55 54 ไบต์

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

อ่านซอร์สโปรแกรมจาก stdin และเขียนไปยัง stdout

ผลลัพธ์ของการทำงานกับตัวเอง:

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" ที่ใช้ในการทำเครื่องหมายสิ่งบนกระดาน / กระดานไวท์บอร์ดเพื่อให้ผู้คนไม่เข้าใจผิดพวกเขาสำหรับ scribblings ที่ไม่สำคัญ
anaximander

มันทำงานอย่างไรฉันไม่รู้ Perl โดยเฉพาะเจาะจงว่ามันเป็นอย่างไร (รับสายที่มันย้อนกลับ)?
Cruncher

2
1+ ใช้งานได้ในกรณีส่วนใหญ่ยกเว้นเมื่อโปรแกรมลงท้ายด้วย__DATA__ที่อ่าน .. เช่น print while(<DATA>);\n__DATA__จะเปลี่ยนพฤติกรรม
Sylwester

1
@Sylwester: จริง งานนี้สำหรับย่อยของสคริปต์ Perl __DATA__ที่ไม่ได้ใช้ :)
Greg Hewgill

11

Java, 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());}}

เอาท์พุทตัวเอง (เมื่อ prettified ก่อน):

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

Python 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

ขอบคุณ Greg Hewgill ที่ช่วยไขปัญหาและการเล่นกอล์ฟ


เยี่ยมมาก ๆ ลองใช้ Python ดูดีกว่านี้
Greg Hewgill

1
@GregHewgill ฉันชอบ upvote ที่ดีเพื่อความคิดเห็นที่ดี ;-)
Justin

1
โอเคโอเค ... ฉันมักจะไม่ลงคะแนนให้ตัวเอง :)
Greg Hewgill

5
@GregHewgill ผมลงคะแนน "กับ" ตัวเองมาก ฉันโหวตคำตอบตามข้อดีของพวกเขาไม่ใช่ตามที่ฉันตอบหรือไม่
Justin

8

GolfScript, 10 9 ไบต์

"
}"+.-1%

ค่อนข้างคล้ายกับโซลูชันของ minitechแต่ทำงานได้ดีกับ newlines มันขึ้นอยู่กับพฤติกรรมที่ตลก (และไม่มีเอกสาร) ของ GolfScript ที่จะเพิกเฉยต่อการไม่มีใครเทียบ (และไม่ใส่เครื่องหมาย) }เช่นเดียวกับทุกสิ่งที่ตามมา

มันจะล้มเหลวหากอินพุตมี{ข้อผิดพลาดที่ไม่ตรงกันแต่ในทางเทคนิคแล้วจะก่อให้เกิดข้อผิดพลาดทางไวยากรณ์

มันทำงานอย่างไร

"
}"   # 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จะเป็นอักขระขึ้นบรรทัดใหม่จริง) เป็นอินพุตของคุณ
Justin

1
@Quincunx: ความคิดเห็นที่น่าเบื่อ ... ขึ้นบรรทัดใหม่ก่อนวงเล็บปีกกาควรแก้ไข
Dennis

ก่อนและหลัง ต้องยังคงเป็นโทนสี
Justin

@Quincunx: แน่นอน มันควรจะทำงานตอนนี้
Dennis

5

รหัสเครื่อง x86 บน DOS ( .comไฟล์) - 70 ไบต์

การจัดการกับไฟล์. COM การสร้าง palyndrome นั้นเป็นเรื่องง่ายเนื่องจาก COM "ตัวโหลด" เพียงแค่ใส่เนื้อหาของไฟล์ตามที่อยู่100hและข้ามไปที่นั่นโปรแกรมจะต้องฮาร์ดโค้ดสิ้นสุดแล้วและละเว้นทุกอย่างหลังจากนั้นดังนั้นเราจึงสามารถต่อท้ายได้ การย้อนกลับของ N-1 ไบต์แรก (เฉพาะข้อแม้: หากโปรแกรมพยายามที่จะเล่นกลกับความยาวของไฟล์ทุกอย่างแตก)

นี่คือฐานสิบหกของฉัน.COM-palyndromizing .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%'#'\

ไม่จัดการกับการขึ้นบรรทัดใหม่ แต่ไม่มีใครใช้พวกนั้นใน GolfScript


6
โดยใช้การขึ้นบรรทัดใหม่ในสายอักขระตัวอักษรสามารถนำมาใช้ค่อนข้างบ่อย ;-)
ฮาวเวิร์ด

2

Bash + coreutils, 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!' )ในการทดสอบอย่างง่ายน้อยเช่น exitทุบตีสวยมากไม่สนใจทุกอย่างหลังจากที่
บาดเจ็บทางดิจิตอล

2

Javascript ( ES6) ) หลายบรรทัด - 71

Kinda sorta ขโมยQuincunxวิธีการแสดงความคิดเห็นของที่นี่:

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

บรรทัดเดียว - 49

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

2

C ++, 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#

ล้มเหลวเมื่อใช้ถ่านต่อเนื่อง '\' ลอง [ ideone.com/TCZHr9]
edc65

@ edc65: ใช่ฉันคิดเรื่องนั้นในภายหลัง วิธีที่ชัดเจนเพียงอย่างเดียวที่ฉันสามารถคิดได้ว่าจะจัดการกับมันคือการตีแผ่เส้นที่พับไว้ก่อน
Greg Hewgill

สามารถทำได้ในราคาประหยัด - คำตอบ C ของฉัน
edc65

2

Brainfuck, 749 ไม่มีที่ว่าง (ไม่ใช่กอล์ฟ)

สิ่งนี้ก่อให้เกิดโปรแกรมสมองซึ่งสะท้อน palindromes นั่นคือเป็นภาพสะท้อนของตัวเอง

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

รับโปรแกรมมันออกมา

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

ด้วยPROGRAMและMIRRORแทนที่ด้วยโปรแกรม (ไม่มีตัวอักษรที่ไม่ใช่สมอง) และภาพสะท้อนของมัน


2

C 168 175

จัดการบรรทัดขึ้นบรรทัดใหม่ที่ถูกต้องภายในซอร์สโค้ด

แก้ไขข้อผิดพลาดที่แก้ไข 1เมื่อบรรทัดใหม่ล่าสุดที่หายไป
แก้ไขข้อผิดพลาดที่แก้ไข 2เมื่อบรรทัดภายในความคิดเห็นลงท้ายด้วย*: เพิ่มตัวอักษรแท็บก่อนที่//ความคิดเห็น
(และ golfed เพิ่มเติม)

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

C # - 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

ฉันคิดว่าคุณอาจเข้าใจผิดหนึ่งในคำแนะนำ โปรแกรมของคุณควรจะสามารถใช้โปรแกรมใด ๆเป็นอินพุตและเขียนโปรแกรม palindromic ที่ทำเช่นเดียวกับโปรแกรมต้นฉบับ
Greg Hewgill

มันสามารถ .. ถ้าฉันใส่รหัส C ++ จากคำตอบของคุณมันจะคืนสิ่งที่คุณมี
jzm

โปรแกรมทั้งหมดของคุณจะย้อนกลับอินพุต ผลลัพธ์ของโปรแกรมของคุณไม่ใช่โปรแกรม palindromic ที่สมบูรณ์
Greg Hewgill

โอ้ใช่ฉันเข้าใจแล้ว อัปเดต - ดีกว่าไหม
jzm

2
ใช่นั่นแหล่ะ ผลการทดสอบของคุณควรจะมี//ในตอนท้ายของแต่ละบรรทัดในขณะนี้
Greg Hewgill

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

นี่คือไม่มีอะไรที่ฉลาด มันเป็นรหัสง่ายๆที่ทำงาน ... ฉันอยู่ในอารมณ์ที่จะเล่น ฉันรู้ว่ารหัสนี้เต็มไปด้วยวิธีปฏิบัติในการเขียนโปรแกรมที่ไม่ดี!

ในที่สุดฉันก็ยินดีที่จะยอมรับการวิจารณ์และการแก้ไขรหัสนี้!


ยินดีต้อนรับสู่ Code Golf นี่คือฟังก์ชั่นไม่ใช่โปรแกรม ดูคำตอบอื่น ๆ พวกเขาให้ตัวอย่างที่ดี
อัล

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

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

เอาต์พุตเมื่อกำหนดเวอร์ชันที่ไม่ได้ปรับแต่งให้เป็นอินพุต:

(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(
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.