Poliglot Palindrome


15

Twoim zadaniem jest napisanie programu działającego w dwóch różnych językach i wykonującego następujące czynności:

  • W jednym języku palindromalizuje dany ciąg.
    • Weź sznurek. abcde
    • Odwróć ciąg. edcba
    • Usuń pierwszy znak. dcba
    • Przyklej go do oryginalnego sznurka. abcdedcba
  • W innym języku depalindromalizuje dany ciąg.
    • Weź ciąg palidromizowany powyższą metodą. abcdedcba
    • Zdobądź postacie od początku do środka. abcde

Pamiętaj, to jest , więc wygrywa kod z najmniejszą liczbą znaków (nie bajtów).

Liderów

Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

# Language 1/Language 2, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

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

Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

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

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie tabeli wyników:

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


@LuisMendo Jedna sekunda ...
Oliver Ni

@LuisMendo Dobra, zaktualizowałem quesiton
Oliver Ni

Czy ciąg będzie kiedykolwiek zawierał znaki nowej linii?
Erik the Outgolfer

Czy format wejściowy może być inny w dwóch językach? Jak ciąg z załączonymi cytatami lub bez nich
Luis Mendo

@LuisMendo Tak.
Oliver Ni

Odpowiedzi:


14

05AB1E / MATL , 10 9 znaków

9LQ2/)%¹û

W 05AB1E to palindromalizuje . W MATL depalindromalizuje .

Objaśnienie w 05AB1E

Ta część kodu nic nie robi (globalnie):

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 

Jest to część, która działa:

¹     Push input again
û     Palindromize. Implicitly display

Objaśnienie w MATL

Jest to część, która działa:

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

Jest to ignorowane:

%¹û   Everything after '%' is a comment

12

05AB1E / Galaretka , 6 znaków

Palindromizes w 05AB1E.
Depalindromizes w galarecie.

œs2Ḣ¹û

Wypróbuj w 05AB1E

05AB1E Objaśnienie

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

Wypróbuj w galarecie

Wyjaśnienie galaretki

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

6

Python 3 / JavaScript, 83 znaki

Zaoszczędzono 2 bajty dzięki @LevitatingLion

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

Python palindromizes , JavaScript depalindromizes .

Próbowałem utrzymać stały kod między nimi, ale nie mogłem wymyślić dobrego sposobu na wkradnięcie się .slicedo Pythona. Oto alternatywna metoda:

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

Można wymienić x[::-1][1:]ze x[-2::-1]aby zapisać dwa znaki.
LevitatingLion,

@LevitatingLion Dziękujemy! Próbowałem wymyślić, jak połączyć te dwa plastry, ale wydawało się, że nic nie działa.
ETHprodukcje

5

Scala / JavaScript, 106 bajtów

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

Palindromizes w scala i depalindromizes w javascript.

Wypróbuj na ideone (scala) - Ostrzeżenie: nieprawidłowe podświetlanie składni

Wypróbuj na jsfiddle (javascript).

Wyjaśnienie:

Scala, podobnie jak java, przetwarza kody ucieczki Unicode przed wszystkim innym, więc scalac widzi kod w ten sposób:

/**/                                //\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 zostanie sparsowany w następujący sposób:

/*\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 znaków

r_W%(;
"j9LQ2/)%";

W CJam to palindromalizuje . W MATL depalindromalizuje .

Objaśnienie w CJam

Część robocza:

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

Część manekina:

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

Objaśnienie w MATL

Część manekina:

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

Część robocza:

"           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

Kolejna część manekina:

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

4

𝔼𝕊𝕄𝕚𝕟 / JavaScript ES6, 55 znaków

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

Try it here (ES6 browsers only).

Palindromizes w 𝔼𝕊𝕄𝕚𝕟, depalindromizes w JavaScript ES6.

Myślałem, że będzie to łatwe, ponieważ 𝔼𝕊𝕄𝕚𝕟 kompiluje się do ES6 i większość ES6 można uruchomić w 𝔼𝕊𝕄𝕚𝕟. Najwyraźniej całkowicie się mylę.

Wyjaśnienie

this._sprawdza, czy zmienna _istnieje w zasięgu globalnym; 𝔼𝕊𝕄𝕚𝕟 korzysta z Lodash i dlatego ma _zapisane, ale czysty ES6 nie.

Segment 𝔼𝕊𝕄𝕚𝕟 - Σ(`ï+ï.Ħ⬮.Đ1`)- ocenia na podstawie kodu, który palindromalizuje dane wejściowe. Normalnie kod byłby ï+ïĦ⬮Đ1, ale wstawiam kropki, aby kompilator był szczęśliwy .

Segment JavaScript - (x=prompt()).slice(0,-x.length/2)- depalindromalizuje ciąg z monitu.


Zamierzałem użyć funkcji (więc nie musiałem sobie z tym radzić prompt), ale funkcja oceny didn't nie podobała się, więc użyłem prompti żadnej funkcji, aby uszczęśliwić kompilator .


Wow, kompilator jest wybredny.
HyperNeutrino,

4

JavaScript ES6 / JavaScript ES3, 143 bajty

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()}

Palindromizes w JavaScript ES6, depalindromizes w JavaScript ES3. Nie konkuruje , to tylko próba stworzenia poliglota dla dwóch wersji tego samego języka.

W ES3 funkcje są dozwolone w blokach, ale ponieważ bloki nie definiują zakresów, nowa funkcja zastępuje tylko pierwszą funkcję. W trybie ścisłym ES5 kończy się niepowodzeniem, ponieważ nie pozwala na definiowanie funkcji w blokach. W ES6 jest to dozwolone, a ponieważ bloki definiują teraz zakresy, pierwsza funkcja nie jest zastępowana.

Testowane w Internet Explorerze 5 (emulowanym) dla ES3 i Node.JS oraz Firefox dla ES6.


4

Galaretka / CJam, 15 14 znaków

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

-1 znak dzięki 42545 (ETHprodukcje)

Wypróbuj online! (Galaretka) (Palindromizacja)

Tłumacz CJam (Depalindromization)

Objaśnienie galaretki:

W Galaretce jest taki sam jak \n, więc oto, co widzi Jelly:

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

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

Wyjaśnienie CJam:

W CJam wszystko po e#wierszu jest komentarzem. Oto, co widzi CJam:

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

@ETHproductions Ups, zapomniałem! To się nazywa „odbijanie”, dlatego.
Erik the Outgolfer,

4

Perl / JavaScript, 73 bajty

Perl zwraca palindrom, a JavaScript „usuwa palindromizację” ciągu wejściowego.

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

JavaScript

Zakłada, że ​​ciąg jest już prawidłowym palindromem.

Cała praca odbywa się w pierwszej części:

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

Przechowuje dane wejściowe s, a następnie zwraca pierwszą połowę (zaokrągloną w górę) ciągu. Reszta skryptu to bezcelowe przypisania zmiennych:

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

Wypróbuj tutaj:

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

Perl

Musi być uruchamiany z -plnp .:

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

Kod jest w zasadzie dwoma podstawieniami ( s///), ale używa =jako separatora zamiast /:

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

Pierwszy, zastępujący prompt();console.log(s.slice(0,-s.length\/2));eg(który wprawdzie zepsuje Twój ciąg znaków, jeśli zawiera coś takiego jak "prompt;console.logs.slice0,-s.length/2;eg"...), 1;tktórym evaled jest , zwracając t, drugi zastępuje koniec ciągu ( $), reverse$_którym jest wtedy równieżeval edytowany i dołącza oryginalne źródło ciąg odwrócony.

Wypróbuj online!


3

Python 2 / Nim , 76 74 bajtów

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

Palindromizes w Pythonie, depalindromizes w Nim. Nadużywa składni komentarzy.

Używają zarówno Python, jak i Nim # komentarzy. Python w ogóle nie obsługuje komentarzy blokowych (z wyjątkiem ciągów wielowierszowych z """), ale Nim tak#[ comment ]# .

Nadużywamy tego, aby komentować Python (na początku) dla Nima, a następnie użyć końcowego ] końca w Pythonie, aby uruchomić kod Nim, wyglądając jak komentarz dla Pythona.

Kod w Pythonie wymaga wprowadzania danych otoczonych cudzysłowami. Kod Nim nie ma tego ograniczenia.

Testowane na Pythonie 2.7.8 i Nim 0.14.2.

Ideone to! - Python 2, palindromizing

Ideone to! - Nim, depalindromizacja Najwyraźniej wersja Nim Ideone (0.11.2) nie obsługuje komentarzy wielowierszowych. Działa na Nim 0.14.2.




2

Japt / JavaScript, 63 znaki

Lekcja dnia: poligloty Japt / JavaScript są zawsze złym pomysłem ...

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

JavaScript

Pierwszy wiersz ustawia zmienną $Oqna 1, a następnie wykonuje operację no-op przy pomocy$Oq &&0 .

Drugi wiersz monituje użytkownika o ciąg wejściowy, przypisując go do zmiennej $U, a następnie wycina go z indeksu 0*$U(zawsze 0) do indeksu -$U.length/2. Wykonuje to niezbędną depalindromizację; wynik jest następnie alertedytowany. Program kończy się na referencyjnym błędzie, ponieważ zmienna $Uênie jest zdefiniowana.

Japt

W Japt wszystko między znakami dolara jest wstawiane bezpośrednio do transpilowanego kodu źródłowego. Poza tym każda mała litera transponuje się na np. .q(, Chyba że poprzedni znak był inną małą literą, w którym to przypadku staje się "q". Spacja jest transpilowana do ), a wszystkie brakujące pareny są automatycznie dodawane. Powyższy program w przybliżeniu transponuje się do:

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

Jest to następnie wykonywane jako JavaScript. Oq=1;ustawia zmienną Oqna 1. Nie jest to nigdy więcej używane, więc nie można tego zrobić. O.q()jest funkcją, która kasuje STDOUT i zwraca undefined; to jest fałsz, więc cała &&0 .a("l".e(...część nie jest wykonywana.

Jedyne, co naprawdę się liczy, to U.ê(). Dane niejawne wprowadzają ciąg wejściowy U, .ê()zamieniają go w palindrom, a dane niejawne wysyłają wynik do STDOUT.


Jeśli dozwolone są wpisy funkcji, następujące funkcje będą działać dla 34 znaków:

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

Pierwsza część definiuje funkcję ES6, ale nadal jest to pełny program w Japt. Przetestuj online!


2

Java / Brainfuck, 71 bajtów

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

Palindromizes w BF, depalindromizes w Java.

Dla jasności to, co ma znaczenie dla tłumacza BF:

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

gdzie ostatnia pętla zawierająca znaki z lambda Java jest pomijana, ponieważ wskaźnik wskazuje w tym miejscu znak zerowy.


0

05AB1E / Java 8, 102 znaki

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

Palindromize w 05AB1E.
Depalindromize w Javie 8.

Objaśnienie 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

Objaśnienie 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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.