指定されたインデックスの文字を削除


33

指定されたインデックスの文字列の要素に強く触発された)

のインデックスを表す文字列sと整数nを指定すると、-th位置の文字が削除されてs出力されます。sn

0インデックスと1インデックスが許可されます。

  • 0インデックスの場合、n負ではなく、の長さより小さくなりsます。
  • 1-indexingの場合、n正で、の長さ以下になりsます。

s印刷可能なASCII文字のみで構成されます(\x20-\x7E、または から~)。

合理的な入力/出力が許可されます。標準の抜け穴が適用されます。

テストケース(0から始まる):

n s        output
0 "abcde"  "bcde"
1 "abcde"  "acde"
2 "a != b" "a = b"
3 "+-*/"   "+-*"
4 "1234.5" "12345"
3 "314151" "31451"

テストケース(1-indexed):

n s        output
1 "abcde"  "bcde"
2 "abcde"  "acde"
3 "a != b" "a = b"
4 "+-*/"   "+-*"
5 "1234.5" "12345"
4 "314151" "31451"

これはであるため、バイト単位の最短回答が優先されます。


9
誰も答えない、C#が勝っている...遅すぎる:(
TheLethalCoder

そのidxのcharが一度だけ現れると仮定できますか?
Programmer5000

1
@ programmer5000最後のテストケース3314151-> 31451。そうではないと思います。
-TheLethalCoder

@ programmer5000いいえ。最後のテストケースを参照してください。
ETHproductions

2
リーダーボードが役立つかもしれませんが、すでに検索する多くの答えがあります。
ミスターXcoder

回答:



13

アリス13 12バイト

1バイトを節約してくれたLeoに感謝します。

/oI\!e]&
@ q

オンラインでお試しください!

入力の1行目は文字列、2行目は0ベースのインデックスです。

説明

/    Reflect to SE. Switch to Ordinal. While in Ordinal mode, the IP bounces
     diagonally up and down through the code.
I    Read the first line of input (the string).
!    Store the string on the tape, which writes the characters' code points to 
     consecutive cells (the tape is initialised to all -1s).
]    Move the tape head right. This moves it by an entire string, i.e. to the
     cell after the -1 that terminates the current string.
     The IP bounces off the bottom right corner and turns around.
]    Move the tape head right by another cell.
!    Store an implicit empty string on the tape, does nothing. It's actually
     important that we moved the tape head before this, because otherwise it
     would override the first input code point with a -1.
I    Read the second line of input (the index) as a string.
/    Reflect to W. Switch to Cardinal.
     The IP wraps around to the last column.
&]   Implicitly convert the first input to the integer value it contains
     (the index) and move the tape head that many cells to the right, i.e.
     onto the character we want to delete. Note that Ordinal and Cardinal mode
     have two independent tape heads on the same tape, so the Cardinal tape
     head is still on the first cell of the string input before we do this.
e!   Store a -1 in the cell we want to delete.
\    Reflect to SW. Switch to Ordinal.
q    Push the entire tape contents as a single string. This basically takes
     all cells which hold valid code points from left to right on the tape 
     and concatenates the corresponding characters into a single string. Since
     we wrote a -1 (which is not a valid code point) over the target character,
     this will simply push the entire input string without that character.
o    Output the result.
@    Terminate the program.


10

K(コナ)、1バイト

_

組み込みが大好きです。0ベースのインデックス付け。使用法:

k)"abcdef" _ 3
"abcef"

「仕事に適切なツールを使用する」ことにまったく新しい意味を与えます。
MD XF

1
ハ-あなたは仕事に適したツールを見たいですか?codegolf.stackexchange.com/a/121700/49493
サイモン主な

さらに短いプログラムでこれを行う方法を発見しました。残念ながら、このコメントボックスには説明するのに十分なスペースがありません ;-)
Mawg

8

Haskell28 24バイト

Laikoniのおかげで-4バイト、このバージョンは1インデックスです。

s#n=take(n-1)s++drop n s

古い答え:

f(s:t)0=t;f(s:t)n=s:f t(n-1)

値を取得する単純な再帰関数で、0インデックスが付けられています。

初めてコードゴルフをするので、それは最適な解決策ではないかもしれません。しかたがない。


2
PPCGへようこそ!
マーティンエンダー

1
また、Haskellでのゴルフヒント集にも興味があるかもしれません。
ライコニ

7

Mathematica、18バイト

1インデックス付き

#2~StringDrop~{#}&

入力

[1、 "abcde"]

おかげでマーティン・エンダー


4
入力は同様に撮影するために私の意見では、「任意の合理的な入力/出力が許可されている」ことができ["abcde", {1}]、その場合には、StringDrop一人でトリックを行います。どう思いますか?(1インデックスも付けられていることを明示的に言及することもできます。)Mathematicaの回答を投稿している人々を見るのはいつでも嬉しいです:)
グレッグマーティン



5

GCC c関数、25

1ベースのインデックス。

f(n,s){strcpy(s-1,s+=n);}

ここでは未定義の動作がたくさんありますので、浮遊ヴェロキラプトルに注意してください

  • strcpy()manページは言うコピーがオーバーラップは、動作は未定義であることをオブジェクト間で行われる場合。ここでは明らかにsrcdestの文字列の重複がありますが、動作しているように見えるので、glibcの方がより慎重であるか、私は幸運に恵まれました。
  • 答えは、のs+=n前に起こるという事実に依存していs-1ます。標準はそのような保証を与えていない、実際には未定義の動作として、このアウトを呼び出します。繰り返しになりますが、x86_64 Linux上のgccコンパイラで必要に応じて動作するようです。

オンラインでお試しください


2
x86などのスタックベースのABIでは、strcpy引数を右から左の順序でプッシュする必要があります。これは動作を説明するものですがx86_64、レジスタを使用するものを使用していると言いました。生成されたコードは、最初にs + = nを計算することがゴルファーであると決定しました!
ニール

5
Cの答えが「これには公式な理由はありませんが、とにかくうまくいくので...」
クエンティン

神聖ながらくた。これは私のものを水から吹き飛ばします。非常に印象的!
MD XF

1
@Quentinそれはコードゴルフの楽しいことの1つです-あなたは許可されています-奨励されています-通常は発砲犯罪である最もひどい、安全ではないコードを書くこと;
デジタルトラウマ

私は... downvoteの理由を知ってみたい
デジタルトラウマに

4

MATL、3バイト

&)&

1ベースのインデックスを使用します。

オンラインでお試しください!または、すべてのテストケースを確認します

説明

&    % Specify secondary default number of inputs/outputs for next function
)    % Implicitly input string and number. Index: with & it pushes the char
     % defined by the index and the rest of the string
&    % Specify secondary default number of inputs/outputs for next function
     % Implicitly display (XD): with & it only displays the top of the stack

すべてのテストケースを含む修正版では、`...T入力が見つからなくなるまで、コードは無限ループ内にあります。各反復の最後に、表示関数(XD)が明示的に呼び出さxれ、次の反復に備えてスタックがクリア()されます。


私は一般的なコマンド修飾子のアイデアが好きです、それらは他のゴルフ言語で役に立つかもしれません。
ETHproductions

2
@ETHproductions名前が必要な場合は、私はそれらを呼び出すメタ機能を、彼らは機能を変更するよう、
ルイスMendo

@LuisMendo正式な名前は、演算子、la数学演算子(別名高階関数)になると思います。
メゴ

4

Vim、7バイト

jDk@"|x

使い方:

2行が必要です。1つは文字列で、もう1つは数字です。

  1. 2行目に進み、番号をレジスタにコピーします
  2. 最初の行に移動し、@ "|でレジスタの列に移動します
  3. カーソルの下の文字を削除します

ほぼ同じである別の楽しいソリューションはjD@"gox
DJMcMayhem

フラグ設定->閉じる-> codegolf.stackexchange.com/a/121581/61563の重複:P冗談ですが、それらは非常に似ています。
MD XF

彼らです!最初に7人のキャラクターを獲得するための賞品はありますか?:-P
jmriego

4

Java 8、39バイト

s->n->s.substring(0,n)+s.substring(n+1)

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

Java 7、67バイト

String c(int n,String s){return s.substring(0,n)+s.substring(n+1);}

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


それが機能すると仮定すると、46バイトの「組み込み」s->n->new StringBuilder(s).deleteCharAt(n)+"";がより長くなります。
TheLethalCoder

@TheLethalCoder それは確かに動作します。しかし、実際にはもう少し長くなります。ああ、常にcodegolfのStringBuffer代わりに使用StringBuilderします。;)
ケビンクルーイッセン

ああ、バッファのすてきなトリック:私は私の答えでそれを使った:)
TheLethalCoder


4

Haskell、15バイト

これには、最近リリースされたGHC 8.4.1(またはそれ以降)が必要です。さて <>、セミグループの関数として、プレリュードにあります。セミグループ関数で特に便利です

take<>drop.succ

オンラインでお試しください!
tioはGHCの古いバージョンを使用しているため<>、ヘッダーにインポートしました。


4

R、40バイト

さまざまな方法を示しますが、どれも特にコンパクトではなく、Rで文字列をいじることができます。

function(s,n)intToUtf8(utf8ToInt(s)[-n])





3

JS(ES6)、41 32 31バイト

y=>i=>y.slice(0,i++)+y.slice(i)

基づいて、この。カリー化によって入力を受け取ります。最初は文字列、2番目はインデックスです。

-9 @JohanKarlssonに感謝

-1 @ETHproductionsに感謝


3

ゼリー、3 バイト

Ṭœp

(1から始まる)インデックスと文字列を(この順序で)取得し、結果を出力する完全なプログラム。

二項関数として、2つの部分のリストを返します。

実際、インデックスはn個のインデックスのリストである場合があり、その場合はn-1個の部分のリストを返します。

オンラインでお試しください!、またはテストスイートを参照してください。

どうやって?

Ṭœp - Main link: number i, string s                   e.g. "fish 'n chips", 6
Ṭ   - untruth - get a list with 1s at the indexes of i      000001 <-- i.e. [0,0,0,0,0,1]
 œp - partition s at truthy indexes without borders       ["fish ","n chips"]
    - implicit print                                        fish n chips

複数のインデックスを使用する例として:

      "fish and chips", [6,8]
Ṭ      00000101 <- i.e. [0,0,0,0,0,1,0,1]
 œp  ["fish ","n"," chips"] 
       fish n chips

3

vim、10 7

DgJ@"|x

次の形式で1インデックス付きの入力を受け取ります。

2
abcde
D      delete the number on the first line into register "
gJ     remove the newline while preserving whitespace on line 2
@"     run the " register as a macro - input is used as a count for...
|      the "go to nth column" command
x      delete the character at the cursor

3バイトの@DJMcMayhemに感謝します!


3

Javaの8、45の 41バイト

s->n->new StringBuffer(s).deleteCharAt(n)

@OlivierGrégoireのおかげで4バイト節約

私の最初のコードのゴルフは、C#以外の何かで答えます。たとえそれがまだJavaの最短ではありません。


1
1.最後の;ラムダ(-1バイト)は必要ありません。2.私の目には、を返す必要はありませんStringStringBufferなしで返す+""ことは完全に有効だと思います(-3バイト)。例?BigIntegerは無制限の表現で、intこの場合はStringBuffer/ StringBuilderは可変Stringのの表現です。
オリビエグレゴワール

OlivierGrégoireのおかげで:)私は実際にすべての改善は歓迎されているので、前のJavaを使ったことがない@
TheLethalCoder


2

JavaScript(ES6)、39 34 33バイト

n=>s=>s.replace(/./g,c=>n--?c:"")
  • 5 Arnauldのおかげで6バイトが節約されました。



2

PHP、41バイト、35バイトを除く?php

<?php $argv[1][$argv[2]]='';echo$argv[1];

0インデックス付き

TIO


私は実際にこの作品に本当に驚いています。され[$argv[2]]たインデックスは、暗黙的に範囲を作成しますか?また、IIRC <?php では、PHPインタープリターにそれを必要としないモードがあり、通常は言語のファイル内のそのような指示に対してペナルティを課さないため、オフのままにすることができます。

@ ais523基本的にはい。文書から:「文字列内の文字は、$ str [42]のように、角配列ブラケットを使用して文字列の後に目的の文字のゼロベースのオフセットを指定することでアクセスおよび変更できます。目的。" php.net/manual/en/language.types.string.php
ME


2

R、48 47バイト

el()Giuseppe のおかげで1バイト節約)

function(s,n)cat(el(strsplit(s,""))[-n],sep="")

文字列を個々の文字に分割し、n番目を削除してから再度連結します。

より良い解決策があるかもしれません。strsplit()はリストを返すので非常に扱いにくいです。


TIOでは動作しません:pryr::f([function body])数バイトをel(strsplit(s,""))保存し、使用するとバイトを保存しますが、何らかの理由でTIOでも動作しません。
ジュゼッペ

@ジュゼッペありがとう!pryr :: fを使用するのは確かに先行するはずなので、少し汚い気がしますinstall.packages("pryr")が、多分それは私があまりにも貴重だからです!
user2390246

function(s,n)intToUtf8(utf8ToInt(s)[-n])40バイト。
J.Doe

@ J.Doe良いスポット!それは非常に異なるアプローチですので、あなたはあなた自身の答えとしてそれを投稿すべきです。
user2390246

別のサブ47はfunction(s,n)sub(sub(0,n,"(.{0})."),"\\1",s)44用です
。– J.Doe
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.