删除指定索引处的字符


33

(很大程度上受指定索引处的string元素启发)

给定一个字符串s和一个整数,该整数n表示中的索引s,输出s的字符在n-th位置已删除。

允许0索引和1索引。

  • 对于0索引,n将为非负数且小于的长度s
  • 对于1索引,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索引):

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上的字符仅出现一次?
程序员

1
@ programmer5000最后一个测试用例3314151-> 31451。我想没有。
TheLethalCoder

@ programmer5000否。请参见最后一个测试用例。
ETHproductions's

2
排行榜可能会有所帮助,已经有很多答案需要搜索。
Xcoder先生17年

Answers:



13

爱丽丝13 12字节

感谢Leo节省了1个字节。

/oI\!e]&
@ q

在线尝试!

输入的第一行是字符串,第二行是从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.




7

Mathematica,18个字节

1索引

#2~StringDrop~{#}&

输入

[1,“ abcde”]

谢谢马丁·恩德


4
在我看来,“允许任何合理的输入/输出”都可以像这样进行输入["abcde", {1}],在这种情况下,StringDrop仅此一项就可以解决问题。你怎么看?(您可能要明确提到它也是1索引的。)我总是很高兴看到人们发布Mathematica答案:)
Greg Martin


5

CJam,4个字节

q~Lt

在线尝试!

说明

q~    e# Read and eval input (push the string and number to the stack).
  Lt  e# Set the nth element of the string to the empty string.

5

GCC c函数,25

基于1的索引。

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

这里有很多不确定的行为,所以要小心流浪速龙

  • strcpy()手册页说,如果复制操作的对象之间重叠的,这种行为是未定义。显然,src dest字符串,但是它似乎可以工作,因此glibc会更加谨慎,或者我很幸运。
  • 答案取决于事实s+=n发生在...之前s-1。该标准没有给出这样的保证,而事实上调用此作为出不确定的行为。同样,它似乎可以在x86_64 Linux上的gcc编译器中正常工作。

在线尝试


2
在基于堆栈的ABI(例如x86)中,strcpy需要按从右到左的顺序推入参数,这可以解释其行为,但是您说过您使用的x86_64是使用寄存器的函数……也许编译器决定采用生成的代码,并决定首先计算s + = n是高尔夫!
尼尔

5
当C回答为“这没有正式的理由,但无论如何,它确实起作用,所以……嗯”,我就喜欢它。
昆汀

哇靠。这把我的从水里吹了出来。非常令人印象深刻!
MD XF

1
@Quentin这是关于代码高尔夫球的有趣事情之一-允许您-甚至鼓励-编写最糟糕,最不安全的代码,通常这会是发火的行为;-)
Digital Trauma

我很想知道投票否决的原因……
Digital Trauma

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's

2
@ETHproductions如果您需要一个名称,我将它们称为元函数,因为它们会修改函数
Luis Mendo

@LuisMendo我认为正式名称将是operator,一个数学运算符(又称高阶函数)。
Mego

4

Vim,7个字节

jDk@"|x

怎么运行的:

预期有两行;一个带字符串,另一个带数字。

  1. 转到第二行,将数字复制到寄存器中
  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);}

在这里尝试。


假设它可以工作,s->n->new StringBuilder(s).deleteCharAt(n)+"";尽管更长,但“内置”为46个字节。
TheLethalCoder

@TheLethalCoder 确实有效。但这确实要更长一些。哦,总是在codegolf中使用StringBuffer代替StringBuilder。;)
Kevin Cruijssen

我在答案中使用了缓冲区的一个不错的技巧:)
TheLethalCoder


4

Haskell,15个字节

这需要最近发布的GHC 8.4.1(或更高版本)。现在 <>,作为Semigroups的功能,位于Prelude中。在功能Semigroup上特别有用

take<>drop.succ

在线尝试!
由于tio使用的是旧版本的GHC,因此我已将其导入<>标头中。


4

R,40个字节

只是为了展示各种方式,没有哪一种特别紧凑,您可以在R中弄弄字符串。

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

3

05AB1E,5个字节

ā²ÊÏJ

在线尝试!

ā     # push range(1, len(input string) + 1)
 ²Ê   # Check each for != to input index
   Ï  # Keep characters from input where this array is 1
    J # Join




3

JS(ES6),41 32 31字节

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

基于。通过curry获取输入,第一个是字符串,第二个是索引。

-9感谢@JohanKarlsson

-1感谢@ETHproductions


3

果冻,3 个字节

Ṭœp

完整程序,使用(从1开始)索引和字符串(按此顺序)并打印结果。

作为二进位函数,它返回两个部分的列表。

实际上,索引可以是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

感谢@DJMcMayhem 3个字节!


3

Java 8、45 41字节

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

@OlivierGrégoire节省了4个字节

我的第一个代码高尔夫用C#以外的其他方式回答,即使它不是Java的最短代码。


1
1.您不需要;以lambda(-1字节)结尾的决赛。2.在我眼中,您无需返回String。我认为StringBuffer不带返回值+""将是完全有效的(-3个字节)。例?BigInteger是unbounded的表示形式int,在这种情况下StringBuffer/ StringBuilder是mutable 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索引

蒂奥


实际上,我真的对此工作感到惊讶;在[$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上也不起作用。
朱塞佩

@Giuseppe谢谢!使用pryr :: f会使我感到有点脏,因为肯定要在它之前加上,install.packages("pryr")但是也许那是我太宝贵了!
user2390246

function(s,n)intToUtf8(utf8ToInt(s)[-n])40字节
J.Doe

@ J.Doe好地方!那是一种非常不同的方法,因此您应该将其发布为自己的答案。
user2390246 '18

另一个47 function(s,n)sub(sub(0,n,"(.{0})."),"\\1",s)
分机
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.