Xóa ký tự ở chỉ mục đã chỉ định


33

(lấy cảm hứng rất nhiều từ Element of string ở chỉ mục đã chỉ định )

Cho một chuỗi svà một số nguyên nbiểu thị một chỉ mục trong s, đầu ra svới ký tự ở nvị trí -th được loại bỏ.

Chỉ mục 0 và lập chỉ mục 1 được cho phép.

  • Đối với chỉ mục 0, nsẽ không âm và nhỏ hơn độ dài của s.
  • Đối với chỉ mục 1, nsẽ dương và nhỏ hơn hoặc bằng độ dài của s.

ssẽ chỉ bao gồm các ký tự ASCII có thể in ( \x20-\x7Ehoặc  thông qua ~).

Bất kỳ đầu vào / đầu ra hợp lý đều được cho phép. Tiêu chuẩn áp dụng.

Testcase (0-index):

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

Testcase (1 chỉ mục):

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

Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng.


9
Không ai khác trả lời, C # đang chiến thắng ... quá muộn :(
TheLethalCoder

Chúng ta có thể cho rằng char tại idx đó chỉ xuất hiện một lần không?
lập trình

1
@ lập trình viên5000 Trường hợp thử nghiệm cuối cùng 3, 314151-> 31451. Tôi cho là không.
TheLethalCoder

@ lập trình5000 Số Xem trường hợp kiểm tra cuối cùng.
Sản phẩm ETH

2
Có lẽ bảng xếp hạng sẽ hữu ích, có rất nhiều câu trả lời để tìm kiếm thông qua.
Ông Xcoder

Câu trả lời:



13

Alice , 13 12 byte

Cảm ơn Leo vì đã tiết kiệm 1 byte.

/oI\!e]&
@ q

Hãy thử trực tuyến!

Dòng đầu tiên của đầu vào là chuỗi, dòng thứ hai là chỉ số dựa trên 0.

Giải trình

/    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 (Kona), 1 byte

_

Yêu phải tích hợp. Lập chỉ mục dựa trên 0. Sử dụng:

k)"abcdef" _ 3
"abcef"

Đưa ra một ý nghĩa hoàn toàn mới để "sử dụng công cụ phù hợp cho công việc".
MD XF

1
Ha - bạn muốn xem công cụ phù hợp cho công việc? codegolf.stackexchange.com/a/121700/49493
Simon Major

Tôi đã phát hiện ra một cách để làm điều này với một chương trình thậm chí còn ngắn hơn. Thật không may, không có đủ chỗ trong hộp bình luận này để giải thích ;-)
Mawg

8

Haskell , 28 24 byte

-4 byte nhờ Laikoni, phiên bản này được lập chỉ mục 1.

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

Câu trả lời cũ:

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

Một hàm đệ quy đơn giản lấy giá trị, nó được lập chỉ mục 0.

Lần đầu tiên tôi chơi golf, có lẽ đó không phải là giải pháp tối ưu. Ồ tốt


2
Chào mừng đến với PPCG!
Martin Ender

1
Ngoài ra, bạn có thể quan tâm đến bộ sưu tập các mẹo chơi golf ở Haskell .
Laikoni

7

Toán học, 18 byte

1 chỉ mục

#2~StringDrop~{#}&

đầu vào

[1, "abcde"]

cảm ơn Martin Ender


4
Theo tôi, "Bất kỳ đầu vào / đầu ra hợp lý nào đều được phép" cho phép đầu vào được thực hiện như thế nào ["abcde", {1}], trong trường hợp đó StringDropchỉ có một mẹo. Bạn nghĩ sao? (Bạn có thể muốn một cách rõ ràng đề cập rằng đó là 1 lập chỉ mục là tốt.) Tôi luôn vui mừng khi thấy người đăng Mathematica câu trả lời :)
Greg Martin



5

Chức năng GCC c, 25

Lập chỉ mục 1 dựa trên.

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

Rất nhiều hành vi không xác định ở đây vì vậy hãy coi chừng các Velociraptors đi lạc :

  • Các strcpy()trang người đàn ông nói Nếu sao chép diễn ra giữa các đối tượng chồng chéo, hành vi là undefined . Ở đây rõ ràng có sự chồng chéo của chuỗi srcDest , nhưng nó dường như hoạt động, vì vậy hoặc glibc cẩn thận hơn hoặc tôi đã gặp may mắn.
  • Câu trả lời là phụ thuộc vào thực tế là s+=nxảy ra trước s-1. Các tiêu chuẩn cho phép không đảm bảo như vậy, và trong thực tế các cuộc gọi ra đây là hành vi không xác định. Một lần nữa, nó dường như hoạt động theo yêu cầu với trình biên dịch gcc trên x86_64 Linux.

Hãy thử trực tuyến .


2
Trong ABI dựa trên ngăn xếp, chẳng hạn như x86, strcpycác đối số cần được đẩy theo thứ tự từ phải sang trái, điều này sẽ giải thích hành vi, nhưng bạn nói rằng bạn đang sử x86_64dụng các thanh ghi ... có thể trình biên dịch đã quyết định chơi golf mã được tạo và quyết định rằng tính toán s + = n đầu tiên là golfier!
Neil

5
Tôi thích nó khi C trả lời "điều này không có lý do chính thức để làm việc, nhưng dù sao nó cũng vậy, vì vậy ... eh."
Quentin

Thánh lồn Điều này thổi tôi ra khỏi nước. Rất ấn tượng!
MD XF

1
@Quentin Đó là một trong những điều thú vị về môn đánh gôn - bạn được phép - thậm chí được khuyến khích - viết mã không an toàn, tệ hại nhất thường là một vụ bắn súng ;-)
Chấn thương kỹ thuật số

Tôi rất muốn biết lý do của downvote ...
Chấn thương kỹ thuật số

4

MATL , 3 byte

&)&

Sử dụng lập chỉ mục dựa trên 1.

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

&    % 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

Trong phiên bản sửa đổi với tất cả các trường hợp thử nghiệm, mã nằm trong một vòng lặp vô hạn `...Tcho đến khi không tìm thấy đầu vào. Vào cuối mỗi lần lặp, hàm hiển thị ( XD) được gọi rõ ràng và ngăn xếp được xóa ( x) để sẵn sàng cho lần lặp tiếp theo.


Tôi thích ý tưởng của các bộ sửa đổi lệnh chung, chúng có thể hữu ích trong các ngôn ngữ chơi gôn khác.
Sản phẩm ETH

2
@ETHproductions Nếu bạn cần một cái tên, tôi gọi chúng là các hàm meta , vì chúng sửa đổi các chức năng
Luis Mendo

@LuisMendo Tôi nghĩ rằng tên chính thức sẽ là toán tử , toán tử la (hay còn gọi là hàm bậc cao).
Mego

4

Vim, 7 byte

jDk@"|x

Làm thế nào nó hoạt động:

Nó mong đợi hai dòng; một với chuỗi và một với số.

  1. Chuyển đến dòng hai, sao chép số vào đăng ký
  2. Chuyển đến dòng đầu tiên và sau đó chuyển đến cột trong đăng ký với @ "|
  3. Xóa ký tự dưới con trỏ

Một giải pháp thú vị khác gần như giống hệt làjD@"gox
DJMcMayhem

Gắn cờ -> Đóng -> Bản sao của codegolf.stackexchange.com/a/121581/61563 : P đùa, nhưng chúng giống nhau đáng kể.
MD XF

họ đang! Có giải thưởng nào cho việc hạ xuống 7 ký tự đầu tiên không? :-P
jmriego

4

Java 8, 39 byte

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

Hãy thử nó ở đây.

Java 7, 67 byte

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

Hãy thử nó ở đây.


Giả sử nó hoạt động, một "tích hợp" cho 46 byte s->n->new StringBuilder(s).deleteCharAt(n)+"";mặc dù nó dài hơn.
TheLethalCoder

@TheLethalCoder Nó thực sự hoạt động. Nhưng nó thực sự dài hơn một chút. Oh, và luôn luôn sử dụng StringBufferthay vì StringBuildertrong codegolf. ;)
Kevin Cruijssen

Ah mẹo hay trên bộ đệm Tôi đã sử dụng nó trong câu trả lời của mình :)
TheLethalCoder


4

Haskell , 15 byte

Điều này đòi hỏi GHC 8.4.1 được phát hành gần đây (hoặc cao hơn). Bây giờ <> , là một chức năng trên Semigroups, nằm trong Prelude. Nó đặc biệt hữu ích trên chức năng Semigroup

take<>drop.succ

Hãy thử trực tuyến!
Vì tio đang sử dụng một GHC cũ hơn, tôi đã nhập <>vào tiêu đề.


4

R, 40 byte

Chỉ cần hiển thị nhiều cách khác nhau, không có cách nào đặc biệt nhỏ gọn, bạn có thể sử dụng chuỗi trong R.

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





3

JS (ES6), 41 32 31 byte

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

Dựa trên điều này . Đưa đầu vào thông qua currying, đầu tiên là chuỗi, thứ hai là chỉ mục.

-9 cảm ơn @JohanKarlsson

-1 cảm ơn @ETHproductions


3

Thạch , 3 byte

Ṭœp

Một chương trình đầy đủ lấy chỉ mục (dựa trên 1) và chuỗi (theo thứ tự đó) và in kết quả.

Là một chức năng dyadic, nó trả về một danh sách của hai phần.

Trong thực tế, chỉ mục có thể là một danh sách gồm n chỉ số, trong trường hợp đó, nó trả về một danh sách các phần n-1 .

Hãy thử trực tuyến! Hoặc xem một bộ kiểm tra .

Làm sao?

Ṭœ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

Như một ví dụ về việc sử dụng nhiều chỉ mục:

      "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

Có đầu vào 1 chỉ mục theo định dạng sau:

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

Cảm ơn @DJMcMayhem cho 3 byte!


3

Java 8, 45 41 byte

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

Đã lưu 4 byte nhờ @ OlivierGrégoire

Câu trả lời golf mã đầu tiên của tôi trong một cái gì đó không phải là C #, ngay cả khi nó chưa phải là ngắn nhất cho Java.


1
1. Bạn không cần trận chung kết ;trong lambda (-1 byte). 2. Trong mắt tôi, bạn không cần phải trả lại a String. Tôi nghĩ rằng việc trả về StringBuffermà không có +""sẽ hoàn toàn hợp lệ (-3 byte). Thí dụ? BigIntegerlà một đại diện của một không giới hạn int, trong trường hợp này StringBuffer/ StringBuilderlà đại diện của Strings có thể thay đổi .
Olivier Grégoire

@ OlivierGrégoire Cảm ơn :) Tôi chưa bao giờ thực sự sử dụng Java trước đây vì vậy mọi cải tiến đều được chào đón
TheLethalCoder


2

JavaScript (ES6), 39 34 33 byte

n=>s=>s.replace(/./g,c=>n--?c:"")
  • 5 6 byte được lưu nhờ Arnauld .



2

PHP, 41 byte, 35 byte không bao gồm? Php

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

Chỉ số 0

TIO


Tôi thực sự thực sự ngạc nhiên về công việc này; là [$argv[2]]chỉ số ngầm định tạo ra một phạm vi? Ngoài ra, IIRC bạn có thể <?php tắt, bởi vì trình thông dịch PHP có chế độ không cần đến nó và vì chúng ta thường không phạt đối với loại chỉ dẫn đó trong một tệp về ngôn ngữ.

@ ais523 Về cơ bản là có. Từ tài liệu: "Các ký tự trong chuỗi có thể được truy cập và sửa đổi bằng cách chỉ định bù trừ dựa trên số 0 của ký tự mong muốn sau chuỗi sử dụng dấu ngoặc vuông, như trong $ str [42]. Hãy nghĩ về một chuỗi như một mảng ký tự cho điều này mục đích." php.net/manual/en/lingu.types.opes.php
ME


2

R, 48 47 byte

(1 byte được lưu thông qua việc sử dụng el()cảm ơn Giuseppe)

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

Tách chuỗi thành các ký tự riêng lẻ, loại bỏ ký thứ n và sau đó nối lại.

Cũng có thể có một giải pháp tốt hơn, strsplit () khá khó sử dụng vì nó trả về một danh sách.


sẽ không hoạt động trên TIO: vì pryr::f([function body])một số byte và sử dụng el(strsplit(s,""))tiết kiệm một byte nhưng cũng không hoạt động trên TIO vì một số lý do.
Giuseppe

@Giuseppe Cảm ơn! Tôi sẽ cảm thấy hơi bẩn khi sử dụng pryr :: f vì chắc chắn nó phải đi trước install.packages("pryr")nhưng có lẽ đó là điều tôi quá quý giá!
dùng2390246

function(s,n)intToUtf8(utf8ToInt(s)[-n])cho 40 byte.
J.Doe

@ J.Doe chỗ tốt! Đó là một cách tiếp cận rất khác nhau, vì vậy bạn nên đăng nó dưới dạng câu trả lời của riêng bạn.
dùng2390246

Một tiểu 47 khác function(s,n)sub(sub(0,n,"(.{0})."),"\\1",s)dành cho 44.
J.Doe
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.