ย้อนกลับ - ish สตริง!


11

งานของคุณ: เขียนโปรแกรม / ฟังก์ชั่นที่เมื่อได้รับสตริงที่มีอักขระ ASCII เท่านั้นเอาท์พุท / ส่งกลับสตริงใน reverse-ish

ตัวอย่าง:

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"

สำหรับผู้ที่สามารถเห็นโพสต์ลบ Sandbox ได้ที่นี่
สหาย SparklePony

สตริงรับประกันว่ามีอักขระ ASCII เท่านั้นหรือไม่
Leun Nun

@LeakyNun ใช่ฉันจะแก้ไข
สหาย SparklePony

คำตอบ:


19

Pyth , 1 ไบต์

X

ตรวจสอบกรณีทดสอบทั้งหมด

Pyth มี built-ins ที่ยอดเยี่ยม :-)


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 จึงมีสิ่งนี้ในตัว? มันมีประโยชน์อย่างไรนอกจากคำถามนี้?
Jerry Jeremiah

@JerryJeremiah คุณสามารถอ่านเพิ่มเติมเกี่ยวกับฟังก์ชั่นนี้ที่นี่ มันเป็นฟังก์ชั่นการแปลใน Pyth แต่ถ้าอาร์กิวเมนต์ที่สามหายไปการย้อนกลับของอาร์กิวเมนต์ที่สองจะถูกใช้แทน
Mr. 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ทำงานเช่นนั้น
Erik the Outgolfer

@EriktheOutgolfer ฉันต้องการให้อลิซ yทำงานอย่างนั้น : P
Martin Ender



3

อลิซ 17 ไบต์

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

ลองออนไลน์!

คำอธิบาย

/...@
\.../

นี่เป็นเพียงเทมเพลตปกติสำหรับรหัสเชิงเส้นในโหมด Ordinal หากเราเปิดเผยสิ่งนี้โปรแกรมที่แท้จริงก็จะกลายเป็น:

i.!?D.?.Ryyo

ความคิดที่นี่จะคล้ายกับที่ของคำตอบ CJam ของฉัน เนื่องจากอลิซไม่มีวิธีง่ายๆในการจัดทำดัชนีในสตริงที่มีจำนวนเต็มจึงเป็นการง่ายที่สุดในการทำซ้ำพฤติกรรมนี้ด้วยการทับศัพท์ ( yในอลิซ) อย่างไรก็ตามความหมายของการทับศัพท์ของอลิซนั้นเป็นเรื่องทั่วไปมากกว่าของ 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 -> aCJam จะทิ้งทุกอย่างยกเว้นการทำแผนที่แรก แต่อลิซจะวนรอบสิ่งเหล่านี้แทน ดังนั้นก่อนที่mจะได้รับการแมปไปwที่สองไปoที่ห้าอีกครั้งเพื่อwและอื่น ๆ ในกรณีนี้ไม่เป็นประโยชน์เพราะโดยทั่วไปถ้าเราแสดงyบนAAB(สำหรับบางสายAและB) อย่างที่เราทำใน CJam เราจะเข้าไปBใน Alice เสมอ

ดังนั้นเราจะคำนวณการแมปที่ใช้งานได้อย่างไรy(เช่นเราจะยกเลิกการแมปซ้ำด้วยตนเองได้อย่างไร) แน่นอนโดยใช้การทับศัพท์อื่น :)

แหล่งที่มาของการแมปที่เราต้องการจะต้องเป็น nub ของอินพุต (เช่นอินพุตที่ซ้ำซ้อน) หากเราใช้การจับคู่ด้านบนกับ nub ดังนั้นอักขระแต่ละตัวจะปรากฏเพียงครั้งเดียวดังนั้นเราจึงใช้การแมปซ้ำแรกของแต่ละครั้งเท่านั้น ดังนั้นการทับศัพท์ nub ด้วยอินพุทและรีเวิร์สเราจะทิ้งการแม็พที่ซ้ำกันได้อย่างมีประสิทธิภาพ จากนั้นเราสามารถใช้ nub และผลลัพธ์ใหม่นี้เป็นการจับคู่กับอินพุตต้นฉบับ ฉันแน่ใจว่าเหมาะสมกับใครบางคน ...

ดังนั้นรหัส:

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 ไบต์ขอบคุณ Justin Mariner

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 ของ Erik สำหรับน้อยกว่า 3 ไบต์ ไม่ใช่คนแรก แต่เป็นคนแรกที่ฉันเห็น

เวอร์ชั่นเก่า:

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

ตรวจสอบกรณีทดสอบทั้งหมด - พิมพ์เวกเตอร์ที่มีอินพุตเป็นชื่อและเอาต์พุตในเครื่องหมายคำพูดด้านล่าง

การใช้งานที่ค่อนข้างไร้เดียงสา แต่ฉันไม่คิดว่ามันจะสั้นลงใน R (และฉันหวังว่าจะผิดเกี่ยวกับเรื่องนี้) มันคือพอร์ต R ของคำตอบหลามของ Rodแต่ได้รับการพัฒนาอย่างอิสระ

คำอธิบายที่ไม่ดี

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

ท่าเรือ@ LeakyNun คำตอบของ ฉันสงสัยว่ามันสั้นลงได้โดยไม่ต้องทำสิ่งที่คล้ายกันใน Java
-1 ไบต์ขอบคุณที่@ceilingcat

อินพุตเป็นchar[](อักขระอาร์เรย์) และแก้ไขอินพุตนี้แทนที่จะส่งคืนใหม่เพื่อบันทึกไบต์

ลองที่นี่


@ceilingcat ขอบคุณ!
Kevin Cruijssen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.