Hapus karakter pada indeks yang ditentukan

33

(sangat terinspirasi oleh Elemen string pada indeks yang ditentukan )

Diberikan string sdan integer yang nmewakili indeks masuk s, output sdengan karakter pada nposisi -th dihapus

Pengindeksan 0 dan pengindeksan 1 diizinkan.

  • Untuk pengindeksan 0, nakan menjadi non-negatif dan kurang dari panjang s.
  • Untuk pengindeksan 1, nakan positif dan kurang dari atau sama dengan panjang s.

shanya akan terdiri dari karakter ASCII yang dapat dicetak ( \x20-\x7E, atau  melalui ~).

Input / output yang masuk akal diizinkan. Celah standar berlaku.

Testcases (0-diindeks):

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

Testcases (1-diindeks):

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

Ini adalah , jadi jawaban tersingkat dalam byte menang.

Produksi ETH
sumber
9
Tidak ada orang lain yang menjawab, C # menang ... terlambat :(
TheLethalCoder
Bisakah kita berasumsi bahwa arang di idx itu hanya muncul sekali?
programmer5000
1
@ programmer5000 Test case terakhir 3, 314151-> 31451. Saya kira tidak.
TheLethalCoder
@ programmer5000 No. Lihat kasus uji terakhir.
ETHproduksi
2
Mungkin papan peringkat akan membantu, sudah ada banyak jawaban untuk mencari.
Tn. Xcoder

Jawaban:

23

C #, 20 19 byte

s=>n=>s.Remove(n,1)
TheLethalCoder
sumber
13

Alice , 13 12 byte

Terima kasih kepada Leo karena telah menghemat 1 byte.

/oI\!e]&
@ q

Cobalah online!

Baris pertama dari input adalah string, baris kedua adalah indeks berbasis 0.

Penjelasan

/    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.
Martin Ender
sumber
10

K (Kona), 1 byte

_

Harus cinta bawaan. Pengindeksan berbasis 0. Pemakaian:

k)"abcdef" _ 3
"abcef"
Simon Major
sumber
Memberi makna baru untuk 'menggunakan alat yang tepat untuk pekerjaan itu'.
MD XF
1
Ha - Anda ingin melihat alat yang tepat untuk pekerjaan itu? codegolf.stackexchange.com/a/121700/49493
Simon Major
Saya telah menemukan cara untuk melakukan ini dengan program yang bahkan lebih pendek. Sayangnya, tidak ada cukup ruang di kotak komentar ini untuk menjelaskan ;-)
Mawg
8

Haskell , 28 24 Bytes

-4 byte terima kasih kepada Laikoni, versi ini diindeks 1.

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

Jawaban lama:

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

Fungsi rekursif sederhana yang mengambil nilai, itu 0-diindeks.

Golf-code pertama kali saya jadi mungkin itu bukan solusi yang optimal. Baiklah.

Sersan Doggo
sumber
2
Selamat datang di PPCG!
Martin Ender
1
Anda juga mungkin tertarik pada koleksi tips untuk bermain golf di Haskell .
Laikoni
7

Mathematica, 18 byte

1-diindeks

#2~StringDrop~{#}&

memasukkan

[1, "abcde"]

terima kasih Martin Ender

J42161217
sumber
4
Menurut pendapat saya, "Setiap input / output yang masuk akal diizinkan" memungkinkan input yang akan diambil seperti ["abcde", {1}], dalam hal ini StringDropsaja yang berhasil. Apa yang kamu pikirkan? (Anda mungkin ingin secara eksplisit menyebutkan bahwa itu 1-diindeks juga.) Saya selalu senang melihat orang-orang memposting jawaban Mathematica :)
Greg Martin
5

CJam , 4 byte

q~Lt

Cobalah online!

Penjelasan

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.
Kucing Bisnis
sumber
5

Fungsi GCC c, 25

Pengindeksan berbasis 1.

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

Banyak perilaku yang tidak terdefinisi di sini jadi waspadalah terhadap velociraptors yang tersesat :

  • The strcpy()halaman manual mengatakan Jika menyalin terjadi antara objek yang tumpang tindih, perilaku tidak terdefinisi . Di sini jelas ada tumpang tindih dari string src dan dest , tetapi tampaknya berfungsi, jadi glibc lebih hati-hati atau saya beruntung.
  • Jawabannya bergantung pada kenyataan bahwa yang s+=nterjadi sebelum s-1. Standar tidak memberikan jaminan seperti itu, dan pada kenyataannya menyebut ini sebagai perilaku yang tidak terdefinisi. Sekali lagi, tampaknya berfungsi seperti yang dipersyaratkan dengan kompiler gcc di x86_64 Linux.

Cobalah online .

Trauma Digital
sumber
2
Dalam ABI berbasis tumpukan, seperti x86, strcpyargumen perlu didorong dalam urutan kanan-ke-kiri, yang akan menjelaskan perilaku, tetapi Anda mengatakan Anda menggunakan x86_64yang menggunakan register ... mungkin kompilator memutuskan untuk bermain golf kode yang dihasilkan dan memutuskan bahwa komputasi s + = n pertama adalah golfier!
Neil
5
Saya suka ketika jawaban C pergi "ini tidak memiliki alasan resmi untuk bekerja, tetapi tetap saja, jadi ... eh."
Quentin
Omong kosong Ini meniup tambang keluar dari air. Sangat mengesankan!
MD XF
1
@ Quentin Itu salah satu hal yang menyenangkan tentang kode-golf - Anda diizinkan - bahkan didorong - untuk menulis kode yang paling mengerikan, tidak aman yang biasanya merupakan pelanggaran ;-)
Digital Trauma
Saya ingin tahu alasan untuk downvote ...
Digital Trauma
4

MATL , 3 byte

&)&

Menggunakan pengindeksan berbasis 1.

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

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

Dalam versi yang dimodifikasi dengan semua kasus uji, kode berada dalam loop tak terbatas `...Thingga tidak ada input yang ditemukan. Pada akhir setiap iterasi, fungsi tampilan ( XD) secara eksplisit dipanggil, dan stack dihapus ( x) untuk menyiapkannya untuk iterasi berikutnya.

Luis Mendo
sumber
Saya suka ide pengubah perintah generik, mereka mungkin berguna dalam bahasa golf lainnya.
ETHproduksi
2
@ ETHproductions Jika Anda memerlukan nama, saya memanggil mereka fungsi-meta , karena mereka memodifikasi fungsi
Luis Mendo
@LuisMendo Saya pikir nama formal akan menjadi operator , operator matematika a la (alias fungsi tingkat tinggi).
Mego
4

Vim, 7 byte

jDk@"|x

Bagaimana itu bekerja:

Ia mengharapkan dua garis; satu dengan string dan satu dengan nomornya.

  1. Pergi ke baris dua, salin nomornya ke register
  2. Pergi ke baris pertama dan kemudian ke kolom di register dengan @ "|
  3. Hapus karakter di bawah kursor
jmriego
sumber
Menyenangkan solusi lain yang hampir identikjD@"gox
DJMcMayhem
Memberi tanda tanda -> Penutupan -> Duplikat codegolf.stackexchange.com/a/121581/61563 : P kidding, tetapi mereka sangat mirip.
MD XF
mereka! Apakah ada hadiah untuk mendapatkan hingga 7 karakter pertama? :-P
jmriego
4

Java 8, 39 byte

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

Coba di sini.

Java 7, 67 byte

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

Coba di sini.

Kevin Cruijssen
sumber
Dengan asumsi itu berfungsi, sebuah "bawaan" untuk 46 byte s->n->new StringBuilder(s).deleteCharAt(n)+"";meskipun lebih panjang.
TheLethalCoder
@TheLethalCoder Memang berhasil. Tapi itu memang sedikit lebih lama. Oh, dan selalu gunakan StringBuffersebagai ganti StringBuildercodegolf. ;)
Kevin Cruijssen
Ah trik yang bagus untuk buffer yang saya gunakan dalam jawaban saya :)
TheLethalCoder
4

Haskell , 15 byte

Ini membutuhkan GHC 8.4.1 yang baru dirilis (atau lebih tinggi). Sekarang <> , sebagai fungsi pada Semigroup, ada di Prelude. Ini sangat berguna pada fungsi Semigroup

take<>drop.succ

Cobalah online!
Karena tio menggunakan bersion yang lebih lama dari GHC, saya sudah mengimpor <>di header.

H.Piz
sumber
4

R, 40 byte

Hanya untuk menunjukkan berbagai cara, tidak ada yang sangat kompak, Anda bisa bermain-main dengan string dalam R.

function(s,n)intToUtf8(utf8ToInt(s)[-n])
J.Apakah
sumber
3

05AB1E , 5 byte

ā²ÊÏJ

Cobalah online!

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

05AB1E , 6 byte

vNÊiy?

Cobalah online!

Penjelasan

v       # for each element, index (y,N) in input1
 NÊi    # if N is not equal to input2
    y?  # print y
Emigna
sumber
3

Pyth, 3 byte

.DE

Coba di sini.

Mengambil indeks terlebih dahulu.

Erik the Outgolfer
sumber
3

PHP, 42 Bytes

0 diindeks

<?=substr_replace($argv[1],"",$argv[2],1);

Cobalah online!

Jörg Hülsermann
sumber
3

JS (ES6), 41 32 31 byte

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

Berdasarkan ini . Mengambil input melalui currying, pertama adalah string, kedua adalah indeks.

-9 terima kasih kepada @JohanKarlsson

-1 terima kasih kepada @ETHproductions

programmer5000
sumber
3

Jelly , 3 byte

Ṭœp

Program lengkap yang mengambil indeks (berbasis 1) dan string (dalam urutan itu) dan mencetak hasilnya.

Sebagai fungsi diadik ia mengembalikan daftar dua bagian.

Bahkan indeks dapat berupa daftar n indeks, dalam hal ini mengembalikan daftar n-1 bagian.

Cobalah online! , atau lihat test suite .

Bagaimana?

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

Sebagai contoh menggunakan beberapa indeks:

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

vim, 10 7

DgJ@"|x

Mengambil input 1-diindeks dalam format berikut:

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

Terima kasih kepada @DJMcMayhem selama 3 byte!

Gagang pintu
sumber
3

Java 8, 45 41 byte

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

Disimpan 4 byte berkat @ OlivierGrégoire

Kode golf pertama saya menjawab sesuatu selain C #, meskipun itu bukan yang terpendek untuk Java.

TheLethalCoder
sumber
1
1. Anda tidak perlu final ;dalam lambda (-1 byte). 2. Di mata saya, Anda tidak perlu mengembalikan a String. Saya berpikir bahwa mengembalikan StringBuffertanpa +""akan benar-benar valid (-3 byte). Contoh? BigIntegermerupakan representasi dari sebuah tak terbatas int, dalam hal ini StringBuffer/ StringBuilderadalah representasi dari bisa berubah Strings.
Olivier Grégoire
@ OlivierGrégoire Terima kasih :) Saya belum pernah menggunakan Java sebelumnya, jadi semua perbaikan dipersilahkan
TheLethalCoder
2

Python 3 , 24 byte

lambda n,a:a[:n]+a[n+1:]

Cobalah online!

Biarawati Bocor
sumber
Dam kau mengalahkan aku untuk itu!
Notts90
1
Saya pikir, ini juga berlaku untuk python 2
Dead Possum
2

JavaScript (ES6), 39 34 33 byte

n=>s=>s.replace(/./g,c=>n--?c:"")
  • 5 6 byte disimpan berkat Arnauld .
Shaggy
sumber
2

brainfuck , 14 byte

,[>,.<-],,[.,]

Cobalah online!

Membaca indeks satu byte berbasis nol segera diikuti oleh string.

eush77
sumber
Ah, Anda mengalahkan saya: / Saya punya solusi yang sama persis . +1
daniero
2

Befunge-98 , 35 27 25 byte

-4 byte terima kasih kepada @ eush77

&#;1-:!#v_~,;
_@#:~;#~<;,

Cobalah online!

1-diindeks, perhatikan bahwa input memiliki nol-byte tertinggal.

ovs
sumber
2

PHP, 41 byte, 35 byte tidak termasuk? Php

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

Diindeks 0

TIO

SAYA
sumber
Saya benar-benar terkejut ini bekerja; Apakah [$argv[2]]indeks secara implisit membuat rentang? Juga, IIRC Anda dapat <?php mematikannya, karena penerjemah PHP memiliki mode yang tidak memerlukannya, dan karena kami biasanya tidak menghukum untuk semacam indikasi dalam file apa bahasa itu.
@ ais523 Pada dasarnya ya. Dari dokumen: "Karakter dalam string dapat diakses dan dimodifikasi dengan menentukan offset berbasis nol dari karakter yang diinginkan setelah string menggunakan tanda kurung array, seperti dalam $ str [42]. Pikirkan string sebagai array karakter untuk ini tujuan." php.net/manual/en/language.types.string.php
ME
2

Japt , 3 2 byte

jV

Cobalah online!

Luke
sumber
Anda tidak perlu1
Oliver
Terima kasih banyak. Tidak yakin bagaimana saya melewatkan itu ...
Luke
2

R, 48 47 byte

(1 byte disimpan melalui penggunaan el()terima kasih kepada Giuseppe)

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

Pisahkan string menjadi karakter-karakter individualnya, hapus angka ke-n dan kemudian gabungkan lagi.

Mungkin ada solusi yang lebih baik, strsplit () cukup sulit karena mengembalikan daftar.

pengguna2390246
sumber
tidak akan bekerja pada TIO: pryr::f([function body])menyimpan beberapa byte dan menggunakan el(strsplit(s,""))menyimpan byte tetapi juga tidak bekerja pada TIO karena beberapa alasan.
Giuseppe
@Giuseppe Terima kasih! Saya akan merasa sedikit kotor menggunakan pryr :: f karena pasti itu harus didahului oleh install.packages("pryr")tetapi mungkin itu saya terlalu berharga!
user2390246
function(s,n)intToUtf8(utf8ToInt(s)[-n])untuk 40 byte.
J.Doe
@ J.Apakah tempat yang bagus! Itu pendekatan yang sangat berbeda sehingga Anda harus mempostingnya sebagai jawaban Anda sendiri.
user2390246
Sub-47 lainnya adalah function(s,n)sub(sub(0,n,"(.{0})."),"\\1",s)untuk 44.
J.Doe