文字列を逆っぽくします!


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文字のみが含まれることが保証されていますか
リーキー修道女

@LeakyNunはい、編集します。
同志SparklePony

回答:


19

Pyth、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の変換関数ですが、3番目の引数が欠落している場合は、2番目の引数の逆が代わりに使用されます。
ミスター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の答えのそれと同様です。Aliceには整数を使用して文字列にインデックスを付ける簡単な方法がないため、音訳を使用してこの動作を複製するのが最も簡単です(yAliceで)。ただし、アリスの音訳セマンティクスは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 -> wm -> om -> am -> a。CJamは最初のマッピング以外のすべてを破棄しますが、アリスは代わりにこれらを循環します。したがって、最初mはにマッピングされw、2番目はにマッピングされ、o5番目は再びにマッピングさwれます。この場合、それは役に立ちません。一般に、CJamで行ったようyAAB(一部の文字列AおよびB)で実行すると、常にBAliceになってしまうからです。

では、どのように機能するマッピングを計算しyますか(つまり、繰り返しマッピングを手動で破棄する方法)。もちろん、別の音訳を使用して。:)

必要なマッピングのソースは、入力のナブ(重複排除された入力)でなければなりません。上記のマッピングをnubに適用すると、各文字は1回しか表示されないため、繰り返される各マッピングの最初のマッピングのみを使用します。したがって、入力とその逆でナブを音訳することにより、重複したマッピングを事実上単純に破棄しています。その後、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バイト

Justin Marinerのおかげで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

R68 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でこれが短くなるとは思いません(それについて間違っているのを楽しみにしています)。これは基本的にRodのpython回答の 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

Python191 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のC回答のポート。Javaで似たようなことをしなくても、もっと短くできるとは思いません。@ceilingcatの
おかげで-1バイト。

char[](文字配列)として入力し、バイトを節約するために新しい入力を返す代わりにこの入力を変更します。

ここで試してみてください。


@ceilingcatありがとう!
ケビンCruijssen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.