Паліндромний генератор паліндром


22

Створіть програму, яка перетворює вхідний рядок у паліндром, починаючи з рядка введення. Сама програма повинна бути паліндром.

Наприклад введення:, neverodдрук neveroddoreven. Ви також повинні обробляти багатослівні та багаторядкові введення.


2
Це здається дуже схожим на це питання , за винятком того, що тут ми генеруємо замість перевірки. Цілком імовірно, що для створення програми паліндром будуть використані ті ж хитрощі.
— Sp3000

2
Я цілком можу зрозуміти питання, яке було спрощено, але чому відповідь була спростована?
— Джон Дворак

2
@JanDvorak Я здогадуюсь, тому що він використовує коментарі, щоб зробити паліндром, який конкретно робить цю стратегію в порядку. Це не дуже цікавий спосіб і спеціально заборонено хоча б в одному запитанні, що вимагає паліндромного коду: codegolf.stackexchange.com/q/28190/15599 . Томек, ласкаво просимо до програмування пазлів та кодового гольфу Я все-таки звертаюся з пропозицією, щоб у вас був доступ до нашої піктограми meta.codegolf.stackexchange.com/q/2140/15599, проте я рекомендую вам зупинитися і відповісти на кілька питань, перш ніж задавати інше. Також не забудьте шукати подібні запитання перед публікацією
— Level River St

Чи дозволені функції (замість цілих програм)?
— німі

Чи можемо ми використовувати роздільник для сформованого паліндрому? тобто neverod-> neverodadoreven(з a
— проміжком

Відповіді:


26

Діялог АПЛ, 6 4

⌽,,⌽

Спробуйте тут.

Інші рішення:

⌽,⊢⊢,⌽
⌽⊢⊢,⊢⊢⌽

Пояснення

Вони просто:

{⌽((,⍵),(⌽⍵))}
{⌽((,⍵)⊢((⊢⍵),(⌽⍵)))}
{(⌽⍵)⊢((⊢⍵),((⊢⍵)⊢(⌽⍵)))}

Монадік ,і ⊢нічого не робить на струнах. Діадик ,- це конкатенація. Діадик ⊢повертає свій правильний операнд. І ⌽це очевидно реверсія.


1
Зауважте, що це працює лише у Dyalog APL.
— FUZxxl

22

піт 19x2 = 38

http://www.pietfiddle.net/img/aoNhlwC47U.png?cs=15&rot=4

Приймає вхід, поки не зустріне 0x00. Не закінчується, але вихід буде правильним.


3
Симетричний: так; паліндромний:?
— Синій

@Blue Я не думаю, що неможливо зробити файл зображення PNG паліндромним завдяки заголовку та нижньому колонтитулу. Також стиснення PNG означає, що байти на зображенні майже точно не паліндромні.
— Esolanging Fruit

1
@EsolangingFruit Хоча можна стверджувати, що еквівалент зображення паліндром повинен бути центросиметричним.
— Джонатан Фрех

17

APL, 9

⍞←Z,⌽,Z←⍞

Пояснення:

       Z←⍞  ⍝ read a line from the keyboard, and store it in Z
      ,     ⍝ flatten into one-dimensional array (this has no effect here)
     ⌽      ⍝ reverse
   Z,       ⍝ concatenate Z to its reverse
⍞←         ⍝ explicit output (not necessary, but it makes it a palindrome)

13

CJam, 13 байт

qL;_-1%1-_;Lq

qL;                 "Read the input, Put an empty array on stack and pop that array";
   _-1%             "Now the string is on top, make a copy and reverse the copy";
       1-           "Remove occurrences of integer 1 from the reverse string. [no-op]";
         _;         "Copy the reversed string and pop it";
           Lq       "Put an empty array on stack and read the remaining input. Remaining";
                    "input will be empty as we already read whole of the input";

Спробуйте його онлайн тут


або ..

GolfScript, 9 байт

.-1%}%1-.

.                 "Input is already on stack. Make a copy";
 -1%              "Reverse the copy";
    }             "This marks the beginning of a super comment. Anything after this in the";
                  "code is a comment";
     %1-.         "no-op comment";

Спробуйте тут


Я думаю, ви знайшли помилку в аналізаторі GolfScript зі своїм "супер-коментарем". Зауважте, звичайний #коментар спрацював би так само добре.
— Ільмарі Каронен

@IlmariKaronen Це не я, }як відомо, був чудовим коментарем з віків :)
— Оптимізатор

8

C ++, 162 байти

#include<cstdio>//
main(){int c=getchar();if(c>0)putchar(c),main(),putchar(c);}//};)c(rahctup,)(niam,)c(rahctup)0>c(fi;)(rahcteg=c tni{)(niam
//>oidtsc<edulcni#

C, 117 байт

main(c){c=getchar();if(c>0)putchar(c),main(),putchar(c);}//};)c(rahctup,)(niam,)c(rahctup)0>c(fi;)(rahcteg=c{)c(niam

1
Бог благословив дві косі риски
— хаха

7

Haskell, 102 + 22 = 124 байти

a b fa=fa<|>b
fa=reverse>>=a
main=interact fa
niam=main
af tcaretni=niam
a=>>esrever=af
b>|<af=af b a

Це потрібно запустити з Control.Applicativeмодулем в області застосування, який можна встановити через файл ghci init .ghci: :m Control.Applicative(-> +22 байт).

Без фокусу без коментарів, лише 7 функцій, де 4 з них ніколи не викликаються.

Якщо дозволено функції (замість програм):

Haskell, 55 + 22 = 77 байт

a b fa=fa<|>b
f=reverse>>=a
a=>>esrever=f
b>|<af=af b a

Використання f "qwer"->"qwerrewq"

Редагувати: попередня версія була просто неправильною.


3

Pyth, 11 байт

+z_z " z_z+

У Pyth нічого, що передує пробілу, не друкується. Таким чином, ми просто додаємо мінус рядка до себе, ставимо пробіл, починаємо рядок і дзеркально відбиваємо ліву частину цитати "

Спробуйте його онлайн тут


3

Рубі, 44

s=gets p
s+=s.reverse||esrever.s=+s
p steg=s

Бере багаторядковий рядок як вхід з stdin, виводить представлення Ruby цієї рядка, з'єднаної в його зворотній бік. Може обрізати характер, замінивши ||з #закомментировать мертвий код на другу лінії.


s=gets p! =p steg=s
— КалькуляторFeline

... правда, я поняття не маю, що я мав на увазі під цим.
— гістократ

3

Джольф, 9 байт

Більш нова мова, неконкурентна

Спробуйте тут

aη+i_i+ηa

Пояснення: Я тільки що почав Джольфа і не думаю, що я пояснюю це належним чином.

aη         alert function, arity of the function can't be reduced by 1 so it stays at 1
  +i_i     concatenate the input with the reversed input
      +η   arity of the add reduced by 1, it just takes the following character (a)
        a  returns the input

1
Ласкаво просимо до PPCG! Я побачив вашу іншу відповідь, і я з вдячністю вдячний за вас, використовуючи цю мову! Це мої власні винаходи, сподіваюся, вам сподобається :) Це дійсно приємне рішення, дуже добре зроблене! Мені подобається те, як ти використовував ηрішення, дуже добре зроблено. Ви можете зберегти два байта, усуваючи му, як: a+i_i+a. (Джолф також має неявне введення для заповнення решти аргументів, але це не проблема, оскільки одночасно вводиться лише один ввід.) Я б все-таки зберігав ваше оригінальне рішення у відповіді.
— Conor O'Brien

@ Cᴏɴᴏʀ O'Bʀɪᴇɴ Дякую! Я просто вибрав мову для гри в гольф, яка не здалася надто страшною, і вскочила, я насолоджувався, розгадуючи це. Я намагався розібратися, звідки походить η, і зрозумів, що це саме від спроби виправити мою вихідну точку + i_i +. Дякую за інформацію!
— опухає

3

PowerShell, 67

$args|%{$_+-join$_[$_.Length..0]}#}]0..htgneL._$[_$nioj-+_${%|sgra$

Спробуйте в Інтернеті

Як пропонує @mazzy, код може бути скорочений на 12 байт при використанні статичного діапазону. Однак це обмежує вхідну довжину до 9 КБ. Теоретично 9MBytes було б можливим, але це значно уповільнило б код.

$args|%{$_+-join$_[9kb..0]}#}]0..bk9[_$nioj-+_${%|sgra$

1
Альтернатива 67 байт:param($s)$s+-join$s[$s.Length..0]#]0..htgneL.s$[s$nioj-+s$)s$(marap
— маззи

якщо довжина вхідного рядка менше 9 Кбайт, то $args|%{$_+-join$_[9Kb..0]}#}]0..bK9[_$nioj-+_${%|sgra$(55 байт)
— маззи

2

Нечітка Окто Гуакамоле, 17 байт

FOG новіший, ніж цей виклик, тому це неконкурентоспроможний.

^dz''sjX@Xjs''zd^

Альт-рішення в 19 байтах:

^Czs''.jX@Xj.''szC^

Вони обидва беруть введення, дублюють і зворотно і приєднуються до стеку.

Пояснення:

^dz''sj@js''zd^
^                # Get input
 d               # Duplicate ToS (input)
  z              # Reverse ToS
   ''            # Push empty string (for joining separator)
     s           # Move the empty string to the inactive stack
      j          # Join the active stack with the top of the inactive stack as the delimiter and push the result.
       X         # Print the ToS
        @        # End the program
        Xjs''zd^  # Backwards version of the beginning.

Також не конкуруючи: P
— Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ ой. : P
— Rɪᴋᴇʀ

1

крихітнийBF , 40

|=||==>|=|=|=+|=>==||==>=|+=|=|=|>==||=|

Моя перша думка була Brainfuck, але дужки неможливо зіставити ... на щастя, tinyBF має простіший контроль потоку.

Немає коментарів, вона бере нульовий завершений рядок як вхідний і повертає результат у нульовий завершений рядок. Ви можете протестувати його тут , просто попередивши, що він не зупиняється (хоча Firefox принаймні вимагає припинити невідповідний сценарій).

Прокоментував:

|=|                        Retrieve a byte of input.
|                          Positive (opening) bracket.
   ==                      Output the byte.
   >                       Move the pointer in positive direction.
   |=|                     Retrieve a byte of input.
   =                       Switch direction to negative.
|                          Negative (closing) bracket.
=                          Switch direction.
+                          Increment byte to execute return loop.
|                          Opening bracket.
   =>                      Move the pointer in negative direction.
   ==                      Output the byte.
|                          Closing bracket.
|=|                        Output the null terminator.
|==>|=|=|=+|=>==|          ...and keep null terminating it just to be sure.

Зауважте, що якщо ви закодуєте його в 2-бітні інструкції, він скоротить розмір до 10 байт (це не буде паліндром).


1

Python 3, 59 байт

a=input()#
print(a+a[::-1])#([1-::]a+a)tnirp
#()tupni=a

Я намагався зробити все можливе, щоб знайти рішення, яке використовувало лише одну лінію, але мені не пощастило.

Python 3, 79 байт

a=input()#()tupni=a#
print(a+a[::-1])#([1-::]a+a)tnirp
#a=input()#()tupni=a

Моя оригінальна спроба, в якій кожен рядок - паліндром. Я не думаю, що це потрібно для цього виклику, але я включив його на всякий випадок.


1
lambdaprint((lambda a:a+a[::-1])(input()))#)))(tupni()]1-::[a+a:a adbmal((tnirp
— Однорядковий,

Дуже хороша. Я менш знайомий з лямбдами, але я повільно звикаю до них. Дякую, що поділились.
— Нооманн

1

Віци, 9 байт

z:Zr?rZ:z
z          Grab all string input from the command line arguments.
 :         Duplicate this stack.
  Z        Print all elements in this stack as a string.
   r       Reverse (reverses an empty stack).
    ?      Go right a stack.
     r     Reverse (reverses the input).
      Z    Print all elements in this stack as a string.
       :   Duplicate the stack (duplicates an empty stack).
        z  Grab all input from the command line (the command line arguments stack is already empty).

Спробуйте в Інтернеті!


1

Befunge , 37 байт

~:0`!#v_:,
  >:#,_@_,#:>  
,:_v#!`0:~

Спробуйте в Інтернеті!

Верхня лінія натискає та друкує кожен символ введення. Другий рядок (перед @) друкує стек у зворотному порядку, але ми вводимо умовно, _щоб споживати -1, що генерується при закінченні введення читання. Інша половина коду (включаючи некрасиві промальовані нові рядки) робить джерело паліндром, але неверно працює.


1

C # ( 33 32 + 1) * 2 = 68 66 байт

збережено 2 байти до використання .Aggregate ()

s=>s+s.Aggregate("",(a,b)=>b+a);//;)a+b>=)b,a(,""(etagerggA.s+s>=s

О, стара добра лямбда, ви можете її спіймати

Func<string, string> f=<lambda here>

а потім зателефонуйте за допомогою

f("neverod")

1

Perl, 45 байт

;print$_=<>,~~reverse;m;esrever~~,><=_$tnirp;

Досить простий, prints введення ( $_=<>), а за ним reverseйого вхід . reverseповертається, $_тому що ми використовуємо його у скалярному контексті шляхом префіксації до ~~. Тоді ми співставляємо ( m//використовуючи ;як роздільник), у недійсному контексті, проти зворотного сценарію.

Якщо ми можемо гарантувати, нам не доведеться створювати паліндром, esrever,><=_$tnirpми можемо скоротити код до 43 байт :

g.print$_=<>,reverse.m.esrever,><=_$tnirp.g

Використання

echo -n 'neverod' | perl -e 'g.print$_=<>,reverse.m.esrever,><=_$tnirp.g'
neveroddoreven

Perl, 26 байт

Включає 25 байт код + 1 для -p.

$_.=reverse;m;esrever=._$

Я не думаю, що це дійсно, оскільки для цього потрібен -pпрапор, який, на мою думку, не може бути легко поєднаний у вміст сценарію, щоб створити справжній паліндром. В основному ті ж дзвінки, що й вище, за винятком того, що він також покладається на те, що -pтакож додає ;за кадром (на нових Perls ...), щоб закрити m//.

Використання

echo -n 'neverod' | perl -pe ';$_.=reverse;m;esrever=._$;'
neveroddoreven

0

Піт, 15

 k k+ z_z +k k 

Помітьте пробіл на початку та в кінці.

Досить дратівливе завдання в Pyth. z_zдрукує потрібний паліндром, але він друкує z(вхідний рядок) та _zобернену на двох різних лініях. +поєднує два слова, але +в кінці потрібні два нові висловлювання в кінці (і на початку). Я вибираю kі k, які є просто порожніми рядками. Потім багато білого простору, який пригнічує друк (і друк порожніх пробілів, які генерують перерви в рядку курсу).

Оскільки пробіл придушує кожен вихід, окрім +z_z, ви можете замінити ks та літерал на атрибут 0. Наприклад, 1 2+ z_z +2 1або T Z+ z_z +Z T.

Спробуйте в Інтернеті .


1
У мене в Pyth є 11, якого я ще не розмістив, бо я думав, що ви його обов'язково переможете;)
— Оптимізатор

0

Javascript, 137 байт

Я не використовую "трюк з коментарями", але я використовую хитрість лапки, що виходить, lol.

"a\"};))''(nioj.)(esrever.)''(tilps.b(tacnoc.b nruter{)b(a noitcnuf";function a(b){return b.concat(b.split('').reverse().join(''));};"\a"

4
Я не думаю, що це має значення; дві центральні символи є ";. Додавання ;останнього знаку до рядка має виправити це.
— ETHproductions

На даний момент ця відповідь є недійсною. Будь ласка, виправте або видаліть.
— Джонатан Фрех


0

PHP, 28 + 1 + 28 = 57 байт

<?=($x=$argv[1]).strrev($x);#;)x$(verrts.)]1[vgra$=x$(=?<

приймає дані з аргументу командного рядка. цитата для багатослівного слова, уникнути нових рядків для багаторядкових.


0

Python 2, 51 байт

s=input();print s+s[::-1]#]1-::[s+s tnirp;)(tupni=s

Я здивований, що ніхто про це не думав! Потреби вводяться ( 'або "). Якби функції були дозволені, я міг би це зробити за 37 байт:

lambda x:x+x[::-1]#]1-::[x+x:x adbmal

0

C ++ 14, 152 116 байт

Як безіменного лямбда, передбачає s, щоstring

[](auto s){decltype(s)r;for(auto c:s){r=c+r;}return s+r;}//};r+s nruter};r+c=r{)s:c otua(rof;r)s(epytlced{)s otua(][

Старе рішення:

[](auto s){auto r=s;for(auto p=s.rbegin()-1;++p!=s.rend();r+=*p);return r;}//};r nruter;)p*=+r;)(dner.s=!p++;1-)(nigebr.s=p otua(rof;s=r otua{)s otua(][

Використання:

auto f=[](auto s){decltype(s)r;for(auto c:s){r=c+r;}return s+r;};

main(){
 string a="123456789";
 cout << f(a) << endl;
}

0

05AB1E , 5 байт

«q«Â

Спробуйте в Інтернеті.

Пояснення:

        # Bifurcate (short for Duplicate & Reverse) the (implicit) input
         #  i.e. "neverod" → "neverod" and "doreven"
 «       # Concat both together
         #  i.e. "neverod" and "doreven" → "neveroddoreven"
  q      # Exit the program (and implicitly output the concatted result)
   «Â    # No-ops

Або в якості альтернативи:

R«q«R

Спробуйте в Інтернеті.

Де Rреверс, і то« береться неявно знову, щоб визначити.


ПРИМІТКА. Якщо нам дозволено виводити neverodorevenна вхід neverod, який все ще є паліндром, це можна зробити в 1 байт замість вбудованого паліндромізу:

û

Спробуйте в Інтернеті.


0

x86-64 Асамблея (Microsoft x64 call Convention), 89 байт:

80 39 00 48 8B D1 4C 8B C1 74 0B 48 FF C2 49 FF C0 80 3A 00 75 F5 48 FF CA 8A 02 41 88 00 48 8B C2 48 FF CA 49 FF C0 48 3B C1 77 ED C3 ED 77 C1 3B 48 C0 FF 49 CA FF 48 C2 8B 48 00 88 41 02 8A CA FF 48 F5 75 00 3A 80 C0 FF 49 C2 FF 48 0B 74 C1 8B 4C D1 8B 48 00 39 80

Розібрано:

 0000000000000000: 80 39 00           cmp         byte ptr [rcx],0
 0000000000000003: 48 8B D1           mov         rdx,rcx
 0000000000000006: 4C 8B C1           mov         r8,rcx
 0000000000000009: 74 0B              je          0000000000000016
 000000000000000B: 48 FF C2           inc         rdx
 000000000000000E: 49 FF C0           inc         r8
 0000000000000011: 80 3A 00           cmp         byte ptr [rdx],0
 0000000000000014: 75 F5              jne         000000000000000B
 0000000000000016: 48 FF CA           dec         rdx
 0000000000000019: 8A 02              mov         al,byte ptr [rdx]
 000000000000001B: 41 88 00           mov         byte ptr [r8],al
 000000000000001E: 48 8B C2           mov         rax,rdx
 0000000000000021: 48 FF CA           dec         rdx
 0000000000000024: 49 FF C0           inc         r8
 0000000000000027: 48 3B C1           cmp         rax,rcx
 000000000000002A: 77 ED              ja          0000000000000019
 000000000000002C: C3                 ret
 000000000000002D: ED                 in          eax,dx
 000000000000002E: 77 C1              ja          FFFFFFFFFFFFFFF1
 0000000000000030: 3B 48 C0           cmp         ecx,dword ptr [rax-40h]
 0000000000000033: FF 49 CA           dec         dword ptr [rcx-36h]
 0000000000000036: FF 48 C2           dec         dword ptr [rax-3Eh]
 0000000000000039: 8B 48 00           mov         ecx,dword ptr [rax]
 000000000000003C: 88 41 02           mov         byte ptr [rcx+2],al
 000000000000003F: 8A CA              mov         cl,dl
 0000000000000041: FF 48 F5           dec         dword ptr [rax-0Bh]
 0000000000000044: 75 00              jne         0000000000000046
 0000000000000046: 3A 80 C0 FF 49 C2  cmp         al,byte ptr [rax+FFFFFFFFC249FFC0h]
 000000000000004C: FF 48 0B           dec         dword ptr [rax+0Bh]
 000000000000004F: 74 C1              je          0000000000000012
 0000000000000051: 8B 4C D1 8B        mov         ecx,dword ptr [rcx+rdx*8-75h]
 0000000000000055: 48 00 39           add         byte ptr [rcx],dil
 0000000000000058: 80

Зауважте, що код після retінструкції at 2Cнедоступний, тому не має значення, що це дурниці


0

Japt , 4 байти

êêêê

Спробуйте в Інтернеті!

Як це працює

U.ê("ê".ê("ê"))  Transpiled to JS

       .ê("ê")   String.ê(string): true if `this` is palindrome
    "ê".ê("ê")   true (treated same as 1)
U.ê(          )  String.ê(number): palindromify
                   "abc"->"abccba" if `number` is odd, "abcba" otherwise
                 `true` is odd number, so we achieve the desired function

Альтернативно 4 байти

pwwp

Спробуйте в Інтернеті!

Як це працює

U.p("w".w("p"))  Transpiled to JS
    "w".w(   )   Reverse of "w" ("p" is ignored)
U.p("w")         Append U.w(), which is reverse of U, to the right of U

0

Бекхенд , 33 27 байт

iH~0}|{<:: oi]io ::<{|}0~Hi

Спробуйте в Інтернеті!

В відміну від багатьох рішень тут, це один фактично робить використовувати palindromised код!

Пояснення:

i  0 |{      Get the first character and enter the loop
        :  o    Output the character while preserving it
              i  :     Get input and duplicate it
                   <{  Turn around
             ]         Increment the copy to check if EOF   
    }| <    Loop again if not EOF
  ~   If EOF, pop the extra copy of EOF
 H    Terminate, printing the contents of the stack.

Загалом невиконані інструкції:

       :   i  o :   |}0~Hi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.