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


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-> neverodadorevena
проміжком

Відповіді:


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.