Реверсивний реверс


19

Ваше завдання просте. Програма читає текст із рядка тексту зі стандартного вводу, і він виводить той самий текст у зворотному вигляді символів. Друкувати більше нічого не дозволяється.

Наприклад:

вхід: "Привіт!", вихід: "! olleH"

Проблема полягає в тому , що ваша програма повинна вміти робити те саме, якщо вихідний код сам перетворює символи!

Зарахування балів: застосовується стандартне підрахунок коду - гольф із наступною модифікацією для обмеження нудного

//margorp
program//

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


2
"Корисні ефекти", ймовірно, не можуть бути об'єктивно вказані. Наприклад, у GolfScript, що робити -1%#%1-/1або -1%#%(0?
Пітер Тейлор

Відповіді:


14

APL, 5

⌽⍞⍝⍞⊖

Це повертає ( уздовж останньої осі) вхід ( ) і супроводжується коментарем ( позначає коментар у рядку). Зворотний, програма повертає ( уздовж першої осі) вхід і супроводжується коментарем. Оскільки вхід завжди буде одновимірним, в цьому випадку і функціонально еквівалентні. Це, можливо, навіть приємніше, ніж рішення GolfScript, тож ось більш чисте рішення (без коментарів), яке набирає 9 балів .

⍬,⌽,⍞,⊖,⍬

Цей перший захоплює порожній вектор ( ), розгладжує його (монадичний ,) і перевертає його ( вздовж першої осі). Це все ще залишає порожній вектор. Потім він з'єднується (діадичний ,) з входом ( ), залишаючи вхід недоторканим. Потім він розгладжує (монадичний ,) вже плоский вхід і перевертає його ( уздовж останньої осі). Тоді він з'єднує (діадічний ,) ще один порожній вектор ( ) до зворотного входу. Це нічого не робить, а зворотний вхід залишається позаду. Зворотно, ця програма робить те саме, спираючись знову на те, що і є функціонально еквівалентними одноразовими аргументами.

Ви насправді не могли сказати, що я додаю непотрібні символи, щоб зламати паліндром (дві різні функції зворотного зв'язку відрізняються двома або більше розмірними введеннями; я просто користуюся тим, що вони діють однаково з одним- розмірне введення)


14

Оболонка Unix - 8 + 25% = 10

rev||ver

Попередня відповідь cat|tacнасправді не спрацьовувала, tacзмінюється порядок рядків, а не порядок символів у рядку.


10

Хаскелл, 53

main=niam
niam=interact reverse
esrever tcaretni=main

Технічно це не паліндром, але, оскільки порядок декларування функції не має значення, одного разу перевернувши, у вас точно та сама програма.


Ніцца (+1). Я не вірив, що це насправді щось зробило, перш ніж я спробував це ( Посилання ).
Мартін Тома

перемістіть main=niamдекларацію на середину, і ви отримаєте паліндром.
Йоганнес Кун

@JohannesKuhn Так, я визнаю, це все ще "нудне" рішення паліндром, з іншим виглядом.
lortabac


6

Ткл, 78

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

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



Який корисний ефект має "перейменувати вихід" у цій програмі? (Я не знаю Tcl)
vsz

перейменовує команду exitна #(# - це параметр, а не початок коментаря). \#у наступному рядку буде виконано #(не запуск коментаря, тому що вирвався), який є новим exit.
Йоганнес Кун

6

gs2, 2

(Так, ця мова була зроблена перед викликом. Ні, це не жарт чи лазівка. Простір ASCII ( 0x20) є зворотним .)

РЕДАКЦІЯ: Ах, чоловіче, це питання надстареве? Якби я скоріше погодився. : <Я залишу цю відповідь лише тому, що це занадто добре, щоб пропустити.


3

Гольфскрипт, 9 (7 * 1,25 = 8,75)

-1%#%1-

брудний, брудний, брудний, але надзвичайно короткий. -1%означає "вибрати кожен елемент (символ), назад" і #означає "коментар до рядка". Решта - лише трохи магії GolfScript I / O.

Це найкоротше "чисте" (без коментарів) рішення, яке я знайшов ( 14 * 1,25 = 17,5 ):

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

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


Я повинен був цього очікувати. Навіть штраф у розмірі 500% мав би великий шанс зробити його переможцем.
vsz

@vsz Я шукаю рішення без коментарів (тобто чисте) в гольфскрипті, однак.
Джон Дворак

Якщо вхід не містить 1-х ..
Йоганнес Кун

@JohannesKuhn ви праві. Я кинув це "рішення".
Джон Дворак

@vsz цікавіший виклик - заборонити коментувати персонажів (і все-таки штрафувати паліндроми?) Мій конкурент за це має 14 символів, дуже багато, напевно, думаю.
Джон Дворак

3

Рубі, 44

puts gets.reverse#esrever.steg stup

Просто коментар наприкінці звичайної програми: P

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



2

Пітон 3, 42

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

Кредити

  • Первісна версія, створена мною 49 + 25% = 61,25
  • Завдяки аршаджі за те, що покращили рахунок з 61,25 до 51,25
  • Нова версія з оцінкою 42 ( :-)) створена мною

print(input()[::-1])#)]1-::[)(tupni(tnirpЗамість цього ви можете використовувати в Python 3, щоб зменшити бал до 51,25.
Аршаджій

1
Це не ріже ...
Олівер Ні,

"будь-яке рішення, яке є паліндром, нараховує + 25% штрафного бала, закруглене вгору. Це покарання все-таки застосовується, якщо ви, наприклад, в програму вставили символи, які не мають корисних ефектів, просто щоб зламати паліндром . " Я б заперечував, що ;це таке вставлення, яке не має корисного ефекту.
Олівер Ні

2

Ребму : 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%), не конкуруючий

_

Pyke приймає дані неявно і виводить неявно.

_ - це зворотна функція.


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

@ утримує текст введення, наприклад, рядок "Привіт". Кількість знаків цього запису призначена для введення двох знаків.


1

Кег , стеля (1 + 0,25) = 2 байти

?

Це вимагає введення та обернення, а неявний вихід виводить його буквально. ТІО



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  

0

Пушистий , 7 байт (5 + 25%)

@"i"@

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

Це спричиняє 25% штраф, оскільки це паліндром, але це найкраще, що я міг зробити. Незалежно від того, яким способом навколо програми запускається, вона виконує ці 3 команди:

@     \ Reverse the input
 "    \ Print
  i   \ Exit

Підставляючи iв c(ясний стек) або \(коментар) має той же ефект.



0

R , 65 байт

РЕДАКТИРУВАННЯ: Вирізав 25% -ний штраф завдяки тривіальній, ще небаченій для мене зміні Гримі.

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

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

Привітайтеся з асимальним вмінням R обробляти струни, навіть якщо ви використовуєте пакети, розроблені для струн, таких як stringi... barf


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.