Перетворіть програму на паліндромну програму


15

Паліндром є рядком , яка є таким же , вперед і назад, такими як «гоночним».

Напишіть програму якоюсь мовою L, яка приймає будь-яку програму P1 мовою L як вхідну та виводить паліндромну програму P2 мовою L, яка робить те саме, що і P1.

Не потрібно турбуватися про обробку вхідних програм із синтаксичними помилками.

Це кодовий гольф , тому рішення з найменшою кількістю байтів виграє.


Чи можемо ми визначити мову L?
Грег Хьюгілл

1
@GregHewgill Так. L - мова, на якій ви хочете написати свою програму.
Джастін

У деяких мовах це напрочуд жорстко.
Джастін

3
З Тьюринга підмножина Python, це правильний вхід: x=input();print(x+'#'+x[::-1]). Підмножина - це набір усіх програм, які не містять нових рядків.
Джастін

Відповіді:


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" - загальну стенографію "Не стирайте", яка використовується для позначення речей на дошках / дошках, щоб люди не помилялися з ними за неважливі скрегітші та стирали їх.
anaximander

як це працює, я не знаю perl, точніше, як він квітує (дістаньте рядок, що він обертається)?
Cruncher

2
1+ працює в більшості випадків, за винятком випадків, коли програма закінчується __DATA__читанням, наприклад. print while(<DATA>);\n__DATA__змінить поведінку.
Сільвестер

1
@Sylwester: Правда. Це працює для підмножини скриптів Perl, які не використовуються __DATA__. :)
Грег Хьюгілл

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

Виведіть на себе (коли попередньо попередньо попередньо)

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

Дякуємо Грегу Хьюгілу за допомогу у вирішенні проблем та у гольф.


Хороша робота, б'є мій кульгавий спроба Python.
Грег Х'югілл

1
@GregHewgill Я віддаю перевагу приємному опису приємного коментаря ;-)
Джастін

1
Гаразд добре ... Я зазвичай не голосую проти себе. :)
Грег Х'югілл

5
@GregHewgill я голосувати «проти» себе багато . Я підтримую відповіді на основі їх достоїнств, а не на тому, відповів я чи ні.
Джастін

8

GolfScript, 10 9 байт

"
}"+.-1%

Досить схожий на рішення мінітеху , але він добре працює з новими лініями . Він покладається на смішну (і бездокументовану) поведінку 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буде фактичним символом нового рядка) як ваш вклад.
Джастін

1
@Quincunx: коментарі Пескі ... Новий рядок перед фігурною дужкою має це виправити.
Денніс

До і після. Потрібно залишатися паліндром.
Джастін

@Quincunx: Звичайно. Це має працювати зараз.
Денніс

5

машинний код x86 на DOS ( .comфайл) - 70 байт

Робота з файлами .COM, створення паліндрому дуже проста - оскільки COM "завантажувач" просто ставить вміст файлу за адресою 100hі стрибає туди, програма вже має якось жорстко кодувати його кінець і ігнорувати все після нього, тому ми можемо просто додати зворотний бік перших байтів N-1 (лише застереження: якщо програма якось намагається робити трюки з довжиною файлу, все порушується).

Ось шістнадцятковий дамп мого .COM-паліндромізації .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

Свого роду вкрав метод коментаря 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: Так, я думав про це пізніше. Єдиний очевидний спосіб, з яким я можу впоратися, це спершу розгорнути складені лінії.
Грег Хьюгілл

можна зробити за невелику ціну - мою відповідь на C
edc65

2

Brainfuck, 749 без пробілу (не для гольфу)

Це створює мозкові програми, які відображають паліндроми, тобто вони є дзеркальними зображеннями самих себе.

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

Враховуючи програму, вона виводить

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

з PROGRAMі MIRRORзамінити програмою (без без Brainfuck символів) і його дзеркальне відображення.


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 Стандарт, дійсний код, багато попереджень

Безумовно

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

Я думаю, ви, можливо, неправильно зрозуміли одну з інструкцій. Ваша програма повинна мати можливість приймати будь-яку програму як вхідну інформацію і виписувати паліндромну програму, яка робить те саме, що і оригінальна програма.
Грег Хьюгілл

Він може .. Якщо я введіть код 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

Це нічого розумного. Це просто простий код, який виконує цю роботу ... Я був в настрої до гри. Я знаю, що цей код насичений поганими методами програмування!

Нарешті, я з радістю прийму будь-яку критику та редагування цього коду!


Ласкаво просимо до 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)))))

Безумовно (але все ще дуже важливо):

(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(
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.