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


22

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

Например, введите:, neverodраспечатать neveroddoreven. Вы должны также обрабатывать многословные, многострочные вводы.


2
Это кажется очень похожим на этот вопрос , за исключением того, что мы генерируем вместо проверки. Скорее всего, будут использованы те же трюки, чтобы сделать программу палиндромом.
Sp3000

2
Я могу полностью понять вопрос отрицания, но почему был отклонен ответ?
Джон Дворжак

2
@JanDvorak Я думаю, это потому, что для создания палиндрома используются комментарии, что делает эту стратегию приемлемой. Это не очень интересный способ и специально запрещен по крайней мере в одном вопросе, требующем палиндромного кода: codegolf.stackexchange.com/q/28190/15599 . Томек, добро пожаловать в программирование головоломок и Codegolf. Я все равно голосую, так что у вас есть доступ к нашей песочнице meta.codegolf.stackexchange.com/q/2140/15599, однако я рекомендую вам остаться и ответить на несколько вопросов, прежде чем задавать другой. Кроме того, не забудьте поискать подобные вопросы перед публикацией
Level River St

Разрешены ли функции (вместо целых программ)?
Nimi

Можем ли мы использовать разделитель для сгенерированного палиндрома? то есть neverod-> neverodadorevenaпромежуточным)
Rɪᴋᴇʀ

Ответы:


26

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

⌽,,⌽

Попробуй это здесь.

Другие решения:

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

объяснение

Они просто:

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

Monadic ,и ничего не делает на струнах. Дядький ,это конкатенация. Дядич возвращает свой правый операнд. И , очевидно, реверсия.


1
Обратите внимание, что это работает только в Dyalog APL.
FUZxxl

22

Пит 19х2 = 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


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 .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
CalculatorFeline

... правда, я понятия не имею, что я имел в виду под этим.
гистократ

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. (У Джольфа также есть неявный ввод для заполнения остальных аргументов, но это не проблема, поскольку за один раз дается только один ввод.) Я бы все же оставил ваше исходное решение в ответе.
Конор О'Брайен

@ Cᴏɴᴏʀ O'Bʀɪᴇɴ Спасибо! Я просто выбрал язык игры в гольф, который не показался мне слишком страшным, и прыгнул в него, я с удовольствием это выяснил. Я пытался выяснить, откуда пришел η, и понял, что это из-за попытки исправить мою начальную точку + i_i +. Спасибо за информацию!
набухает

3

PowerShell, 67

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

Попробуйте онлайн

Как подсказывает @mazzy, при использовании статического диапазона код может быть сокращен на 12 байт. Это, однако, ограничивает длину ввода до 9 Кбайт. Теоретически 9 МБ было бы возможно, но это значительно замедлило бы код.

$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 байт)
mazzy

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
Конор О'Брайен

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

1

tinyBF , 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
Одной строкой, но даже дольше (73, так как lambdaэто так долго):print((lambda a:a+a[::-1])(input()))#)))(tupni()]1-::[a+a:a adbmal((tnirp
no1xsyzy

Очень хорошо. Я менее знаком с лямбдами, но я постепенно привыкаю к ​​ним. Спасибо, что поделился.
Нооманн

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 input ( $_=<>), а затем 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
У меня есть 11 в Pyth, которые я еще не опубликовал, потому что я думал, что вы обязательно победите его;)
Оптимизатор

0

Javascript, 137 байт

Я не использую «трюк с комментариями», но я использую трюк с кавычками, к сожалению.

"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 байте вместо этого с помощью встроенной функции palindromize:

û

Попробуйте онлайн.


0

Сборка x86-64 (соглашение о вызовах Microsoft x64), 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инструкции 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

Backhand , 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.