Зворотно-іш струна!


11

Ваше завдання: написати програму / функцію, яка, коли дається рядок, що містить лише символи ASCII, виводить / повертає рядок у зворотному напрямку.

Приклад:

1) Введення

Hello, World!

2) Число унікальних символів у введенні. (Вхідний рядок, розділений трубами ( |) для читабельності)

H|e|l|l|o|,| |W|o|r|l|d|!
1 2 3   4 5 6 7   8   9 10

3) Для дублюючих символів знайдіть перше виникнення цього символу і пронумеруйте повторний символ тим же номером, що і перший.

H|e|l|l|o|,| |W|o|r|l|d|!
1 2 3 3 4 5 6 7 4 8 3 9 10

4) Зворотний рядок, але не числа.

!|d|l|r|o|W| |,|o|l|l|e|H
1 2 3 3 4 5 6 7 4 8 3 9 10

5) Видаліть символи вище повторних чисел. (Видалені символи представлені зірочкою.)

!|d|l|*|o|W| |,|*|l|*|e|H
1 2 3 3 4 5 6 7 4 8 3 9 10

6) Замініть видалені символи символом, який з’являється протягом першого появи числа, над яким видалений символ закінчився.

!|d|l|l|o|W| |,|o|l|l|e|H
1 2 3 3 4 5 6 7 4 8 3 9 10

7) Вихід

!dlloW ,olleH

Тестові приклади:

Input -> Output
"Hello, World!" -> "!dlloW ,olleH"
"18464399" -> "99343488"
"Code Golf" -> "floG eloC"
"abcdefgABCDEFG" -> "GFEDCBAgfedcba"
"Mmm, marshmallows" -> "swwllwmhsrwm  mms"
"15147" -> "74751"

Для тих, хто може бачити видалені публікації, пісочниця була тут .
Товариш SparklePony

Чи гарантується, що рядок містить лише символи ASCII?
Leaky Nun

@LeakyNun Так, я відредагую.
Товариш SparklePony

Відповіді:


19

Піт , 1 байт

X

Перевірте всі тестові випадки.

Pyth має чудові вбудовані :-)


Pyth ,  8  7 байт

sm@_QxQ

Перевірте всі тестові випадки.

Як це працює

Це цікавіший не вбудований підхід.

sm@_QxQ  - Full program.

 m       - Map over the input.
  @_Q    - Get the index in the reversed input.
     xQ  - Of the first index of each character in the String.
s        - Join the list.

4
Чому Pyth має це як вбудований? Чим корисне, крім цього питання?
Джеррі Єремія

@JerryJeremiah Детальніше про цю функцію можна прочитати тут . Це функція перекладу в Pyth, але якщо третій аргумент відсутній, замість цього використовується реверс другого аргументу.
Містер Xcoder



5

CJam , 7 байт

q__W%er

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

Пояснення

q   e# Read all input.
__  e# Make two copies.
W%  e# Reverse the third copy.
er  e# Transliterate the input, mapping the input to its own reverse. Due
    e# to the way transliteration works in CJam, if a character in the source
    e# of the mapping is repeated, all but the first occurrence of that
    e# character are ignored.

Я б хотів, щоб Джеллі yпрацював так.
Ерік Аутгольфер

@EriktheOutgolfer Я б хотів, щоб Аліса y працювала так. : P
Мартін Ендер



3

Аліса , 17 байт

/?.R?y.@
\i.!yDo/

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

Пояснення

/...@
\.../

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

i.!?D.?.Ryyo

Ідея тут схожа на мою відповідь CJam . Оскільки Аліса не має простого способу індексації до рядків з цілими числами, найпростіше повторити цю поведінку транслітерацією ( yв Alice). Однак семантика транслітерації Аліси набагато більш загальна, ніж CJam, це означає, що Аліса не просто нехтує повторними відображеннями. Наприклад, якби ми просто хотіли транслітерувати Mmm, marshmallowsйого зворотний бік, це буде відображати наступний список відображень:

M -> s
m -> w
m -> o
, -> l
  -> l
m -> a
a -> m
r -> h
s -> s
h -> r
m -> a
a -> m
l ->  
l -> ,
o -> m
w -> m
s -> M

Зверніть увагу , що у нас є, наприклад, m -> w, m -> o, m -> aі m -> a. CJam просто відкине всі, за винятком першого картографування, але Аліса замість цього перейде через них. Отже, перше mбуло б відображено на карту w, друге на друге o, на п'яте знову wі так далі. У цьому випадку це не корисно, тому що, як правило, якщо ми виконуємо yна AAB(для деяких струн Aі B), як це було в CJam, ми завжди просто потрапляємо Bв Алісу.

Тож як ми можемо обчислити відображення, на яке працює y(тобто як ми відкидаємо повторні відображення вручну)? Звичайно, використовуючи іншу транслітерацію. :)

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

Отже код:

i   Read input.                   ["Mmm, marshmallows"]
.!  Store a copy on the tape.
?D  Push the nub of the input.    ["Mmm, marshmallows" "Mm, arshlow"]
.   Duplicate.                    ["Mmm, marshmallows" "Mm, arshlow" "Mm, arshlow"]
?   Retrieve input.               ["Mmm, marshmallows" "Mm, arshlow" "Mm, arshlow" "Mmm, marshmallows"]
.R  Push its reverse.             ["Mmm, marshmallows" "Mm, arshlow" "Mm, arshlow" "Mmm, marshmallows" "swollamhsram ,mmM"]
y   Transliterate.                ["Mmm, marshmallows" "Mm, arshlow" "swllmhsr mm"]]
y   Transliterate.                ["swwllwmhsrwm  mms"]
o   Output.                       []



3

JavaScript ES6 50 байт

3 байти збережено завдяки Джастіну Марінеру

s=>[...s].map(x=>s.slice(~s.indexOf(x))[0]).join``

Перевірте:

f=s=>s.split``.map(x=>s.slice(~s.indexOf(x))[0]).join``

let inp = document.getElementById("inp");
let out = document.getElementById("out");

function change() {
  out.innerText = f(inp.value);
}

change();
<input id="inp" type="text" oninput="change()" value="Hello, World!" /><br>
<p id="out"></p>


2

R , 68 65 байт

function(s)chartr(paste(rev(el(strsplit(s,''))),collapse=''),s,s)

Перевірте тестові справи!

Порт Еріка 05AB1E метод на 3 байти менше. Це було не перше, але це було перше, що я побачив.

стара версія:

function(s)paste(rev(s<-el(strsplit(s,'')))[match(s,s)],collapse='')

Перевірте всі тестові випадки - виводить вектор із введенням як імена та вихід у лапках нижче.

Досить наївна реалізація, але я не думаю, що це скорочується в R (і я з нетерпінням чекаю помилки з цього приводу). Це по суті R-порт відповіді питона Рода, але він був розроблений незалежно.

Не пояснене пояснення:

function(s){
 s <- el(strsplit(s,''))      # string to characters
 r <- rev(s)                  # reverse s
 idx <- match(s,s)            # indices of first matches
 r <- r[idx]                  # do the replacement of duplicates
 paste(r, collapse = "")      # characters to string
}                             # implicit return of last evaluated statement



0

Пітон ,191 128 байт

w=input("")
c=[]
for x in range(0,len(word)):
  chars.append(word[x])
back = []
for x in chars:
  back.insert(0,x)
final = ""
for x in back:
  final = final + x
print(final)

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


4
Привіт, і ласкаво просимо до PPCG! Це чудова відповідь, але це не гольф (у ньому більше байтів, ніж потрібно). Спробуйте видалити кілька байт (наприклад, скорочуючи імена змінних) та відредагуйте свою публікацію.
NoOneIsHere

0

Java 10, 100 99 97 байт

s->{var a=new char[256];int l=s.length,i=l;for(;i>0;a[s[--i]]=s[l+~i]);for(;i<l;s[i]=a[s[i++]]);}

Порт @ C відповідь LeakyNun в . Я сумніваюся, що це можна зробити коротше, не роблячи щось подібне на Java.
-1 байт завдяки @ceilingcat .

Введіть як char[](масив символів) і змінює цей ввід, а не повертає новий для збереження байтів.

Спробуйте тут.


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