Rimuovi carattere all'indice specificato


33

(fortemente ispirato all'elemento stringa nell'indice specificato )

Data una stringa se un numero intero che nrappresenta un indice in s, l'output viene rimosso scon il carattere nella nposizione -th.

0-indicizzazione e 1-indicizzazione sono consentiti.

  • Per l'indicizzazione 0, nsarà non negativo e inferiore alla lunghezza dis .
  • Per 1-indicizzazione, nsarà positivo e minore o uguale alla lunghezza di s.

ssarà composto solo da caratteri ASCII stampabili ( \x20-\x7Eo  tramite~ ).

È consentito qualsiasi input / output ragionevole. Scappatoie standard applicano .

Testcase (indicizzati 0):

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

Test (1-indicizzato):

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

Questo è , quindi vince la risposta più breve in byte.


9
Nessun altro risponde, C # sta vincendo ... troppo tardi :(
TheLethalCoder

Possiamo supporre che il carattere di quell'idx appaia una sola volta?
programmatore

1
@ programmer5000 Ultimo caso di test 3, 314151-> 31451. Suppongo di no.
TheLethalCoder

@ programmer5000 No. Vedere l'ultimo caso di test.
ETHproductions

2
Forse una classifica sarebbe utile, ci sono già molte risposte da cercare.
Mr. Xcoder,

Risposte:



13

Alice , 13 12 byte

Grazie a Leo per aver salvato 1 byte.

/oI\!e]&
@ q

Provalo online!

La prima riga dell'input è la stringa, la seconda riga è l'indice in base 0.

Spiegazione

/    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

_

Devi amare i builtin. Indicizzazione basata su 0. Uso:

k)"abcdef" _ 3
"abcef"

Dare un significato completamente nuovo a "usare lo strumento giusto per il lavoro".
MD XF,

1
Ah - vuoi vedere lo strumento giusto per il lavoro? codegolf.stackexchange.com/a/121700/49493
Simon Major,

Ho scoperto un modo per farlo con un programma ancora più breve. Sfortunatamente, non c'è abbastanza spazio in questa casella di commento per spiegare ;-)
Mawg

8

Haskell , 28 anni 24 byte

-4 byte grazie a Laikoni, questa versione è 1-indicizzata.

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

Vecchia risposta:

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

Una semplice funzione ricorsiva che accetta il valore, è indicizzata a 0.

Il mio primo gioco di golf a codice quindi forse non è la soluzione ottimale. Oh bene.


2
Benvenuti in PPCG!
Martin Ender,

1
Inoltre potresti essere interessato alla raccolta di suggerimenti per il golf a Haskell .
Laikoni,

7

Mathematica, 18 byte

1-indicizzato

#2~StringDrop~{#}&

ingresso

[1, "abcde"]

grazie Martin Ender


4
A mio avviso, "Qualsiasi input / output ragionevole è consentito" consente di prendere l'input come ["abcde", {1}], nel qual caso StringDropda solo fa il trucco. Cosa pensi? (Potresti voler menzionare esplicitamente che è anche un indice 1). Sono sempre felice di vedere le persone che postano risposte a Mathematica :)
Greg Martin,


5

CJam , 4 byte

q~Lt

Provalo online!

Spiegazione

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

Funzione GCC c, 25

Indicizzazione basata su 1.

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

Un sacco di comportamenti indefiniti qui, quindi fai attenzione ai velociraptor vaganti :

  • La strcpy()pagina man dice Se la copia avviene tra oggetti che si sovrappongono, il comportamento non è definito . Qui c'è chiaramente la sovrapposizione delle stringhe src e dest , ma sembra funzionare, quindi o glibc è più attento o sono stato fortunato.
  • La risposta dipende dal fatto che ciò s+=naccade prima del s-1. Lo standard non fornisce tali garanzie e, in effetti, lo definisce un comportamento indefinito. Ancora una volta, sembra funzionare come richiesto con il compilatore gcc su x86_64 Linux.

Provalo online .


2
In un ABI basato su stack, come x86, strcpygli argomenti devono essere spinti nell'ordine da destra a sinistra, il che spiegherebbe il comportamento, ma hai detto che stavi usando x86_64quale registro utilizza ... forse il compilatore ha deciso di giocare a golf il codice generato e ha deciso che calcolare prima s + = n era più golfista!
Neil,

5
Adoro quando le risposte di C vanno "questo non ha un motivo ufficiale per funzionare, ma lo fa comunque, quindi ... eh."
Quentin,

Merda santa. Questo fa esplodere il mio dall'acqua. Molto impressionante!
MD XF,

1
@Quentin Questa è una delle cose divertenti del code-golf - ti è permesso - anche incoraggiato - a scrivere il codice più terribile e pericoloso che normalmente sarebbe un reato ;-)
Digital Trauma

Mi piacerebbe sapere il motivo del downvote ...
Digital Trauma,

4

MATL , 3 byte

&)&

Utilizza l'indicizzazione basata su 1.

Provalo online! Oppure verifica tutti i casi di test .

Spiegazione

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

Nella versione modificata con tutti i casi di test, il codice è all'interno di un ciclo infinito `...Tfino a quando non viene trovato alcun input. Alla fine di ogni iterazione XDviene esplicitamente chiamata la funzione display ( ) e lo stack viene cancellato ( x) per prepararlo alla successiva iterazione.


Mi piace l'idea di modificatori di comandi generici, potrebbero essere utili in altri linguaggi del golf.
ETHproductions

2
@ETHproductions Se hai bisogno di un nome, li chiamo meta-funzioni , poiché modificano le funzioni
Luis Mendo,

@LuisMendo Penso che il nome formale sarebbe operator , a la operatori matematici (aka funzioni di ordine superiore).
Mego

4

Vim, 7 byte

jDk@"|x

Come funziona:

Si aspetta due righe; uno con la stringa e uno con il numero.

  1. Vai alla riga due, copia il numero nel registro
  2. Vai alla prima riga e poi vai alla colonna nel registro con @ "|
  3. Elimina il carattere sotto il cursore

Un'altra soluzione divertente che è quasi identica èjD@"gox
DJMcMayhem

Contrassegnare -> Chiusura -> Duplica di codegolf.stackexchange.com/a/121581/61563 : scherzando, ma sono notevolmente simili.
MD XF,

loro sono! C'è un premio per ottenere prima i 7 caratteri? :-P
jmriego,

4

Java 8, 39 byte

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

Provalo qui.

Java 7, 67 byte

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

Provalo qui.


Supponendo che funzioni, un "built-in" per 46 byte s->n->new StringBuilder(s).deleteCharAt(n)+"";anche se è più lungo.
TheLethalCoder

@TheLethalCoder Funziona davvero. Ma è davvero un po 'più lungo. Oh, e usa sempre StringBufferanziché StringBuilderin codegolf. ;)
Kevin Cruijssen,

Ah, un bel trucco sul buffer l'ho usato nella mia risposta :)
TheLethalCoder


4

Haskell , 15 byte

Ciò richiede il GHC 8.4.1 (o successivo) rilasciato di recente. Ora <> , in funzione dei semigruppi, è in Preludio. È particolarmente utile sulla funzione Semigruppo

take<>drop.succ

Provalo online!
Poiché tio sta utilizzando una versione precedente di GHC, ho importato <>nell'intestazione.


4

R, 40 byte

Va solo a mostrare la varietà di modi, nessuno dei quali particolarmente compatto, puoi armeggiare con le corde in R.

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

3

05AB1E , 5 byte

ā²ÊÏJ

Provalo 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




3

JS (ES6), 41 32 31 byte

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

Sulla base di questo . Accetta input tramite curry, il primo è stringa, il secondo è indice.

-9 grazie a @JohanKarlsson

-1 grazie a @ETHproductions


3

Gelatina , 3 byte

Ṭœp

Un programma completo che prende l'indice (basato su 1) e la stringa (in quell'ordine) e stampa il risultato.

Come funzione diadica restituisce un elenco delle due parti.

In effetti l'indice può essere un elenco di n indici, nel qual caso restituisce un elenco delle parti n-1 .

Provalo online! o vedere una suite di test .

Come?

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

Come esempio di utilizzo di più indici:

      "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

Accetta 1 input indicizzato nel seguente formato:

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

Grazie a @DJMcMayhem per 3 byte!


3

Java 8, 45 41 byte

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

Salvato 4 byte grazie a @ OlivierGrégoire

Il mio primo codice golf risponde in qualcosa di diverso da C #, anche se non è ancora il più breve per Java.


1
1. Non è necessario il finale ;in lambda (-1 byte). 2. Ai miei occhi, non è necessario restituire a String. Penso che restituire il StringBuffersenza il +""sarebbe perfettamente valido (-3 byte). Esempio? BigIntegerè una rappresentazione di un illimitato int, in questo caso StringBuffer/ StringBuildersono rappresentazioni di Strings mutabili .
Olivier Grégoire,

@ OlivierGrégoire Grazie :) Non ho mai usato Java prima, quindi tutti i miglioramenti sono benvenuti
TheLethalCoder


2

JavaScript (ES6), 39 34 33 byte

n=>s=>s.replace(/./g,c=>n--?c:"")
  • 5 6 byte salvati grazie ad Arnauld .



2

PHP, 41 byte, 35 byte escluso? Php

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

0-indicizzato

TIO


Sono davvero sorpreso che funzioni; l' [$argv[2]]indice sta implicitamente creando un intervallo? Inoltre, IIRC puoi lasciarlo <?php spento, perché l'interprete PHP ha una modalità che non ne ha bisogno e perché normalmente non penalizziamo per quel tipo di indicazione in un file di quale sia la lingua.

@ ais523 Fondamentalmente sì. Dai documenti: "È possibile accedere e modificare i caratteri all'interno delle stringhe specificando l'offset in base zero del carattere desiderato dopo la stringa utilizzando parentesi quadre, come in $ str [42]. Pensa a una stringa come a una matrice di caratteri per questo scopo." php.net/manual/en/language.types.string.php
ME


2

R, 48 47 byte

(1 byte salvato grazie all'uso di el()grazie a Giuseppe)

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

Dividi la stringa nei suoi singoli caratteri, rimuovi l'ennesimo e poi concatena nuovamente.

Potrebbe esserci una soluzione migliore, strsplit () è piuttosto ingombrante in quanto restituisce un elenco.


non funzionerà su TIO: pryr::f([function body])salva alcuni byte e l'utilizzo el(strsplit(s,""))salva un byte, ma per qualche motivo non funziona su TIO.
Giuseppe,

@Giuseppe Grazie! Mi sentirei un po 'sporco facendo uso di pryr :: f poiché sicuramente dovrebbe essere preceduto da install.packages("pryr")ma forse sono io che sono troppo prezioso!
user2390246

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

@ J.Doe buon posto! Questo è un approccio molto diverso, quindi dovresti pubblicarlo come risposta personale.
user2390246

Un altro sub-47 è function(s,n)sub(sub(0,n,"(.{0})."),"\\1",s)per 44.
J.Doe
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.