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.


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:



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.


10

K (Kona), 1 byte

_

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

k)"abcdef" _ 3
"abcef"

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


7

Mathematica, 18 bytes

1 indexado

#2~StringDrop~{#}&

entrada

[1, "abcde"]

gracias Martin Ender


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

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 .


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.


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

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í.


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.


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])

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




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


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

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!


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.


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

JavaScript (ES6), 39 34 33 bytes

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



2

PHP, 41 bytes, 35 bytes excluyendo? Php

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

0 indexado

TIO


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.