Видалити символ у вказаному індексі


33

(сильно натхненний Element рядка за вказаним індексом )

Дано рядок sі ціле число, що nпредставляє собою індекс у s, виведіть sз символом на n-му положенні вилучене.

Допускається 0-індексація та 1-індексація.

  • Для 0-індексування nбуде негативним та меншим за довжину s.
  • Для 1-індексації nбуде додатним та меншим або рівним довжині s.

sбуде складатися лише з символів для друку ASCII ( \x20-\x7Eабо  через ~).

Будь-який розумний вхід / вихід дозволяється. Застосовуються стандартні лазівки .

Тести (0-індексовано):

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

Чи можемо ми припустити, що char у цьому idx з’являється лише один раз?
програміст5000

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

К (Кона), 1 байт

_

Треба любити вбудовані. Індексація на основі 0. Використання:

k)"abcdef" _ 3
"abcef"

Надання абсолютно нового значення "використанню правильного інструменту для роботи".
MD XF

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

Я знайшов спосіб зробити це ще коротшою програмою. На жаль, у цьому полі для коментарів не вистачає місця для пояснення ;-)
Mawg

8

Haskell , 28 24 байт

-4 байти завдяки Лайконі, ця версія є 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

Математика, 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 в x86_64 Linux.

Спробуйте в Інтернеті .


2
У ABI на основі стеків, таких як x86, strcpyаргументи потрібно висунути в порядку справа наліво, що пояснює поведінку, але ви сказали, x86_64що використовуєте регістри, які використовують ... Можливо, компілятор вирішив пограти в гольф згенерований код і вирішив, що обчислення s + = n спочатку було гравцем!
Ніл

5
Мені подобається, коли на відповіді С йдеться: "У цього немає офіційних причин працювати, але все одно, так що ... так".
Квентін

О ні. Це вириває міну з води. Дуже вражає!
MD XF

1
@Quentin Це одна із цікавих речей щодо коду-гольфу - вам дозволяють - навіть заохочують - написати найжахливіший, небезпечний код, який, як правило, є злочинним злочином ;-)
Digital Trauma

Я хотів би дізнатися причину погіршення ...
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) явно викликається, і стек очищається ( x), щоб підготувати його до наступної ітерації.


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

2
@ETHproductions Якщо вам потрібне ім'я, я називаю їх мета-функціями , оскільки вони змінюють функції
Луїс Мендо,

@LuisMendo Я думаю, що формальною назвою були б оператори , а-ля математичні оператори (також функції вищого порядку).
Мего

4

Vim, 7 байт

jDk@"|x

Як це працює:

Він очікує двох ліній; один із рядком та один із числом.

  1. Перейдіть до другого рядка, скопіюйте номер в реєстр
  2. Перейдіть до першого рядка, а потім перейдіть до стовпця в реєстрі з @ "|
  3. Видаліть символ під курсором

Ще одне цікаве рішення, майже однакове,jD@"gox
DJMcMayhem

Позначення -> Закриття -> Дублікат codegolf.stackexchange.com/a/121581/61563 : P жартує, але вони надзвичайно схожі.
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замість StringBuilderкодегольфа. ;)
Кевін Крейссен

Ах приємна хитрість у буфері, я використав її у своїй відповіді :)
TheLethalCoder


4

Хаскелл , 15 байт

Для цього потрібен нещодавно випущений GHC 8.4.1 (або вище). Тепер <> , як функція на Semigroups, знаходиться в Prelude. Це особливо корисно для функції Semigroup

take<>drop.succ

Спробуйте в Інтернеті!
Оскільки tio використовує старіший bersion GHC, я імпортував <>у заголовок.


4

R, 40 байт

Просто ми показуємо різноманітність способів, жоден з яких не є особливо компактним, і ти можеш зіграти з рядками в Р.

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





3

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

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

Виходячи з цього . Вводиться за допомогою currying, перший - рядок, другий - індекс.

-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. У моїх очах, вам не потрібно повертати a 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-індексований

ТІО


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

@ ais523 В основному так. З документів: "До символів усередині рядків можна отримати доступ і змінити, вказавши нульове зміщення потрібного символу після рядка, використовуючи квадратні дужки масиву, як у $ str [42]. Подумайте про рядок як масив символів для цього мета ". php.net/manual/en/language.types.string.php
ME


2

R, 48 47 байт

(1 байт збережено за допомогою використання el() завдяки Джузеппе)

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")але, можливо, це я занадто дорогоцінний!
користувач2390246

function(s,n)intToUtf8(utf8ToInt(s)[-n])на 40 байт.
J.Doe

@ J.Doe гарне місце! Це зовсім інший підхід, тому ви повинні розмістити його як власну відповідь.
користувач2390246

Ще один суб-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.