Eliminar caracteres en el índice especificado

33

(fuertemente inspirado por el elemento de cadena en el índice especificado )

Dada una cadena sy un número entero que nrepresenta un índice en s, salida scon el carácter en la nposición -th eliminada.

La indexación 0 y la indexación 1 están permitidas.

  • Para la indexación 0, nserá no negativa y menor que la longitud de s.
  • Para la indexación 1, nserá positiva y menor o igual que la longitud de s.

sconsistirá solo en caracteres ASCII imprimibles ( \x20-\x7Eo  completos ~).

Se permite cualquier entrada / salida razonable. Se aplican lagunas estándar .

Casos de prueba (indexados 0):

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

Casos de prueba (1 indexado):

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

Este es el , por lo que la respuesta más corta en bytes gana.

ETHproducciones
fuente
9
Nadie más responde, C # está ganando ... demasiado tarde :(
TheLethalCoder
¿Podemos suponer que el carácter en ese idx aparece solo una vez?
programador
1
@ programmer5000 Último caso de prueba 3, 314151-> 31451. Supongo que no.
TheLethalCoder
@ programmer5000 No. Vea el último caso de prueba.
ETHproductions
2
Tal vez una tabla de clasificación sería útil, ya hay muchas respuestas para buscar.
Sr. Xcoder

Respuestas:

23

C #, 20 19 bytes

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

Alice , 13 12 bytes

Gracias a Leo por guardar 1 byte.

/oI\!e]&
@ q

Pruébalo en línea!

La primera línea de la entrada es la cadena, la segunda línea es el índice basado en 0.

Explicación

/    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
fuente
10

K (Kona), 1 byte

_

Tengo que amar los builtins. Indexación basada en 0. Uso:

k)"abcdef" _ 3
"abcef"
Simon Major
fuente
Dando un significado completamente nuevo a 'usar la herramienta adecuada para el trabajo'.
MD XF
1
Ja, ¿quieres ver la herramienta adecuada para el trabajo? codegolf.stackexchange.com/a/121700/49493
Simon Major
He descubierto una manera de hacer esto con un programa aún más corto. Desafortunadamente, no hay suficiente espacio en este cuadro de comentarios para explicar ;-)
Mawg
8

Haskell , 28 24 bytes

-4 bytes gracias a Laikoni, esta versión está indexada 1.

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

Vieja respuesta:

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

Una función recursiva simple que toma el valor, está indexada a 0.

Mi primer código de golf, así que tal vez no sea la solución óptima. Oh bien.

El sargento Escondido
fuente
2
Bienvenido a PPCG!
Martin Ender
1
También te puede interesar la recopilación de consejos para jugar al golf en Haskell .
Laikoni
7

Mathematica, 18 bytes

1 indexado

#2~StringDrop~{#}&

entrada

[1, "abcde"]

gracias Martin Ender

J42161217
fuente
44
En mi opinión, "Se permite cualquier entrada / salida razonable" permite que la entrada se tome como ["abcde", {1}], en cuyo caso StringDropsolo el truco es el truco. ¿Qué piensas? (Es posible que desee mencionar explícitamente que también está indexado en 1). Siempre estoy feliz de ver a las personas que publican respuestas de Mathematica :)
Greg Martin
5

CJam , 4 bytes

q~Lt

Pruébalo en línea!

Explicación

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.
Gato de negocios
fuente
5

Función GCC c, 25

Indexación basada en 1.

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

Un montón de comportamiento indefinido aquí, así que ten cuidado con los velociraptores extraviados :

  • La strcpy()página de manual dice que si la copia se realiza entre objetos que se superponen, el comportamiento es indefinido . Aquí claramente hay una superposición de las cadenas src y dest , pero parece funcionar, por lo que glibc es más cuidadoso o tuve suerte.
  • La respuesta depende del hecho de que s+=nsucede antes del s-1. El estándar no ofrece tales garantías, y de hecho lo llama comportamiento indefinido. Nuevamente, parece funcionar como se requiere con el compilador gcc en x86_64 Linux.

Pruébalo en línea .

Trauma digital
fuente
2
En un ABI basado en pila, como x86, strcpylos argumentos deben ser empujados en orden de derecha a izquierda, lo que explicaría el comportamiento, pero usted dijo que estaba usando los x86_64registros que usan ... tal vez el compilador decidió jugar golf ¡El código generado y decidió que calcular s + = n primero era más golfista!
Neil
55
Me encanta cuando las respuestas de C dicen "esto no tiene una razón oficial para funcionar, pero lo hace de todos modos, así que ... eh".
Quentin
Santo cielo. Esto saca a la mía del agua. ¡Muy impresionante!
MD XF
1
@Quentin Esa es una de las cosas divertidas de code-golf : se le permite, incluso se le recomienda, escribir el código más horrible e inseguro que normalmente sería un delito de disparo ;-)
Digital Trauma
Me encantaría saber el motivo del voto negativo ...
Digital Trauma
4

MATL , 3 bytes

&)&

Utiliza indexación basada en 1.

Pruébalo en línea! O verificar todos los casos de prueba .

Explicación

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

En la versión modificada con todos los casos de prueba, el código está dentro de un bucle infinito `...Thasta que no se encuentra ninguna entrada. Al final de cada iteración, la función de visualización ( XD) se llama explícitamente y la pila se borra ( x) para prepararla para la siguiente iteración.

Luis Mendo
fuente
Me gusta la idea de los modificadores de comando genéricos, pueden ser útiles en otros lenguajes de golf.
ETHproductions
2
@ETHproductions Si necesita un nombre, les llaman meta-funciones , ya que modifican las funciones
Luis Mendo
@LuisMendo Creo que el nombre formal sería operadores , operadores matemáticos (también conocidos como funciones de orden superior).
Mego
4

Vim, 7 bytes

jDk@"|x

Cómo funciona:

Espera dos líneas; uno con la cuerda y otro con el número.

  1. Vaya a la línea dos, copie el número en el registro
  2. Vaya a la primera línea y luego vaya a la columna en el registro con @ "|
  3. Eliminar el caracter debajo del cursor
jmriego
fuente
Otra solución divertida que es casi idéntica esjD@"gox
DJMcMayhem
Marcado -> Cierre -> Duplicado de codegolf.stackexchange.com/a/121581/61563 : P broma, pero son notablemente similares.
MD XF
¡son! ¿Hay algún premio por bajar a 7 caracteres primero? :-P
jmriego
4

Java 8, 39 bytes

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

Pruébalo aquí.

Java 7, 67 bytes

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

Pruébalo aquí.

Kevin Cruijssen
fuente
Suponiendo que funciona, un "incorporado" para 46 bytes, s->n->new StringBuilder(s).deleteCharAt(n)+"";aunque es más largo.
TheLethalCoder
@TheLethalCoder De hecho funciona. Pero de hecho es un poco más largo. Ah, y siempre use en StringBufferlugar de StringBuilderen codegolf. ;)
Kevin Cruijssen
Ah, buen truco en el búfer, lo usé en mi respuesta :)
TheLethalCoder
4

Haskell , 15 bytes

Esto requiere el GHC 8.4.1 recientemente lanzado (o superior). Ahora <> , como una función en Semigroups, está en Prelude. Es particularmente útil en la función Semigroup

take<>drop.succ

Pruébalo en línea!
Como tio está utilizando una versión anterior de GHC, he importado<> en el encabezado.

H.PWiz
fuente
4

R, 40 bytes

Solo muestra la variedad de formas, ninguna de las cuales es particularmente compacta, puede jugar con cuerdas en R.

function(s,n)intToUtf8(utf8ToInt(s)[-n])
J.Doe
fuente
3

05AB1E , 5 bytes

ā²ÊÏJ

Pruébalo en línea!

ā     # 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
fuente
3

05AB1E , 6 bytes

vNÊiy?

Pruébalo en línea!

Explicación

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

JS (ES6), 41 32 31 bytes

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

Basado en esto . Toma entrada a través del curry, primero es una cadena, segundo es el índice.

-9 gracias a @JohanKarlsson

-1 gracias a @ETHproductions

programador 5000
fuente
3

Jalea , 3 bytes

Ṭœp

Un programa completo que toma el índice (basado en 1) y la cadena (en ese orden) e imprime el resultado.

Como función diádica, devuelve una lista de las dos partes.

De hecho, el índice puede ser una lista de n índices, en cuyo caso devuelve una lista de las partes n-1 .

Pruébalo en línea! o ver un conjunto de pruebas .

¿Cómo?

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

Como ejemplo de uso de múltiples índices:

      "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
fuente
3

vim, 10 7

DgJ@"|x

Toma una entrada indexada en el siguiente 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

¡Gracias a @DJMcMayhem por 3 bytes!

Pomo de la puerta
fuente
3

Java 8, 45 41 bytes

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

Guardado 4 bytes gracias a @ OlivierGrégoire

Mi primer código de respuesta de golf en algo diferente a C #, incluso si aún no es el más corto para Java.

TheLethalCoder
fuente
1
1. No necesita el final ;en lambda (-1 bytes). 2. En mis ojos, no necesitas regresar a String. Creo que devolver el StringBuffersin el +""sería perfectamente válido (-3 bytes). ¿Ejemplo? BigIntegeres una representación de un ilimitado int, en este caso StringBuffer/ StringBuilderson representaciones de Strings mutable .
Olivier Grégoire
@ OlivierGrégoire Gracias :) Nunca he usado Java antes, así que todas las mejoras son bienvenidas
TheLethalCoder
2

Python 3 , 24 bytes

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

Pruébalo en línea!

Monja permeable
fuente
¡Maldita sea me ganaste!
Notts90
1
Creo que esto también es válido para Python 2
Dead Possum
2

JavaScript (ES6), 39 34 33 bytes

n=>s=>s.replace(/./g,c=>n--?c:"")
  • 5 6 bytes guardados gracias a Arnauld .
Lanudo
fuente
2

brainfuck , 14 bytes

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

Pruébalo en línea!

Lee el índice de un byte basado en cero seguido inmediatamente por la cadena.

eush77
fuente
Aw, me ganaste: / Tenía exactamente la misma solución. +1
daniero
2

Befunge-98 , 35 27 25 bytes

-4 bytes gracias a @ eush77

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

Pruébalo en línea!

1 indexado, tenga en cuenta que la entrada tiene un byte nulo final.

ovs
fuente
2

PHP, 41 bytes, 35 bytes excluyendo? Php

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

0 indexado

TIO

YO
fuente
De hecho, estoy realmente sorprendido de que esto funcione; ¿El [$argv[2]]índice está creando implícitamente un rango? Además, IIRC puede dejarlo <?php apagado, porque el intérprete PHP tiene un modo que no lo necesita, y porque normalmente no penalizamos por ese tipo de indicación en un archivo de cuál es el lenguaje.
@ ais523 Básicamente sí. Desde documentos: "Se puede acceder y modificar los caracteres dentro de las cadenas especificando el desplazamiento basado en cero del carácter deseado después de la cadena usando corchetes cuadrados, como en $ str [42]. Piense en una cadena como una matriz de caracteres para esto propósito." php.net/manual/en/language.types.string.php
ME
2

R, 48 47 bytes

(1 byte guardado gracias al uso de el()Giuseppe)

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

Divida la cadena en sus caracteres individuales, elimine la enésima y luego concatene nuevamente.

Puede haber una mejor solución, strsplit () es bastante difícil de manejar ya que devuelve una lista.

usuario2390246
fuente
no funcionará en TIO: pryr::f([function body])guarda algunos bytes y el uso el(strsplit(s,""))guarda un byte, pero también no funciona en TIO por alguna razón.
Giuseppe
@Giuseppe Gracias! Me sentiría un poco sucio haciendo uso de pryr :: f, ya que seguramente debería ir precedido, ¡ install.packages("pryr")pero tal vez ese sea yo demasiado preciado!
user2390246
function(s,n)intToUtf8(utf8ToInt(s)[-n])por 40 bytes.
J.Doe
@ J.Doe buen lugar! Ese es un enfoque muy diferente, por lo que debe publicarlo como su propia respuesta.
usuario2390246
Otro sub-47 es function(s,n)sub(sub(0,n,"(.{0})."),"\\1",s)para 44.
J.Doe