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


15

Ваше завдання - написати програму, яка працює двома різними мовами і виконує наступні дії:

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

Пам'ятайте, що це , тому код з найменшими символами (не байтами) виграє.

Табло лідерів

Ось фрагмент стека для створення як звичайного табло, так і огляду переможців за мовою.

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

# 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 Добре, я оновив питання
Олівер Ні

Чи буде рядок колись містити нові рядки?
Ерік Аутгольфер

Чи може формат введення бути різним у двох мовах? Як рядок із додаючими цитатами або без них
Луїс Мендо

@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

Спробуйте в Jelly

Желе Пояснення

œ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 depalindromizing .

Я намагався зберігати більше коду постійним між ними, але я не міг придумати гарний спосіб проникнути .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).

Пояснення:

Скала, як і java, обробляє unicode, уникаючи перед усім іншим, тому scalac бачить код так:

/**/                                //\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)- depalindromizing рядок з підказки.


Я збирався використовувати функцію (тому мені не доводилося мати справу prompt), але функція оцінювання 𝔼𝕊𝕄𝕚𝕟 не сподобалась, тому я використовував 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 (Депаліндромізація)

Пояснення желе:

У Jelly - це те саме, що \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 Whoops, я це забув! Це називається "відскок", ось чому.
Ерік Аутгольфер

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яким evalредагується, повертається t, другий замінює кінець рядка ( $), з reverse$_яким потім також evalредагується, і додає початкове джерело рядок перетворений.

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


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, депаліндромізуючи. Мабуть, версія Nim Ideone (0.11.2) не підтримує багатолінійні коментарі. Працює над Німом 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, потім виконує не-оп $Oq &&0.

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

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.

Для ясності, це важливе значення для інтерпретатора 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.