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


15

Ваша задача - написать программу, которая работает на двух разных языках и выполняет следующие действия:

  • На одном языке это палиндромизирует данную строку.
    • Возьми струну. abcde
    • Переверните строку. edcba
    • Удалить первый символ. dcba
    • Приклейте его на оригинальную строку. abcdedcba
  • На другом языке это деполиндромизирует данную строку.
    • Берут струну, палидромизированную по вышеуказанному методу. abcdedcba
    • Получить символы от начала до середины. abcde

Помните, что это , поэтому выигрывает код с наименьшим количеством символов (не байтов).

Leaderboards

Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам.

Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:

# Language 1/Language 2, N bytes

где Nразмер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:

# Ruby/Python, <s>104</s> <s>101</s> 96 bytes

Если вы хотите включить в заголовок несколько чисел (например, потому что ваш счет равен сумме двух файлов или вы хотите перечислить штрафы за флаг интерпретатора отдельно), убедитесь, что фактический результат является последним числом в заголовке:

# Perl/C, 43 + 2 (-p flag) = 45 bytes

Вы также можете сделать название языка ссылкой, которая затем будет отображаться в фрагменте списка лидеров:

# [><>](http://esolangs.org/wiki/Fish)/Python, 121 bytes


@LuisMendo Одна секунда ...
Оливер Ни

@LuisMendo Хорошо, я обновил вопрос
Оливер Ни

Будет ли строка когда-либо содержать переводы строки?
Эрик Outgolfer

Может ли формат ввода отличаться на двух языках? Как строка с заключающими в кавычки или без них
Луис Мендо

@ LuisMendo Да.
Оливер Ни

Ответы:


14

05AB1E / MATL , 10 9 символов

9LQ2/)%¹û

В 05AB1E это палиндромизирует . В MATL это депалиндромизирует .

Пояснение в 05AB1E

Эта часть кода ничего не делает (глобально):

9L    Pushes array [1, 2, ... 9]
Q     Consumes the array, takes the input implicitly, and produces no output
2/    With no further input to take implicitly, this gives no output
)     Wrap stack into an array: gives an empty array
%     Consumes that array and, with no further input to take implicitly, gives no ouput 

Это часть, которая делает работу:

¹     Push input again
û     Palindromize. Implicitly display

Пояснение в MATL

Это часть, которая делает работу:

9L    Push array [0, 1j]
Q2/   Add 1, divide by two: transforms into [1/2, (1+1j)/2]
)     Use as index into implicit input. [1/2, (1+1j)/2] is interpreted as
      1/2:(end+1)/2, which is rounded to 1:(end+1)/2. So this takes elements
      from first to half, including both. Implicitly display

Это игнорируется:

%¹û   Everything after '%' is a comment

12

05AB1E / Желе , 6 символов

Палиндромизирует в 05AB1E.
Депалиндромизируется в желе.

œs2Ḣ¹û

Попробуйте в 05AB1E

05AB1E Объяснение

œ       # compute powerset of input
 s      # swap (does nothing)
  2     # push 2
   Ḣ    # does nothing
    ¹û  # palindromize input

Попробуйте это в желе

Желе объяснение

œs2     # split input in 2 chunks (first chunk is larger for odd length strings)
   Ḣ    # head, take first
    ¹û  # does nothing

6

Python 3 / JavaScript, 83 символа

Сохранено 2 байта благодаря @LevitatingLion

1//2;x=input();print(x+x[-2::-1]);"""
x=prompt();alert(x.slice(0,-x.length/2))//"""

Python палиндромизирует , JavaScript депалиндромизирует .

Я пытался держать больше кода постоянным между ними, но я не мог найти хороший способ проникнуть .sliceв Python. Вот альтернативный метод:

1//2;prompt=input,alert=print
x=prompt();1//2;x+=x[-2::-1]);"""
x=x.slice(0,-x.length/2))//"""
alert(x)

Можно заменить x[::-1][1:]с , x[-2::-1]чтобы сохранить двух символов.
LevitatingLion

@LevitatingLion Спасибо! Я пытался выяснить, как объединить два ломтика, но ничего не получалось.
ETHproductions

5

Scala / Javascript, 106 байт

/*\u002A/print(args(0)+args(0).reverse.tail)//*/
/*/**/
alert((s=prompt()).slice(0,-s.length/2))//\u000A*/

Палиндромизирует в скале и депалиндромизирует в javascript.

Попробуйте это на ideone (scala) - Предупреждение: неправильная подсветка синтаксиса

Попробуйте это на jsfiddle (javascript).

Объяснение:

Scala, как и Java, обрабатывает экранирование Юникода раньше, чем все остальное, поэтому Scacac видит код следующим образом:

/**/                                //\u002A is as asterisk, results in an empty block comment
print(args(0)+args(0).reverse.tail) //scala code
//*/                                //a line comment
/*                                  //scala supports nested block comments, so this comment...
  /*
  */
  alert((s=prompt()).slice(0,-s.length/2)) 
  //                                  //\u000A (newline) inserted here
*/                                  //...ends here

Javascript анализируется следующим образом:

/*\u002A/print(args(0)+args(0).reverse.tail)//*/ //block comment
/*                                               //a block comment...
  /*
*/                                               //...ending here, no nesting
alert((s=prompt()).slice(0,-s.length/2))         //code
//\u000A*/                                       //line comment

4

CJam / MATL , 18 знаков

r_W%(;
"j9LQ2/)%";

В CJam это палиндромизирует . В MATL это депалиндромизирует .

Объяснение в CJam

Рабочая часть:

r           Read string
_           Duplicate
W%          Reverse
(;          Remove first element

Пустышка:

"j9LQ2/)%"  Push this string
;           Remove it from the stack
            Implicitly display both strings obtained previously

Пояснение в MATL

Пустышка:

r           Push random number between 0 and 1
_           Negate
W           2 raised to that
%(;  Comment (ignored)

Рабочая часть:

"           For each element in the array at the top of the stack. Since it is a number,
            which is the same as a length-1 array, the following is executed once
  j         Input string
  9L        Push array [0, 1j]
  Q2/       Add 1, divide by 2: transforms into [1/2, (1+1j)/2]
  )         Use as index. [1/2, (1+1j)/2] is interpreted as 1/2:(end+1)/2, which is
            rounded to 1:(1+end)/2. So this takes elements from first to half,
            including both

Еще одна пустышка:

   %";      Comment (ignored)
            Implicitly display the previously obtained string

4

𝔼𝕊𝕄𝕚𝕟 / Javascript ES6, 55 символов

this._?Σ(`ï+ï.Ħ⬮.Đ1`):(x=prompt()).slice(0,-x.length/2)

Try it here (ES6 browsers only).

Палиндромизирует в 𝔼𝕊𝕄𝕚𝕟, депалиндромизирует в Javascript ES6.

Я думал, что это будет легко, так как 𝔼𝕊𝕄𝕚𝕟 компилируется в ES6 и большая часть ES6 может быть запущена в 𝔼𝕊𝕄𝕚𝕟. Видимо, я совершенно не прав.

объяснение

this._проверяет, _существует ли переменная в глобальной области видимости; 𝔼𝕊𝕄𝕚𝕟 использует Lodash и поэтому _сохранил, а чистый ES6 нет.

Сегмент - Σ(`ï+ï.Ħ⬮.Đ1`)- вычисляет из строки код, который палиндромизирует ввод. Обычно, код был бы ï+ïĦ⬮Đ1, но я помещаю точки, чтобы сделать компилятор счастливым .

Сегмент Javascript - (x=prompt()).slice(0,-x.length/2)- депалиндромизирует строку из приглашения.


Я собирался использовать функцию (так что мне не пришлось иметь дело с ней prompt), но функция оценки didn't не понравилась, поэтому я использовал promptи не имел функции, чтобы сделать компилятор счастливым .


Вау, компилятор привередлив.
HyperNeutrino

4

JavaScript ES6 / JavaScript ES3, 143 байта

function(x){'use strict';function a(){return x+x.split('').reverse().slice(1).join('')}{function a(){return x.slice(0,-x.length/2)}}return a()}

Палиндромизирует в JavaScript ES6, депалиндромизирует в JavaScript ES3. Не конкурируя , это просто попытка сделать полиглот для двух версий одного и того же языка.

В ES3 функции разрешены в блоках, но поскольку блоки не определяют области действия, новая функция просто заменяет первую функцию. В строгом режиме ES5 происходит сбой, поскольку он не позволяет определять функции в блоках. В ES6 это разрешено, и поскольку блоки теперь определяют области действия, первая функция не заменяется.

Протестировано в Internet Explorer 5 (эмулировано) для ES3 и Node.JS, а также Firefox для ES6.


4

Желе / CJam, 15 14 символов

q_,2./m]<e#¶ŒB

-1 символ благодаря 42545 (ETHproductions)

Попробуйте онлайн! (Желе) (палиндромизация)

CJam переводчик (Депалиндромизация)

Объяснение желе:

В Желе, так же, как \n, так это то, что желе видит:

q_,2./m]<e#
ṖṚṭ

ṖṚṭ         Main link. Arguments: z
Ṗ           Pop
 Ṛ          Reverse
  ṭ         Append
   ⁸        (implicit) z

CJam объяснение:

В CJam все после e#строки является комментарием. Итак, вот что видит CJam:

q_,2./m]< Code
q         All input
 _        Duplicate
  ,       Length
   2.     2.0
     /    Float division
      m]  Ceil
        < Take

@ETHproductions Ой, я забыл это! Это называется "отскок", вот почему.
Эрик Outgolfer

4

Perl / JavaScript, 73 байта

Perl возвращает палиндром, а JavaScript «де-палиндромизирует» входную строку.

s=prompt();console.log(s.slice(0,-s.length/2));eg=1;t=eg;s=$=reverse$_=eg

JavaScript

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

Вся работа происходит в первом разделе:

s=prompt();console.log(s.slice(0,-s.length/2));

Сохраняет входные данные s, затем возвращает первую половину (округленную) строки. Остальная часть скрипта бессмысленно присваивает переменные:

eg=1;t=eg;s=$=reverse$_=eg

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

s=prompt();console.log(s.slice(0,-s.length/2));eg=1;t=eg;s=$=reverse$_=eg

Perl

Должен быть запущен -pl, например, с:

perl -ple 's=prompt();console.log(s.slice(0,-s.length/2));eg=1;t=eg;s=$=reverse$_=eg' <<< 'test'
# returns testtset

Код представляет собой две подстановки ( s///), но =вместо него используется разделитель /:

s/prompt();console.log(s.slice(0,-s.length\/2));eg/1;t/eg;s/$/reverse$_/eg

Первая, заменяющая prompt();console.log(s.slice(0,-s.length\/2));eg(которая, по общему признанию, испортит вашу строку, если она содержит что-то вроде "prompt;console.logs.slice0,-s.length/2;eg"...), с 1;tкоторой evaled, возвращая t, вторая заменяет конец строки ( $) с reverse$_которой затем также evaled и добавляет исходный источник строка перевернутая.

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


3

Python 2 / Nim , 76 74 байта

#[
s=input();print s+s[-2::-1]#let s=stdin.readLine;echo s[0..s.len div 2]

Палиндромизирует в Python, депалиндромизирует в Nim. Злоупотребляет синтаксисом комментариев.

Python и Nim оба используют #для комментариев. Python вообще не поддерживает блочные комментарии (за исключением многострочных строк с""" ), но Nim поддерживает с #[ comment ]#.

Мы злоупотребляем этим, чтобы закомментировать Python (в начале) для Nim, а затем используем завершающий ] код в Python для запуска кода Nim, похожего на комментарий для Python.

Код Python требует ввода, заключенного в кавычки. Код Nim не имеет этого ограничения.

Протестировано на Python 2.7.8 и Nim 0.14.2.

Идео это! - Python 2, палиндромизирующий

Идео это! - Nim, depalindromizing. Очевидно, что версия Nim Ideone (0.11.2) не поддерживает многострочные комментарии. Работает на Nim 0.14.2.




2

Japt / JavaScript, 63 символа

Урок дня: полиглоты Japt / JavaScript всегда плохая идея ...

$Oq=1;$Oq &&0
alert(($U=prompt()).slice(0*$U,-$U.length/2));$Uê

JavaScript

Первая строка устанавливает переменную $Oqв 1, затем выполняет no-op с $Oq &&0.

Вторая строка запрашивает у пользователя вводную строку, присваивая ее переменной $U, затем разделяет ее от индекса 0*$U(всегда 0) до индекса -$U.length/2. Это выполняет необходимую депалиндромизацию; результат тогда alertед. Программа заканчивается на ReferenceError, потому что переменная$Uê не определена.

Japt

В Japt все, что находится между знаками доллара, вставляется непосредственно в переданный исходный код. Кроме этого, каждая строчная буква переносится, например .q(, если только предыдущий символ не был другой строчной буквой, в этом случае он становится "q". Пространство передается ), и все недостающие символы добавляются автоматически. Вышеуказанная программа переносится примерно на:

Oq=1;O.q()&&0
.a("l".e("r".t((U=prompt()).slice(0*U,-U.length/2))));U.ê()

Затем это выполняется как JavaScript. Oq=1;устанавливает переменную Oqв 1. Это никогда не используется снова, так что это неоперация. O.q()это функция, которая очищает STDOUT и возвращает undefined; это ложь, поэтому весь&&0 .a("l".e(... часть не выполнена.

Единственная часть , которая действительно имеет значение U.ê(). Неявный ввод помещает входную строку U, .ê()превращает ее в палиндром, а неявный вывод отправляет результат в STDOUT.


Если разрешены записи функций, для 34 символов будет работать следующее:

X=>($X=X).slice(0,-X.length/2);$Uê

Первая часть определяет функцию ES6, но это все еще полная программа на Japt. Проверьте это онлайн!


2

Java / Brainfuck, 71 байт

/*+[,>]<[<]>[.>]<<[.<][*/a->a.substring(0,Math.ceil(a.length()/2d));//]

Палиндромизирует в БФ, депалиндромизирует в Яве.

Для ясности, вот что имеет значение для переводчика BF:

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

где последний цикл, содержащий символы из лямбды Java, пропускается, потому что указатель указывает на нулевой символ в этой точке.


0

05AB1E / Java 8, 102 символа

//¹ûq
interface M{static void main(String[]a){System.out.print(a[0].substring(0,a[0].length()/2+1));}}

Палиндромиз в 05AB1E.
Депалиндромизировать в Java 8.

Пояснение 05AB1E:

//     # No-ops
¹      # First input
 û     # Palindromize it
  q    # Terminate the program
interface M{static void main(String[]a){System.out.print(a[0].substring(0,a[0].length()/2+1));}}
       # No-ops

Пояснение Java 8:

//¹ûq                           // No-ops
interface M{                    // Class
  static void main(String[]a){  //  Mandatory main-method
    System.out.print(           //   Print to STDOUT:
      a[0].substring(0,         //    The substring of the input-argument from index 0 to
        a[0].length()/2+1));}}  //    the length of the input integer-divided by 2 plus 1
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.