Обратимый реверсор

19

Ваша задача проста. Программа считывает строку текста из стандартного ввода и выводит тот же текст в символьной форме. Не разрешается печатать что-либо еще.

Например:

вход: "Привет!", вывод: "! olleH"

Уловка в том , что ваша программа должна иметь возможность делать то же самое, если сам исходный код инвертирован!

Подсчет очков: применяется стандартная оценка по коду-гольфу со следующей модификацией для ограничения скучности

//margorp
program//

стиль ответов: любое решение, представляющее собой палиндром, влечет штраф + 25% к счету, округленному в большую сторону. Это наказание по-прежнему применяется, если вы, например, вставляете в программу символы, которые не имеют каких-либо полезных эффектов, просто чтобы сломать палиндром.

ВСЗ
источник
2
«Полезные эффекты», вероятно, не могут быть объективно определены. Например, в GolfScript, как насчет -1%#%1-/1или -1%#%(0?
Питер Тейлор

Ответы:

14

APL, 5

⌽⍞⍝⍞⊖

Это переворачивает ( вдоль последней оси) input ( ) и сопровождается комментарием ( помечает комментарий в строке). В обратном порядке программа переворачивает ( вдоль первой оси) ввод и сопровождается комментарием. Поскольку ввод всегда будет одномерным, в этом случае и функционально эквивалентны. Возможно, это даже хитрее, чем решение GolfScript, поэтому вот более чистое решение (без комментариев), которое набирает 9 баллов .

⍬,⌽,⍞,⊖,⍬

Сначала он захватывает пустой вектор ( ), выравнивает его (монадическое ,) и переворачивает ( вдоль первой оси). Это все еще оставляет пустой вектор. Затем он объединяет (двоичный ,) с входом ( ), оставляя вход без изменений. Затем он выравнивает (монадический ,) уже плоский вход и переворачивает его ( вдоль последней оси). Затем он объединяет (двоичный ,) еще один пустой вектор ( ) с обратным входом. Это ничего не делает, и оставляет обратный ввод позади. В обратном порядке эта программа делает то же самое, снова основываясь на том факте, что и функционально эквивалентна одномерным аргументам.

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

летучесть
источник
14

Unix shell - 8 + 25% = 10

rev||ver

Предыдущий ответ на cat|tacсамом деле не работал, tacменяет порядок строк, а не порядок символов в строке.

Джефф Риди
источник
10

Хаскелл, 53

main=niam
niam=interact reverse
esrever tcaretni=main

Технически это не палиндром, но, поскольку порядок объявления функций не имеет значения, после изменения у вас точно такая же программа.

lortabac
источник
Ницца (+1). Я не верил, что это действительно что-то сделало, прежде чем я попробовал это ( Ссылка ).
Мартин Тома
переместите main=niamдекларацию в середину, и вы получите палиндром.
Йоханнес Кун,
@JohannesKuhn Да, я признаю, что это все еще "скучное" решение палиндрома, с другим внешним видом.
Лортабак
10

Руби, 37

eval <<1.reverse#
esrever.steg stup
1

Перевернутый:

1
puts gets.reverse
#esrever.1<< lave
histocrat
источник
Herestrings, подлый! +1
дверная ручка
6

Tcl, 78

puts [string rev [gets stdin]];#\
]]nidts steg[ ver gnirts[ stup;# tixe emaner

Не палиндром.

Йоханнес Кун
источник
Какой полезный эффект имеет «переименовать выход» в этой программе? (Я не знаю, Tcl)
vsz
переименовывает команду exitв #(# является параметром, а не началом комментария). \#в следующей строке будет выполнено #(не начало комментария, потому что экранировано), который является новым exit.
Йоханнес Кун
6

гс2, 2

(Да, этот язык был создан до испытания. Нет, это не шутка или лазейка. Пробел ASCII ( 0x20) обратный .)

РЕДАКТИРОВАТЬ: ау, чувак, этот вопрос очень старый? Если бы я только совершил это раньше. : <Я оставлю этот ответ только потому, что это слишком хорошо, чтобы отказаться, хотя.

Линн
источник
3

Golfscript, 9 (7 * 1,25 = 8,75)

-1%#%1-

грязный, грязный, грязный, но очень короткий. -1%означает «выбрать каждый элемент (символ), назад» и #означает «комментарий к строке». Остальное - лишь немного магии ввода / вывода GolfScript.

Это самое короткое «чистое» (без комментариев) решение, которое я нашел ( 14 * 1.25 = 17.5 ):

'';-1%..%1-;''

это означает: нажать пустую строку, отбросить ее, сторнировать ввод, дважды клонировать, разбить ее на части (использовать две копии и создать пустой массив), удалить все из пустого массива, удалить массив emtpy, вставить пустую строку и (неявно) распечатать стек.

Джон дворак
источник
Я должен был ожидать этого. Даже штраф в размере 500% имеет высокий шанс сделать его победителем.
вс
@vsz Я ищу решение без комментариев (то есть чистое) в golfscript, однако.
Джон Дворак
Если вход не содержит 1-х ..
Йоханнес Кун
@JohannesKuhn ты прав. Я отбросил это «решение».
Джон Дворак
@vsz Более интересная задача - запретить комментировать символы (и все же наказывать палиндромы?). У моего участника есть 14 символов, я думаю, это довольно много.
Джон Дворак
3

Руби, 44

puts gets.reverse#esrever.steg stup

Просто комментарий в конце обычной программы: P

35 символов, + 25% = 44

resueman
источник
2

Tcl 75,25

На этот раз палиндром.

puts [string rev [gets stdin]]]]nidts steg[ ver gnirts[ stup
Йоханнес Кун
источник
(между ]]и ]]есть символ \ x1A.)
Йоханнес Кун
2

Python 3, 42

print(input()[::-1]);#)]1-::[)(tupni(tnirp

кредиты

  • Первоначальная версия со счетом 49 + 25% = 61,25, созданная мной
  • Спасибо arshajii за улучшение счета с 61.25 до 51.25
  • Новая версия со счетом 42 ( :-)), созданная мной
Мартин Тома
источник
Вы можете использовать print(input()[::-1])#)]1-::[)(tupni(tnirpв Python 3 вместо этого, чтобы сократить счет до 51,25.
Аршаджи
1
Это не режется ...
Оливер Ни
«Любое решение, представляющее собой палиндром, влечет за собой штраф + 25% к счету, округленному в большую сторону. Этот штраф по-прежнему применяется, если, например, вы вставляете в программу символы, которые не имеют каких-либо полезных эффектов, просто чтобы сломать палиндром «. Я бы сказал, что ;это такая вставка, которая не имеет никакого полезного эффекта.
Оливер Ни
2

Rebmu : 9 (без штрафа) или 13 (без штрафа)

Скучное решение Ребму - 9 и несет палиндромное наказание. Я все равно покажу "просто потому что"

rnRVaVRnr

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

rn rv a vr nr

Что является сокращением для эквивалентного кода (также юридического Rebmu):

return reverse a vr nr

Тот факт, что vr и nr не имеют смысла, не имеет значения, потому что, несмотря на то, что они ни к чему не приписаны, они являются действительными словами. Таким образом, оценщик только запускает return reverse a... он работает в обе стороны. Но в некотором смысле это аналог скучного мошенничества: код не закомментирован, а мертв и не выполняется по одному пути.

Для чего-то более захватывающего, которое не влечет за собой штраф, как насчет этого 13-символьного решения:

a VR :rv AvrA

Давайте посмотрим, как это обрабатывается на его прямом и обратном путях при расширении. Вперед:

a               ; evaluate a, as it is a string it has no side effects
vr: :reverse    ; "set" vr to mean what a "get" of reverse means now
a: vr a         ; assign a to calling "vr" on a, effectively reversing
                ;   ^-- result of assign is last expression, the answer!

В обратном направлении как ArvA vr: RV a:

a: reverse a    ; assign A to its reversal
vr: rv: a       ; make the abbreviation vr equal to assignment of a to rv
                ;   ^-- result of assign is last expression, the answer!

С другой стороны, обратный вариант перезаписывает аббревиатуру для реверса. Но это не палиндром, а всего лишь 13 персонажей. :-)

(Примечание: предполагается, что вы запускаете Rebmu в режиме / args, где a - это аргумент по умолчанию для программы, передаваемой интерпретатору в командной строке, и вы принимаете результат. Если чтение из стандартного ввода на самом деле является обязательным, например, увеличьте с 9 до 11 символов для простого решения: rnRVrArVRnrи если вам придется печатать на стандартный вывод из программы, а не принимать выходные данные выражения интерпретатора, который бы тоже добавил пару символов.)

Доктор Ребму
источник
2

JavaScript, 62 * 1,25 = 78

i.split('').reverse().join('')//)''(nioj.)(esrever.)''(tilps.i

Не слишком креативно, но лучшее, что я могу придумать. (предполагается, что вход хранится в переменнойi )

Я получил это:

63 символа, нет палиндрома

i.split('').reverse().join('')//)a(nioj.)(esrever.)''=a(tilps.i

но это было слишком похоже на обман. : PI может сделать гораздо больше тривиальных изменений (например, i['split']вместо того, чтобы использовать i.split), но все они по-прежнему хотят обманывать: P

Дверная ручка
источник
Предполагается, что входные данные хранятся в переменной i, а затем (p=a=>a&&p()==`(p=${p})(i)`?i:i.split``.reverse().join``)(i)(60 байт) делает это.
Esc Điệp
2

Пайк, 2 (+ 25%), неконкурирующий

_

Пайк принимает ввод неявно и выводит неявно.

_ обратная функция.

синий
источник
1

Tcl, 99

proc unknown args {puts "Hello World!"}
}"!dlroW olleH" stup{ sgra nwonknu corp

Если вызывается несуществующая команда, вызывается специальная unknownкоманда, которая может загрузить команду. Или делать другие забавные вещи.

Йоханнес Кун
источник
1

T-SQL, 86 * 1,25 = 108

Вот скучная палиндромная запись для SQL Server 2008 (и новее), чтобы показать, что это возможно.

DECLARE @ VARCHAR(MAX)='Hi'PRINT REVERSE(@)--)@(ESREVER TNIRP''=)XAM(RAHCRAV @ ERALCED

@ содержит вводимый текст, пример строки «Привет». Число символов этой записи для входной строки из двух символов.

Muqo
источник
1

Кег , ceil (1 + 0,25) = 2 байта

?

Это принимает входные данные и обращает, а неявный вывод выводит их буквально. TIO

A̲̲
источник
0

QBIC , 14 + 25% = 18 байт

;?_fA|#|Af_?;

Использует палиндромный исходный код. Использование двух разных способов сделать это занимает несколько больше времени (34 байта):

;[_lA|,1,-1|Z=Z+mid$(A,a,1)#|Af_?;

Объяснение:

Read the input string from the command line as A$
;

FOR len(A$); a >= 1; a--
[        Starts a FOR loop
_l...|   returns the length the argument(here, A$); sets the starting point of the loop
,1       set the end point of the loop
,-1      FOR loop incrementer (or decrementer in this case)
|        Ends the argument list for the FOR loop

On each FOR iteration, add the right-most character of the input to Z$
Z=Z+mid$(A,a,1)

The cheat:
# starts a string literal, hiding the flipped source.
    The literal is closed implicitly at the end-of-file.
    The FOR loop is closed implicitly at the end-of-file.
    Z$ gets printed implicitly at the end of the program if it's non-empty

The flipped source is the same as my palindrome-code:
;       reads in A$ from the cmd line   
 ?      PRINT
  _fA|  The reversed version of A$
      # And hide the rest of our source in a literal  
steenbergh
источник
0

Напористый , 7 байтов (5 + 25%)

@"i"@

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

Это влечет за собой 25% штраф, так как это палиндром, но это лучшее, что я мог сделать. Независимо от того, какой способ запускает программа, она выполняет следующие 3 команды:

@     \ Reverse the input
 "    \ Print
  i   \ Exit

Подставляя iв c(ясный стек) или \(комментарий) имеет тот же эффект.

FlipTack
источник
0

05AB1E , 1 + 25% = 2 байта

R

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

Bismarck71
источник
Вам нужно округлить, так что это (1 + 0,25) = 1,25 округлено = 2 байта.
Благодарность! Я исправил заголовок.
Bismarck71
0

R 65 байт

РЕДАКТИРОВАТЬ: Отказ от 25% штрафа благодаря тривиальным, но пока невидимым для меня, изменения от Грими.

stringi::stri_reverse(scan(,""))#))'',(nacs(esrever_irts::ignirts

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

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

Sumner18
источник