Удалить символ по указанному индексу


33

(в значительной степени вдохновлен элементом строки по указанному индексу )

При наличии строки sи целого числа, nпредставляющего индекс in s, вывод sс nудаленным символом в -ой позиции.

0-индексация и 1-индексация разрешены.

  • Для индексации 0 nбудет неотрицательным и меньше, чем длина s.
  • Для 1-индексации nбудет положительным и меньше или равно длине s.

sбудет состоять только из печатных символов ASCII ( \x20-\x7Eили  сквозных ~).

Любой разумный ввод / вывод разрешен. Применяются стандартные лазейки .

Тестовые случаи (0-indexed):

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

Тестовые случаи (1-индексированные):

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

Это , поэтому выигрывает самый короткий ответ в байтах.


9
Никто не отвечает, C # побеждает ... слишком поздно :(
TheLethalCoder

Можем ли мы предположить, что символ в этом idx появляется только один раз?
programmer5000

1
@ programmer5000 Последний тестовый пример 3, 314151-> 31451. Я бы предположил, что нет.
TheLethalCoder

@ programmer5000 Нет. См. последний контрольный пример.
ETHproductions

2
Возможно, будет полезен список лидеров, здесь уже есть множество ответов для поиска.
Мистер Xcoder

Ответы:



13

Алиса , 13 12 байт

Спасибо Лео за сохранение 1 байта.

/oI\!e]&
@ q

Попробуйте онлайн!

Первая строка ввода - это строка, вторая строка - индекс на основе 0.

объяснение

/    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 байт

_

Должен любить встроенных. Индексирование на основе 0. Использование:

k)"abcdef" _ 3
"abcef"

Придание совершенно нового значения «использованию правильного инструмента для работы».
MD XF

1
Ха - ты хочешь увидеть подходящий инструмент для работы? codegolf.stackexchange.com/a/121700/49493
Саймон Мейджор

Я нашел способ сделать это с помощью еще более короткой программы. К сожалению, в этом поле для комментариев недостаточно места для объяснения ;-)
Мауг

8

Haskell , 28 24 байта

-4 байта благодаря Laikoni, эта версия 1-проиндексирована.

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

Старый ответ:

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

Простая рекурсивная функция, которая принимает значение, она 0-проиндексирована.

Мой первый раз игра в гольф, так что, возможно, это не оптимальное решение. Ну что ж.


2
Добро пожаловать в PPCG!
Мартин Эндер

1
Также вас может заинтересовать коллекция советов по игре в гольф на Хаскеле .
Лайкони

7

Mathematica, 18 байт

1-индексированных

#2~StringDrop~{#}&

вход

[1, "abcde"]

спасибо Мартин Эндер


4
На мой взгляд, «Любой разумный ввод / вывод разрешен» позволяет использовать ввод, как ["abcde", {1}]в этом случае StringDropтолько в этом случае . Что вы думаете? (Вы можете явно упомянуть, что он тоже 1-индексированный.) Я всегда рад видеть людей, публикующих ответы Mathematica :)
Грег Мартин



5

GCC c функцией, 25

Индексирование на основе 1.

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

Здесь много неопределенного поведения, так что следите за случайными велоцирапторами :

  • Страница strcpy()man говорит, что если копирование происходит между объектами, которые перекрываются, поведение не определено . Здесь явно есть совпадение строк src и dest , но, похоже, это работает, поэтому либо glibc более осторожен, либо мне повезло.
  • Ответ зависит от того, что s+=nпроисходит до s-1. Стандарт не дает таких гарантий и фактически называет это неопределенным поведением. Опять же, похоже, что он работает как требуется с компилятором gcc в Linux x86_64.

Попробуйте онлайн .


2
В основанном на стеке ABI, таком как x86, strcpyаргументы должны передаваться в порядке справа налево, что объясняет поведение, но вы сказали, что используете те, x86_64которые используют регистры ... возможно, компилятор решил поиграть сгенерировал код и решил, что сначала вычислить s + = n!
Нейл

5
Мне нравится, когда С отвечает: «У этого нет официальной причины работать, но это так или иначе, так что ... эх».
Квентин

Святое дерьмо. Это уносит мою из воды. Очень впечатляюще!
MD XF

1
@Quentin Это одна из забавных вещей в code-golf - вам разрешено - даже поощряется - писать самый ужасный, небезопасный код, который обычно был бы увольнением ;-)
Digital Trauma

Я хотел бы знать причину понижения ...
Цифровая травма

4

MATL , 3 байта

&)&

Использует индексирование на основе 1.

Попробуйте онлайн! Или проверьте все тестовые случаи .

объяснение

&    % 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пока не будет найден ввод. В конце каждой итерации XDявно вызывается функция display ( ), и стек очищается ( x), чтобы подготовить его к следующей итерации.


Мне нравится идея общих модификаторов команд, они могут быть полезны на других языках игры в гольф.
ETHproductions

2
@ETHproductions Если вам нужно имя, я называю их мета-функциями , так как они модифицируют функции
Луис Мендо

@ LuisMendo Я думаю, что формальным именем будут операторы , а именно математические операторы (или функции высшего порядка).
Mego

4

Vim, 7 байт

jDk@"|x

Как это работает:

Это ожидает две линии; один со строкой и один с номером.

  1. Перейти ко второй строке, скопировать номер в регистр
  2. Перейти к первой строке, а затем перейти к столбцу в регистре с помощью @ "|
  3. Удалить символ под курсором

Другое забавное решение, которое почти идентично,jD@"gox
DJMcMayhem

Пометка -> Закрытие -> Дубликат codegolf.stackexchange.com/a/121581/61563 : шучу, но они удивительно похожи.
MD XF

они есть! Есть ли приз за то, чтобы сначала получить до 7 символов? :-P
Jmriego

4

Java 8, 39 байт

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

Попробуй это здесь.

Java 7, 67 байт

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

Попробуй это здесь.


Предполагая, что это работает, «встроенный» для 46 байтов, s->n->new StringBuilder(s).deleteCharAt(n)+"";хотя это длиннее.
TheLethalCoder

@TheLethalCoder Это действительно работает. Но это действительно немного дольше. Да, и всегда используйте StringBufferвместо StringBuilderCodegolf. ;)
Кевин Круйссен

Ах, хороший трюк с буфером, я использовал его в своем ответе :)
TheLethalCoder


4

Haskell , 15 байт

Для этого требуется недавно выпущенный GHC 8.4.1 (или выше). В настоящее время <> , как функция на полугруппах, находится в Prelude. Это особенно полезно на функции полугруппы

take<>drop.succ

Попробуйте онлайн!
Поскольку tio использует более старую версию GHC, я импортировал <>в шапку .


4

R, 40 байт

Просто покажу множество способов, ни один из которых не особенно компактен, вы можете возиться со строками в R.

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





3

JS (ES6), 41 32 31 байт

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

На основании этого . Принимает ввод с помощью карри, первый - строка, второй - индекс.

-9 благодаря @JohanKarlsson

-1 благодаря @ETHproductions


3

Желе , 3 байта

Ṭœp

Полная программа, принимающая индекс (на основе 1) и строку (в указанном порядке) и печатающая результат.

Как двоичная функция возвращает список двух частей.

Фактически индекс может быть списком из n индексов, и в этом случае он возвращает список из n-1 частей.

Попробуйте онлайн! или посмотрите набор тестов .

Как?

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

В качестве примера использования нескольких индексов:

      "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-индексированный ввод в следующем формате:

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 байта!


3

Java 8, 45 41 байт

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

Сохранено 4 байта благодаря @ OlivierGrégoire

Мой первый ответ на кодовый гольф в чем-то отличном от C #, даже если он еще не самый короткий для Java.


1
1. Вам не нужен финал ;в лямбде (-1 байт). 2. На мой взгляд, вам не нужно возвращать String. Я думаю, что возврат StringBufferбез +""будет вполне допустимым (-3 байта). Пример? BigIntegerявляется представлением неограниченного int, в этом случае StringBuffer/ StringBuilderявляются представлениями изменяемого Strings.
Оливье Грегуар

@ OlivierGrégoire Спасибо :) Я никогда раньше не использовал Java, поэтому все улучшения приветствуются
TheLethalCoder





2

PHP, 41 байт, 35 байт без учета? Php

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

0 индексированные

TIO


Я на самом деле очень удивлен, что это работает; является [$argv[2]]индекс неявно создает диапазон? Кроме того, IIRC вы можете <?php отключить, потому что интерпретатор PHP имеет режим, который ему не нужен, и потому что мы обычно не наказываем за такого рода указание в файле того, что это за язык.

@ ais523 В основном да. Из документов: «Символы в строках могут быть доступны и изменены путем указания смещения нуля нужного символа после строки, используя квадратные скобки массива, как в $ str [42]. Думайте о строке как о массиве символов для этого цель." php.net/manual/en/language.types.string.php
ME


2

R, 48 47 байт

(1 байт сохранен за счет использования el() благодаря Giuseppe)

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

Разбейте строку на отдельные символы, удалите n и снова объедините.

Возможно, есть лучшее решение, strsplit () довольно громоздкий, так как возвращает список.


не будет работать на TIO: pryr::f([function body]) экономит несколько байт, а использование el(strsplit(s,""))сохраняет байт, но по какой-то причине не работает на TIO.
Джузеппе

@ Giuseppe Спасибо! Я чувствовал бы себя немного грязно, используя pryr :: f, потому что, конечно, ему должно предшествовать, install.packages("pryr")но, может быть, я слишком драгоценен!
user2390246

function(s,n)intToUtf8(utf8ToInt(s)[-n]) для 40 байтов.
J.Doe

@ J. Хорошее место! Это совсем другой подход, поэтому вы должны опубликовать его в качестве собственного ответа.
user2390246

Другой суб-47 является function(s,n)sub(sub(0,n,"(.{0})."),"\\1",s) для 44.
J.Doe
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.