Bir programı palindromik bir programa dönüştürme


15

Bir palindrom gibi "yarış arabası" ile aynı ileriye ve geriye doğru, olan bir dizidir.

L dilinde, L dilinde herhangi bir P1 programını giriş olarak alan ve L dilinde P1 ile aynı şeyi yapan bir palindromik P2 programı çıktısı veren bir program yazın.

Sözdizimi hataları olan girdi programlarını işleme konusunda endişelenmenize gerek yoktur.

Bu kod golf , bu yüzden en az bayt ile çözüm kazanır.


L dilini tanımlayabilir miyiz?
Greg Hewgill

1
@GregHewgill Evet. L, programınızı yazmayı seçtiğiniz dildir.
Justin

Bazı dillerde, bu şaşırtıcı derecede zor.
Justin

3
Python bir turing tam alt kümesi ile bu geçerli bir giriş olacaktır: x=input();print(x+'#'+x[::-1]). Alt küme, yeni satır içermeyen tüm programların kümesidir.
Justin

Yanıtlar:


17

Perl, 55 54 bayt

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

Stdin'den program kaynağını okur ve stdout'a yazar.

Kendi kendine koşmanın sonucu:

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

__END__

__DNE__

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

Yorumları kullanmadığınız için +1

3
Ben "DNE" ile altta görünen anlamsız işaretler gibi - kara tahtalar / yazı tahtaları bir şeyler işaretlemek için kullanılan "Silmeyin" için ortak bir stenografi, insanların önemsiz karalamalar için onları hata ve onları silmek için kullanılan gibi.
anaximander

nasıl çalışır, perl bilmiyorum, daha spesifik olarak nasıl quine (tersine çizgi olsun)?
Cruncher

2
1+ Program __DATA__okunduğunda bittiği durumlar dışında çoğu durumda çalışır .. örn. print while(<DATA>);\n__DATA__davranış değiştirecek.
Sylwester

1
@Sylwester: Doğru. Bu, kullanmayan Perl betiklerinin alt kümesi için geçerlidir __DATA__. :)
Greg Hewgill

11

Java, 225 bayt

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

Kendi başına çıktı (önceden ön saflaştırıldığında):

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
* İle biten yorumda sorun var. Bkz comment
edc65

10

Python 2, 68 bayt

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

IDLE'den çalıştırılırsa çalışmaz, çünkü programın girişte beklemesini durdurmak için bir EOF karakteri oluşturmanız gerekir.

Kendi kendine çalışırken çıktı:

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

Sorunları çözmeye ve golf oynamaya yardımcı olduğu için Greg Hewgill'e teşekkürler.


İyi iş, biraz topal Python girişimimi yeniyor.
Greg Hewgill

1
@GregHewgill Güzel bir yoruma hoş bir upvote tercih ederim ;-)
Justin

1
Tamam tamam ... Genellikle kendime karşı oy kullanmam. :)
Greg Hewgill

5
Kendim "karşı" @GregHewgill ben oy çok . Yanıtları, yanıtlayıp yanıtlamamaya değil, esaslarına göre onaylıyorum.
Justin

8

GolfScript, 10 9 bayt

"
}"+.-1%

Minitech'in çözümüne oldukça benzer , ancak yeni satırlarla iyi çalışır. Eşsiz (ve yorumlanmamış) }yanı sıra onu takip eden her şeyi göz ardı etmek için GolfScript'in komik (ve belgesiz) davranışına dayanır .

Giriş eşleşmeyen {bir içeriğe sahipse başarısız olur , ancak bu teknik olarak bir sözdizimi hatası oluşturur.

Nasıl çalışır

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

Misal

$ 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

Girişiniz olarak deneyin 1\n2#( \ngerçek bir yeni satır karakteri olurdu).
Justin

1
@Quincunx: Pesky yorum ... Kıvırcık parantezden önce yeni bir satır bunu düzeltmeli.
Dennis

Önce ve sonra. Bir palindrom olarak kalmamız gerekiyor.
Justin

@Quincunx: Elbette. Şimdi çalışmalı.
Dennis

5

DOS'ta x86 makine kodu ( .comdosya) - 70 bayt

.COM dosyaları ile uğraşmak, bir pali sendromu oluşturmak kolaydır - COM "yükleyicisi" sadece dosyanın içeriğini adrese koyar 100hve oraya atlar, program zaten bir şekilde sonunu kodlamalı ve sonra her şeyi görmezden gelmelidir, böylece ekleyebiliriz ilk N-1 baytının tersi (sadece uyarı: program bir şekilde dosya uzunluğuyla hileler yapmaya çalışırsa her şey kırılır).

İşte benim - .COMpalyndromizing altıgen dökümü .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..|

Komut satırındaki girdi dosyasını alır ve çıktıyı stdout'a yazar; beklenen kullanım gibidir compalyn source.com > out.com.

Yorum yapılan derleme:

    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

Kendi kendine test edildi ve bir önceki soruya çözümler DosBox iyi çalışıyor gibi görünüyor, "kanonik" DOS yürütülebilir dosyaları üzerinde bazı daha kapsamlı testler takip edecek.


3

GolfScript, 8

.-1%'#'\

Yeni satırlarla başa çıkmaz, ancak kimse GolfScript'te bunları kullanmaz.


6
Dize değişmezlerinde satırsonu kullanımı oldukça sık kullanılabilir ;-)
Howard

2

Bash + coreutils, 39 bayt

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

STDIN ve STDOUT çıktıları:

$ 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 İyi çalışıyor. En azından basit bir test gibi ( echo 'Hello, World!' ). bash hemen hemen her şeyi göz ardı eder exit.
Dijital Travma

2

Javascript ( ES6 ) Çok satırlı - 71

Kinda sorta Quincunx'ın yorum yöntemini burada çaldı :

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

Tek hat - 49

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

2

C ++, 214209 bayt

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

Kendi kendine koşmanın sonucu:

#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' devam char kullanıldığında başarısız. [ İdeone.com
edc65

@ edc65: Evet, bunu daha sonra düşündüm. Bunu ele almayı düşünebileceğim tek açık yol, önce katlanmış çizgileri açmak olacaktır.
Greg Hewgill

küçük bir maliyetle yapılabilir - C cevabımı se
edc65

2

Brainfuck, 749 boşluk bırakmadan (golf oynamayan)

Bu, palindromları yansıtan beyin fırtınası programları üretir, yani bunlar kendilerinin ayna görüntüsüdür.

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

Bir program verildiğinde çıktı

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

ile PROGRAMve MIRROR(non-brainfuck karakterler olmadan) program ve onun ayna görüntüsü ile değiştirilir.


2

C 168175

Kaynak kod içindeki kaçan yeni satırı doğru şekilde işler

Düzenleme 1 kayıp son satır zaman hata düzeltildi
Düzenleme 2 hata düzeltildi zaman ile açıklama uçları iç hat *: önce bir sekme kömürü eklemek //comment
(ve golfed fazlası)

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 Standart, geçerli kod, birçok uyarı

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
İçinde küçük bir hata var. deneyin/* *<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()));}}

Test Girişi:

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

Test Çıkışı:

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

Bence talimatlardan birini yanlış anlamış olabilirsiniz. Programınız giriş olarak herhangi bir programı alabilmeli ve orijinal programla aynı şeyi yapan bir palindromik program yazabilmelidir.
Greg Hewgill

Yapabilirsin. Cevabınızdan C ++ kodunu girersem, tam olarak sahip olduğunuz şeyi döndürür.
jzm

Programınızın yaptığı tüm girişleri tersine çevirmek. Programınızın çıktısı tam bir palindromik program değildir.
Greg Hewgill

Oh evet, seni anlıyorum. Güncellendi - şimdi daha iyi?
jzm

2
Evet, hepsi bu. //Yine de test çıktınız her satırın sonunda olmalıdır .
Greg Hewgill

0

PHP, 96 bayt

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

Örnek Kullanımı:

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

Bu akıllıca bir şey değil. Bu işi yapan basit bir kod parçası ... Oynamaya hazırdım. Bu kodun kötü programlama uygulamalarıyla dolu olduğunu biliyorum!

Son olarak, bu koddaki herhangi bir eleştiriyi ve düzenlemeyi memnuniyetle kabul edeceğim!


Code Golf'e hoş geldiniz. Bu bir fonksiyon, program değil. Diğer cevaplara bakın, iyi örnekler veriyorlar.
AL

0

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

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

Kurtulmamış (ama yine de çok zorunlu):

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

Girişsiz versiyon verildiğinde çıktı:

(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(
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.