Belirtilen dizindeki karakteri kaldır


33

( Belirtilen dizindeki dizgenin Elemanı tarafından büyük ölçüde ilham alındı )

Bir dize sve bir ndizini temsil eden bir tamsayı verildiğinde s, çıkarılan skarakterdeki karakterin bulunduğu çıktı n.

0-indeksleme ve 1-indekslemeye izin verilir.

  • 0-indeksleme için, nnegatif olmayacak ve uzunluğundan daha az olacaktır s.
  • 1 indeksleme için, npozitif ve uzunluğuna eşit veya daha az olacaktır s.

syalnızca yazdırılabilir ASCII karakterlerinden oluşacaktır ( \x20-\x7Eveya  ile ~).

Herhangi bir makul giriş / çıkışa izin verilir. Standart boşluklar uygulanır.

Testcases (0 dizinli):

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

Test vitrinleri (1 indeksli):

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

Bu , bayt cinsinden en kısa cevap kazanır.


9
Başka kimse cevap vermiyor, C # kazanıyor ... çok geç :(
TheLethalCoder

Bu IDX'deki karakterin yalnızca bir kez göründüğünü varsayabilir miyiz?
programcı5000

1
@ programmer5000 Son test durumu 3, 314151-> 31451. Sanmıyorum.
TheLethalCoder

@ programmer5000 No. Son test durumuna bakın.
ETHProductions

2
Belki bir lider tablo yardımcı olabilir, aramaya çokça cevap vardır.
Bay Xcoder,

Yanıtlar:



13

Alice , 13 12 bayt

Leo'ya 1 byte kaydettiğin için teşekkürler.

/oI\!e]&
@ q

Çevrimiçi deneyin!

Girişin ilk satırı dize, ikinci satır 0 tabanlı dizindir.

açıklama

/    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 bayt

1 endeksli

#2~StringDrop~{#}&

giriş

[1, "abcde"]

Martin Ender teşekkür


4
Kanımca "Herhangi bir makul girdi / çıktıya izin veriliyor" ifadesi girdilerin alınmasına izin veriyor ["abcde", {1}], bu durumda StringDropsadece hile yapıyor. Ne düşünüyorsun? (Açıkça 1 indeksli olduğunu da açıkça belirtmek istersiniz.) Mathematica'nın yanıtlarını gönderen insanları görmekten her zaman mutlu oluyorum :)
Greg Martin


5

CJam , 4 bayt

q~Lt

Çevrimiçi deneyin!

açıklama

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 işlevi, 25

1 tabanlı indeksleme.

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

Burada tanımsız davranış bol başıboş velociraptors dikkat edin :

  • strcpy()Adam sayfası diyor kopyalama örtüşme, davranış tanımlanmamış olduğu nesneler arasında yer alırsa . Burada açıkça örtüşme var src ve dest dizgilerinin , ama iş gibi görünüyor, ya glibc daha dikkatli ya da şanslı oldum.
  • Cevap, önceki s+=nolaylardan önce gerçekleştiğine bağlı.s-1 . standart böyle bir garanti vermez ve aslında tanımsız davranış olarak bu out çağırır. Yine, x86_64 Linux'taki gcc derleyicisiyle gerektiği gibi çalışıyor gibi görünüyor.

Çevrimiçi deneyin .


2
X86 gibi yığın-temelli bir ABI’de, strcpyargümanları sağdan sola doğru ittirmek gerekir, ki bu da davranışı açıklar, ancak x86_64hangi kayıtları kullandığını söyledin ... belki derleyici golf oynamaya karar verdi Oluşturulan kod ve ilk s + = n hesaplamasının golfçü olduğuna karar verdi!
Neil

5
C cevapları gittiğinde onu seviyorum "bunun çalışması için resmi bir nedeni yok, ama yine de, yani ... eh."
Quentin

Kutsal bok Bu benimkileri sudan esiyor. Çok etkileyici!
MD XF

1
@Quentin Bu kod-golf ile ilgili eğlenceli şeylerden biri - izin verilir - hatta teşvik edilir - normalde ateş eden bir suç olacak en korkunç, güvensiz kodu yazmak ;-)
Digital Trauma,

Olumsuz oylamanın nedenini bilmek isterdim ...
Digital Trauma

4

MATL , 3 bayt

&)&

1 tabanlı indeksleme kullanır.

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın .

açıklama

&    % 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üm test senaryoları ile değiştirilmiş versiyonda, `...Thiçbir giriş bulunana kadar kod sonsuz bir döngü içerisindedir . Her yinelemenin sonunda, display işlevi ( XD) açıkça çağrılır ve bir xsonraki yinelemeye hazırlanmak için yığın temizlenir ( ).


Genel komut değiştiricileri fikrini seviyorum, diğer golf dillerinde de yararlı olabilirler.
ETHProductions

2
@ETHproductions Bir isme ihtiyacınız olursa, işlevleri değiştirdikleri için onlara meta-işlevler derim.
Luis Mendo

@LuisMendo Ben resmi adı olacağını düşünüyorum operatörleri , la la matematiksel operatörleri (aka yüksek dereceli fonksiyonlar) .
Mego

4

Vim, 7 bayt

jDk@"|x

Nasıl çalışır:

İki satır bekliyor; biri dize diğeri diğeri.

  1. İkinci satıra git, numarayı sicile kopyala
  2. İlk satıra git ve ardından kayıt defterinde @ "ile sütuna git.
  3. İmlecin altındaki karakteri sil

Neredeyse aynı olan başka bir eğlenceli çözümjD@"gox
DJMcMayhem

İşaretleme -> Kapanış -> Codegolf.stackexchange.com/a/121581/61563 yinelenen : P şaka, ama oldukça benzerler.
MD XF

onlar! İlk önce 7 karaktere kadar para ödülü var mı? :-P
jmriego

4

Java 8, 39 bayt

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

Burada dene.

Java 7, 67 bayt

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

Burada dene.


İşe yaradığını varsayarsak s->n->new StringBuilder(s).deleteCharAt(n)+"";, uzun olmasına rağmen 46 baytlık bir "yerleşik" .
TheLethalCoder

@TheLethalCoder Gerçekten çalışıyor. Ama gerçekten biraz daha uzun. Oh, ve her zaman codegolf StringBufferyerine kullanın StringBuilder. ;)
Kevin Cruijssen

Arabellek Ah güzel hile benim
cevabımda


4

Haskell , 15 bayt

Bu, yeni yayınlanan GHC 8.4.1 (veya daha üst sürüm) gerektirir. Şimdi <> , yarı gruplar üzerinde bir işlev olarak, Prelude'de. Semigroup fonksiyonunda özellikle yararlıdır.

take<>drop.succ

Çevrimiçi deneyin!
Tio daha eski bir GHC borsiyon kullandığı için <>, başlığa girdim .


4

R, 40 bayt

Bunlardan hiçbiri özellikle kompakt olan, R'de dizeleriyle oynayabileceğiniz çeşitli şekilleri göstermeye gider.

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

3

05AB1E , 5 bayt

ā²ÊÏJ

Çevrimiçi deneyin!

ā     # 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 bayt

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

Dayanarak bu . Kurutma ile girdi alır, ilk önce string, ikinci ise indexdir.

-9 @JohanKarlsson sayesinde

@ETHproductions sayesinde -1


3

Jöle , 3 bayt

Ṭœp

(1 tabanlı) dizini ve dizgiyi (bu sırayla) alan ve sonucu basan tam bir program.

İkili fonksiyon olarak iki bölümden oluşan bir liste döndürür.

Aslında, dizin n indislerin bir listesi olabilir , bu durumda n-1 bölümlerinin bir listesini verir .

Çevrimiçi deneyin! veya bir test odasına bakın .

Nasıl?

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

Birden fazla dizin kullanmaya örnek olarak:

      "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 indeksli girişi aşağıdaki biçimde alır:

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 byte'a teşekkürler !


3

Java 8, 45 41 bayt

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

@ OlivierGrégoire sayesinde 4 bayt kaydedildi

İlk kod golf, henüz Java için en kısa olmasa da, C # dışında bir şeye cevap veriyor.


1
1. Finalde ;lamda (-1 bayt) gerekmez . 2. Gözlerimde, bir geri dönmenize gerek yok String. StringBufferOlmadan geri dönen +""mükemmel geçerli olacağını düşünüyorum (-3 bayt). Örnek? BigIntegerbu, sınırlanmamış olanın bir temsilidir, intbu durumda StringBuffer/ StringBuilderdeğişken Strings'nin temsilidir .
Olivier Grégoire

@ OlivierGrégoire Teşekkürler :) Daha önce Java'yı hiç kullanmamıştım, bu yüzden tüm geliştirmelere açığız
TheLethalCoder





2

PHP, 41 bayt, 35 bayt hariç? Php

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

0 endeksli

TIO


Bu işe gerçekten şaşırdım; olan [$argv[2]]endeks örtülü bir dizi oluşturmak? Ayrıca, IIRC'yi bırakabilirsiniz <?php , çünkü PHP tercümanı ihtiyacı olmayan bir moda sahiptir ve normalde dilin ne olduğuna ilişkin bir dosyada bu tür bir göstergeyi cezalandırmıyoruz.

@ ais523 Temel olarak evet. Dokümanlardan: "Dizgelerin içindeki karakterlere, $ str [42] 'de olduğu gibi kare dizi parantezleri kullanılarak dizgeden sonra istenen karakterin sıfır temelli kayması belirtilerek erişilebilir ve değiştirilebilir. Bunun için karakter dizisi olarak düşünün. amaç." php.net/manual/en/language.types.string.php
ME


2

R, 48 47 bayt

( el()Giuseppe sayesinde 1 bayt kurtarıldı )

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

Dizgiyi kendi karakterlerine ayırın, nth'yi çıkarın ve sonra tekrar birleştirin.

Daha iyi bir çözüm olabilir, strsplit () bir liste döndürürken oldukça hantaldır.


TIO'da çalışmaz: pryr::f([function body])birkaç bayttan el(strsplit(s,""))tasarruf sağlar ve kullanımı bir bayttan tasarruf sağlar, aynı zamanda bir nedenden dolayı TIO'da çalışmaz.
Giuseppe

@Giuseppe Teşekkürler! Pryr :: f'yi kullanmaktan biraz kirli hissediyorum, çünkü kesinlikle ondan önce gelmesi gerekiyor, install.packages("pryr")ama belki de benim çok kıymetlim!
user2390246

function(s,n)intToUtf8(utf8ToInt(s)[-n])40 bayt için.
J.Doe

@ J.Doe iyi nokta! Bu çok farklı bir yaklaşım, bu yüzden bunu kendi cevabınız olarak göndermelisiniz.
user2390246

Başka bir alt 47, function(s,n)sub(sub(0,n,"(.{0})."),"\\1",s)44'tür.
J.Doe
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.