프로그램을 회문 프로그램으로 변환


15

회문이 같은 "레이싱 카"와 같은 앞뒤로을하는 문자열입니다.

언어 L의 모든 프로그램 P1을 입력으로 사용하고 언어 P의 P1과 동일한 기능을하는 회문 프로그램 P2를 출력하는 일부 언어 L의 프로그램을 작성하십시오.

구문 오류가있는 입력 프로그램 처리에 대해 걱정할 필요가 없습니다.

이것은 코드 골프 이므로 바이트 수가 가장 적은 솔루션이 승리합니다.


언어 L을 정의 할 수 있습니까?
Greg Hewgill

1
@GregHewgill 예. L은 프로그램을 작성하기 위해 선택한 언어입니다.
Justin

일부 언어에서는 놀랍도록 힘든 일입니다.
Justin

3
튜링 완전한 파이썬의 하위 집합을 가진 유효한 항목 x=input();print(x+'#'+x[::-1])입니다. 하위 집합은 줄 바꿈이 포함되지 않은 모든 프로그램의 집합입니다.
Justin

답변:


17

펄, 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

댓글을 사용하지 않으

3
나는 "DNE"로 하단에 명백한 횡설수설을 표시합니다. "지우지 말 것"의 약어는 사람들이 칠판이나 화이트 보드에 물건을 표시하여 사람들이 중요하지 않은 낙서로 착각하지 않도록합니다.
anaximander 2016 년

어떻게 작동합니까, 나는 펄을 모른다, 더 구체적으로 어떻게 떨리는가 (역전되는 선을 얻는가)?
Cruncher 2016 년

2
1+ 프로그램이 끝날 때를 제외하고 대부분의 경우 작동합니다 __DATA__. 예. print while(<DATA>);\n__DATA__행동을 바꿀 것입니다.
Sylwester

1
@Sylwester : 맞습니다. 이것은을 사용하지 않는 Perl 스크립트의 하위 집합에 적용 __DATA__됩니다. :)
Greg Hewgill

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]

프로그램이 입력을 기다리지 않도록 EOF 문자를 생성해야하므로 IDLE에서 실행하면 작동하지 않습니다.

자체 실행시 출력 :

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에게 감사합니다.


잘 했어, 내 멍청한 파이썬 시도를 이겼어.
Greg Hewgill

1
@GregHewgill 나는 좋은 의견에 대한 좋은 찬사를 선호한다 ;-)
Justin

1
알았어 .. 나는 보통 나 자신에 대해 투표하지 않는다. :)
Greg Hewgill

5
@GregHewgill 나는 "나 자신에 대해" 많이 투표 합니다. 나는 응답 여부에 따라가 아니라 그들의 장점에 근거하여 답변을지지한다.
Justin

8

GolfScript, 10 9 바이트

"
}"+.-1%

minitech의 솔루션 과 매우 유사 하지만 개행과 잘 작동합니다. 그것은 GolfScript의 재미 있고 (문서화되지 않은) 행동에 의존하여 일치하지 않는 (그리고 주석 처리되지 않은) 행동 }뿐만 아니라 그 뒤에 오는 모든 것을 무시 합니다.

입력에 unmatched가 포함되어 있으면 실패 {하지만 기술적으로 구문 오류를 구성합니다.

작동 원리

"
}"   # 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 : 물론입니다. 지금 작동합니다.
데니스

5

DOS의 x86 기계 코드 ( .com파일)-70 바이트

COM "loader"는 파일의 내용을 주소에 100h넣고 점프 하기 때문에 .COM 파일을 다루는 것은 쉬운 일이 아닙니다 . 프로그램은 이미 어떻게 든 끝을 하드 코딩하고 그 이후의 모든 것을 무시해야하기 때문에 추가 할 수 있습니다. 첫 번째 N-1 바이트의 역 (주의 사항 : 프로그램이 어떻게 든 파일 길이로 트릭을 시도하면 모든 것이 중단됩니다).

.COM-palyndromizing 의 16 진수 덤프는 다음과 같습니다 .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

골프 스크립트, 8

.-1%'#'\

줄 바꿈을 처리하지 않지만 GolfScript에서는 줄 바꿈을 사용하지 않습니다.


6
문자열 리터럴에 줄 바꿈을 사용하는 것은 꽤 자주 사용될 수 있습니다 ;-)
Howard

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!' ). bash는 거의 모든 것을 무시합니다 exit.
디지털 외상

2

자바 스크립트 ( 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 (골프 아님)

이것은 회문을 미러링하는 brainfuck 프로그램을 생성합니다. 즉, 그들은 스스로의 거울상입니다.

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

프로그램이 주어진다면

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

PROGRAM 하고 MIRROR제 (비 브레인 퍽 문자 없음) 프로그램 및 그 미러 이미지로 대체.


2

C 168175

소스 코드 내에서 이스케이프 된 개행을 올바르게 처리

마지막 줄 바꿈이 없을 때 수정 된 버그 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 표준, 유효한 코드, 많은 경고

언 골프

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

나는 당신이 지시 중 하나를 오해했을 것입니다. 프로그램은 모든 프로그램을 입력 으로 가져 와서 원래 프로그램과 동일한 기능을하는 회문 프로그램을 작성할 수 있어야합니다 .
Greg Hewgill

당신의 대답에서 C ++ 코드를 입력하면 정확히 당신이 가진 것을 반환합니다.
jzm

모든 프로그램은 입력을 반대로합니다. 프로그램의 출력은 완전한 회문 프로그램이 아닙니다.
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에 오신 것을 환영합니다. 이것은 프로그램이 아니라 함수입니다. 다른 답변을 참조하면 좋은 예를 제공합니다.
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)))))

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

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