Membalikkan string!

11

Tugas Anda: tulis sebuah program / fungsi yang ketika diberi string yang hanya berisi karakter ASCII, output / mengembalikan string dalam bentuk reverse-ish.

Contoh:

1) Input

Hello, World!

2) Jumlah karakter unik dalam input. (String input dipisahkan oleh pipa ( |) untuk keterbacaan)

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

3) Untuk karakter duplikat, temukan kemunculan pertama karakter tersebut dan beri nomor karakter duplikat dengan nomor yang sama dengan yang pertama.

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

4) Membalik string, tetapi bukan angka.

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

5) Hapus karakter di atas angka yang diulang. (Karakter yang dihapus diwakili dengan tanda bintang.)

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

6) Ganti karakter yang dihapus dengan karakter yang muncul lebih dari kemunculan pertama nomor yang karakter yang dihapus sudah berakhir.

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

7) Output

!dlloW ,olleH

Kasus uji:

Input -> Output
"Hello, World!" -> "!dlloW ,olleH"
"18464399" -> "99343488"
"Code Golf" -> "floG eloC"
"abcdefgABCDEFG" -> "GFEDCBAgfedcba"
"Mmm, marshmallows" -> "swwllwmhsrwm  mms"
"15147" -> "74751"
Kamerad SparklePony
sumber
Bagi mereka yang dapat melihat posting yang dihapus, kotak pasir ada di sini .
Kamerad SparklePony
Apakah string dijamin hanya mengandung karakter ASCII?
Leaky Nun
@ LeakyNun Ya, saya akan mengedit.
Kamerad SparklePony

Jawaban:

19

Pyth , 1 byte

X

Verifikasi semua kasus uji.

Pyth memiliki built-in yang luar biasa :-)


Pyth ,  8  7 byte

sm@_QxQ

Verifikasi semua kasus uji.

Bagaimana itu bekerja

Ini adalah pendekatan non-built-in yang lebih menarik.

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.
Tuan Xcoder
sumber
4
Mengapa Pyth memiliki ini sebagai bawaan? Apa manfaatnya selain pertanyaan ini?
Jerry Jeremiah
@JerryJeremiah Anda dapat membaca lebih lanjut tentang fungsi ini di sini . Ini adalah fungsi terjemahan dalam Pyth, tetapi jika argumen ketiga hilang, sebaliknya argumen kedua digunakan.
Tn. Xcoder
6

Python 2 , 46 41 byte

-5 byte terima kasih kepada Artyer

lambda x:''.join(x[~x.find(n)]for n in x)

Cobalah online!

tongkat
sumber
1
Anda bisa melakukan lambda x:''.join(x[~x.find(n)]for n in x)alih - alih membalikkan lalu mengindeks
Artyer
5

CJam , 7 byte

q__W%er

Cobalah online!

Penjelasan

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.
Martin Ender
sumber
Saya berharap Jelly ybekerja seperti itu.
Erik the Outgolfer
@EriktheOutgolfer Saya berharap Alice y bekerja seperti itu. : P
Martin Ender
5

MATL , 6 byte

PGt&m)

Cobalah online!

           implicit input
P          flip
 Gt        paste input back to stack and dup
   &m      alternate ismember, returns duplicated indices
     )     apply indices to the reversed char array
           implicit output, print as char
Giuseppe
sumber
5

05AB1E , 2 byte

R‡

Cobalah online!

Penjelasan:

R‡
R  Reverse input
 ‡ Transliterate the input with itself and its reverse (as above) (it only keeps first occurrences)
Erik the Outgolfer
sumber
3

Alice , 17 byte

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

Cobalah online!

Penjelasan

/...@
\.../

Ini hanya template biasa untuk kode linier dalam mode Ordinal. Jika kami membuka ini, program sebenarnya menjadi:

i.!?D.?.Ryyo

Gagasan di sini mirip dengan jawaban CJam saya . Karena Alice tidak memiliki cara mudah untuk mengindeks ke string dengan integer, lebih mudah untuk mereplikasi perilaku ini dengan transliterasi ( ydalam Alice). Namun, semantik transliterasi Alice jauh lebih umum daripada CJam, yang berarti bahwa Alice tidak hanya mengabaikan pemetaan berulang. Misalnya, jika kami hanya ingin mentransliterasi Mmm, marshmallowske kebalikannya, ini akan mewakili daftar pemetaan berikut:

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

Perhatikan bahwa kita punya, misalnya, m -> w, m -> o, m -> adan m -> a. CJam hanya akan membuang semua kecuali pemetaan pertama, tetapi Alice malah akan menelusuri semua ini. Jadi yang pertama makan dipetakan ke w, yang kedua ke o, yang kelima lagi wdan seterusnya. Dalam hal ini itu tidak membantu, karena secara umum jika kita tampil ydi AAB(untuk beberapa string Adan B) seperti yang kita lakukan di CJam, kita akan selalu mendapatkan BAlice.

Jadi bagaimana kita menghitung pemetaan yang berfungsi y(yaitu bagaimana kita membuang pemetaan berulang secara manual)? Tentunya dengan menggunakan transliterasi lain. :)

Sumber pemetaan yang kita inginkan harus nub dari input (yaitu input deduplicated). Jika kita menerapkan pemetaan di atas ke nub, maka setiap karakter hanya muncul sekali, jadi kita hanya memanfaatkan yang pertama dari setiap pemetaan yang diulang. Jadi dengan mentransliterasi nub dengan input dan kebalikannya, kita secara efektif hanya membuang pemetaan yang digandakan. Kami kemudian dapat menggunakan nub dan hasil baru ini sebagai pemetaan untuk input asli. Saya yakin itu masuk akal bagi seseorang ...

Jadi kodenya:

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.                       []
Martin Ender
sumber
3

Pyke , 7 byte

L@Q_M@s

Coba di sini!

L@      - Get the index of the first index of each character.
  Q     - Push the input to the stack.
   _    - Reverse it.
    M@  - Get the element at (each) position in ^^^ in ^.
      s - Join.
Tuan Xcoder
sumber
3

Perl 5 , 23 + 1 ( -p) = 24 byte

eval"y/$_/".reverse."/"

Cobalah online!

Terima kasih untuk entri Alice @ MartinEnder untuk ide transliterasi

Xcali
sumber
3

JavaScript ES6 50 byte

3 byte disimpan berkat Justin Mariner

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

Menguji:

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>

Bálint
sumber
2

R , 68 65 byte

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

Verifikasi kasus uji!

Metode 05AB1E Ports Erik kurang dari 3 byte. Itu bukan yang pertama, tapi itu yang pertama saya lihat.

versi lama:

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

Verifikasi semua kasus uji - cetak vektor dengan input sebagai nama dan output dalam kutipan di bawah ini.

Implementasi yang cukup naif, tapi saya tidak berpikir ini menjadi lebih pendek di R (dan saya berharap bisa salah tentang itu). Ini pada dasarnya port R dari jawaban python Rod tetapi dikembangkan secara independen.

Penjelasan yang tidak digabungkan:

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
Giuseppe
sumber
2

C (gcc) , 98 byte

i,n,a[256];char*f(char*c){n=strlen(c);for(i=n;i>0;i--)a[c[i-1]]=c[n-i];for(;i<n;i++)c[i]=a[c[i]];}

Cobalah online!

Argumen harus berupa string yang dapat dimodifikasi; string dimodifikasi di tempat.

Biarawati Bocor
sumber
1
88 bytes
ceilingcat
1

Röda , 27 byte

f x{x|[x[-1-indexOf(_,x)]]}

Cobalah online!

Ini mengambil daftar karakter sebagai input dan mengembalikan aliran karakter.

Menggunakan datatype string (40 byte):

f x{x=x/""x|[x[-1-indexOf(_,x)]]|concat}

Cobalah online!

fergusq
sumber
0

Python ,191 128 byte

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)

Cobalah online

lolad
sumber
4
Hai, dan selamat datang di PPCG! Ini adalah jawaban yang bagus, tetapi tidak golf (memiliki lebih banyak byte daripada yang dibutuhkan juga). Coba hapus beberapa byte (misalnya dengan memperpendek nama variabel) dan mengedit posting Anda.
NoOneIsHere
0

Java 10, 100 99 97 byte

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++]]);}

Port of @ LeakyNun's C jawab . Saya ragu itu bisa dilakukan lebih pendek tanpa melakukan sesuatu yang serupa di Jawa.
-1 byte terima kasih kepada @ceilingcat .

Input sebagai char[](karakter-array), dan memodifikasi input ini daripada mengembalikan yang baru untuk menghemat byte.

Coba di sini.

Kevin Cruijssen
sumber
@ceilingcat Terima kasih!
Kevin Cruijssen