Remover caractere no índice especificado


33

(fortemente inspirado no elemento String no índice especificado )

Dada uma sequência se um número inteiro nrepresentando um índice s, imprima scom o caractere na n-ésima posição removida.

A indexação 0 e a indexação 1 são permitidas.

  • Para a indexação 0, nserá não negativo e menor que o comprimento de s.
  • Para a indexação 1, nserá positivo e menor ou igual ao comprimento de s.

sconsistirá apenas em caracteres ASCII imprimíveis ( \x20-\x7Eou  completos ~).

Qualquer entrada / saída razoável é permitida. Aplicam-se brechas padrão .

Casos de teste (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 teste (indexados 1):

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

Isso é , então a resposta mais curta em bytes vence.


9
Há uma resposta mais, C # está ganhando ... muito tarde :(
TheLethalCoder

Podemos assumir que o caractere nesse idx aparece apenas uma vez?
Programmer5000

1
@ programmer5000 Último caso de teste 3, 314151-> 31451. Eu diria que não.
TheLethalCoder

@ programmer5000 Não. Veja o último caso de teste.
ETHproductions

2
Talvez uma tabela de classificação seja útil, já existem muitas respostas para pesquisar.
Sr. Xcoder

Respostas:



13

Alice , 13 12 bytes

Agradecemos a Leo por economizar 1 byte.

/oI\!e]&
@ q

Experimente online!

A primeira linha da entrada é a sequência, a segunda linha é o índice baseado em 0.

Explicação

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



8

Haskell , 28 24 bytes

-4 bytes graças a Laikoni, esta versão é 1 indexada.

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

Resposta antiga:

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

Uma função recursiva simples que aceita o valor, é indexada em 0.

Minha primeira vez em código de golfe, então talvez não seja a solução ideal. Ah bem.


2
Bem-vindo ao PPCG!
Martin Ender

1
Além disso, você pode estar interessado na coleção de dicas para jogar golfe em Haskell .
Laikoni 19/05

7

Mathematica, 18 bytes

Indexado 1

#2~StringDrop~{#}&

entrada

[1, "abcde"]

obrigado Martin Ender


4
Na minha opinião, "qualquer entrada / saída razoável é permitida" permite que a entrada seja tomada como ["abcde", {1}]StringDrop aceita , nesse caso, por si só, o truque. O que você acha? (Você pode querer mencionar explicitamente que é 1-indexados também.) Eu sempre fico feliz de ver as pessoas a postar respostas Mathematica :)
Greg Martin



5

Função GCC c, 25

Indexação baseada em 1.

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

Muito comportamento indefinido aqui, então cuidado com os velociraptores dispersos :

  • A strcpy()página do manual diz que, se a cópia ocorrer entre objetos que se sobrepõem, o comportamento é indefinido . Aqui há claramente sobreposição do src e dest seqüências , mas parece funcionar, então o glibc é mais cuidadoso ou tive sorte.
  • A resposta depende do fato de que isso s+=nacontece antes da s-1. O padrão não oferece tais garantias e, de fato, chama isso de comportamento indefinido. Novamente, parece funcionar conforme necessário com o compilador gcc no x86_64 Linux.

Experimente online .


2
Em uma ABI baseada em pilha, como x86, strcpyos argumentos precisam ser empurrados na ordem da direita para a esquerda, o que explicaria o comportamento, mas você disse que estava usando o x86_64que usa registradores ... talvez o compilador tenha decidido jogar golfe o código gerado e decidiu que computar s + = n primeiro era mais golfista!
194 Neil

5
Adoro quando as respostas C dizem "isso não tem motivo oficial para funcionar, mas funciona mesmo assim, então ... eh".
Quentin

Caralho. Isso sopra o meu fora da água. Muito impressionante!
MD XF

1
@Quentin Isso é uma das coisas divertidas sobre código-golfe - você é permitido - incentivou mesmo - para escrever a mais terrível, código inseguro que, normalmente, seria uma ofensa disparo ;-)
Trauma Digital

Eu adoraria saber o motivo da downvote ...
Digital Trauma

4

MATL , 3 bytes

&)&

Usa indexação baseada em 1.

Experimente online! Ou verifique todos os casos de teste .

Explicação

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

Na versão modificada com todos os casos de teste, o código fica dentro de um loop infinito `...Taté que nenhuma entrada seja encontrada. No final de cada iteração, a função display ( XD) é explicitamente chamada e a pilha é limpa ( x) para prepará-la para a próxima iteração.


Eu gosto da idéia de modificadores de comando genéricos, eles podem ser úteis em outras linguagens de golfe.
ETHproductions

2
@ETHproductions Se você precisa de um nome, eu chamá-los de meta-funções , como eles modificar funções
Luis Mendo

@LuisMendo Acho que o nome formal seria operadores , como operadores matemáticos (também conhecidos como funções de ordem superior).
Mego

4

Vim, 7 bytes

jDk@"|x

Como funciona:

Ele espera duas linhas; um com a corda e outro com o número.

  1. Vá para a linha dois, copie o número no registro
  2. Vá para a primeira linha e depois vá para a coluna no registro com @ "|
  3. Exclua o caractere sob o cursor

Outra solução divertida que é quase idêntica éjD@"gox
DJMcMayhem

Sinalização -> Fechamento -> Duplicado de codegolf.stackexchange.com/a/121581/61563 : P brincando, mas são notavelmente semelhantes.
MD XF

eles são! Existe algum prêmio por descer até 7 caracteres primeiro? :-P
jmriego 22/05

4

Java 8, 39 bytes

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

Experimente aqui.

Java 7, 67 bytes

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

Experimente aqui.


Supondo que funcione, um "interno" para 46 bytes s->n->new StringBuilder(s).deleteCharAt(n)+"";é mais longo.
TheLethalCoder

@TheLethalCoder Realmente funciona. Mas é realmente um pouco mais longo. Ah, e sempre use em StringBuffervez de StringBuilderno codegolf. ;)
Kevin Cruijssen

Truque ah bom no buffer eu usei isso na minha resposta :)
TheLethalCoder


4

Haskell , 15 bytes

Isso requer o GHC 8.4.1 lançado recentemente (ou superior). Agora <> , como uma função nos Semigrupos, está no Prelúdio. É particularmente útil na função Semigroup

take<>drop.succ

Experimente online!
Como o tio está usando uma versão mais antiga do GHC, importei <>no cabeçalho.


4

R, 40 bytes

Apenas mostra as várias maneiras, nenhuma das quais particularmente compacta, você pode mexer nas cordas em R.

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

3

05AB1E , 5 bytes

ā²ÊÏJ

Experimente 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 bytes

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

Com base nisso . Toma entrada através de currying, primeiro é string, segundo é índice.

-9 graças a @JohanKarlsson

-1 graças a @ETHproductions


3

Geléia , 3 bytes

Ṭœp

Um programa completo que pega o índice (com base em 1) e a sequência (nessa ordem) e imprime o resultado.

Como uma função diádica, ele retorna uma lista das duas partes.

De fato, o índice pode ser uma lista de n índices; nesse caso, ele retorna uma lista das n-1 partes.

Experimente online! ou consulte uma suíte de testes .

Quão?

Ṭœ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 um exemplo do uso de vários í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

Recebe entrada indexada em 1 no seguinte 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

Obrigado a @DJMcMayhem por 3 bytes!


3

Java 8, 45 41 bytes

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

Guardado 4 bytes graças a @ OlivierGrégoire

Meu primeiro código de golfe responde em algo diferente de C #, mesmo que ainda não seja o mais curto para Java.


1
1. Você não precisa da final ;em lambda (-1 bytes). 2. Aos meus olhos, você não precisa retornar a String. Eu acho que retornar o StringBuffersem o +""seria perfeitamente válido (-3 bytes). Exemplo? BigIntegeré uma representação de um ilimitado int, neste caso StringBuffer/ StringBuildersão representações de Strings mutáveis .
Olivier Grégoire

@ OlivierGrégoire Thanks :) Eu nunca realmente usou Java antes, então todas as melhorias são bem-vindos
TheLethalCoder


2

JavaScript (ES6), 39 34 33 bytes

n=>s=>s.replace(/./g,c=>n--?c:"")
  • 5 6 bytes salvos graças a Arnauld .



2

PHP, 41 bytes, 35 bytes excluindo? Php

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

Indexado a 0

TIO


Estou realmente surpreso que isso funcione; o [$argv[2]]índice está criando implicitamente um intervalo? Além disso, você pode deixar o IIRC <?php desativado, porque o intérprete PHP tem um modo que não precisa dele e porque normalmente não penalizamos esse tipo de indicação em um arquivo de qual é o idioma.

@ ais523 Basicamente sim. From docs: "Caracteres dentro de strings podem ser acessados ​​e modificados especificando o deslocamento baseado em zero do caractere desejado após a string usando colchetes de matriz quadrada, como em $ str [42]. Pense em uma string como uma matriz de caracteres para isso. finalidade ". php.net/manual/en/language.types.string.php
ME


2

R, 48 47 bytes

(1 byte economizado com o uso de el()graças a Giuseppe)

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

Divida a string em seus caracteres individuais, remova a enésima e concatene novamente.

Pode muito bem haver uma solução melhor, strsplit () é bastante complicado, pois retorna uma lista.


não funcionará no TIO: pryr::f([function body])salva alguns bytes e o uso el(strsplit(s,""))salva um byte, mas também não funciona no TIO por algum motivo.
Giuseppe

@Giuseppe Thanks! Eu me sentiria um pouco sujo ao usar pryr :: f, pois certamente deveria ser precedido por, install.packages("pryr")mas talvez seja eu que sou preciosa demais!
User2390246

function(s,n)intToUtf8(utf8ToInt(s)[-n])por 40 bytes.
precisa saber é

@ J.Doe bom local! Essa é uma abordagem muito diferente, então você deve publicá-la como sua própria resposta.
User2390246

Outro sub-47 é function(s,n)sub(sub(0,n,"(.{0})."),"\\1",s)para 44.
J.Doe 05/10
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.