パリンドロームは、このような「レースカー」と同じ前後に、ある文字列です。
言語LのプログラムP1を入力として受け取り、P1と同じことを行う言語Lの回文プログラムP2を出力する、ある言語Lのプログラムを作成します。
構文エラーのある入力プログラムの処理について心配する必要はありません。
これはコードゴルフであるため、バイト数が最も少ないソリューションが優先されます。
x=input();print(x+'#'+x[::-1])。サブセットは、改行を含まないすべてのプログラムのセットです。
パリンドロームは、このような「レースカー」と同じ前後に、ある文字列です。
言語LのプログラムP1を入力として受け取り、P1と同じことを行う言語Lの回文プログラムP2を出力する、ある言語Lのプログラムを作成します。
構文エラーのある入力プログラムの処理について心配する必要はありません。
これはコードゴルフであるため、バイト数が最も少ないソリューションが優先されます。
x=input();print(x+'#'+x[::-1])。サブセットは、改行を含まないすべてのプログラムのセットです。
回答:
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
__DATA__それで読み取られる場合を除いて、ほとんどの場合に機能します。print while(<DATA>);\n__DATA__動作が変更されます。
__DATA__。:)
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
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%
かなり似ている 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実際の改行文字になります)。
.comファイル)上のx86マシンコード-70バイト.COMファイルを扱う場合、パリンドロームの作成は簡単です-COMの「ローダー」はファイルのコンテンツをアドレスに置くだけですから 100hそこにジャンプするだけなので、プログラムはすでに何らかの方法でその終わりをハードコーディングし、その後のすべてを無視する必要があるため、追加するだけです最初の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実行可能ファイルに関するより広範なテストが続きます。
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/!#
$
( echo 'Hello, World!' )。bashはexit。
#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#
これにより、パリンドロームをミラーリングしたブレインファックプログラムが生成されます。つまり、それらは自分自身のミラーイメージです。
++++++++++
[->++++>+++++++++<<]>+++.>+..<.>++.
>>>>+[>,]<-[+<-]
>[
[-<+<<+>>>]
+<-------------------------------------------[-<+>>[-]<]>[-<<<.>>>]
+<<-[->+>[-]<<]>>[-<<<.>>>]
+<-[-<+>>[-]<]>[-<<<.>>>]
+<<-[->+>[-]<<]>>[-<<<.>>>]
+<--------------[-<+>>[-]<]>[-<<<.>>>]
+<<--[->+>[-]<<]>>[-<<<.>>>]
+<-----------------------------[-<+>>[-]<]>[-<<<.>>>]
+<<--[->+>[-]<<]>>[-<<<.>>>]
<[-]>>
]
<<<<[<]
<--.<.>++..--..<.>++.
>>[>]
<[
[->+>>+<<<]
+>-------------------------------------------[->+<<[-]>]<[->>>.<<<]
+>>-[-<+<[-]>>]<<[->>>.<<<]
+>-[->+<<[-]>]<[->>>.<<<]
+>>-[-<+<[-]>>]<<[->>>.<<<]
+>--------------[->+<<[-]>]<[->>>++.--<<<]
+>>--[-<+<[-]>>]<<[->>>--.++<<<]
+>-----------------------------[->+<<[-]>]<[->>>++.--<<<]
+>>--[-<+<[-]>>]<<[->>>--.++<<<]
>[-]<<
]
<--.<.>++..<.
与えられたプログラムを与えます
+[[+]PROGRAM[+]][[+]MIRROR[+]]+
PROGRAMおよびMIRROR(非brainfuck文字なし)プログラムとその鏡像に置き換え。
ソースコード内のエスケープされた改行を正しく処理します
編集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標準、有効なコード、多くの警告
非ゴルフ
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
}
/* *<NL> */int main(){}
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
//ただし、テスト出力は各行の最後にあるはずです。
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
これは賢いことではありません。それは仕事をする単なるコードの一部です...私は遊ぶ気分でした。私はこのコードが悪いプログラミング慣行に満ちていることを知っています!
最後に、このコードに対する批判や編集を喜んで受け入れます!
(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(