Исчезающие элементы


17

Для заданной строки Sи списка индексов Xизмените S, удалив элемент в каждом индексе S, используя этот результат в качестве нового значения S.

Например, учитывая S = 'codegolf'и X = [1, 4, 4, 0, 2],

0 1 2 3 4 5 6 7  |
c o d e g o l f  |  Remove 1
c d e g o l f    |  Remove 4
c d e g l f      |  Remove 4
c d e g f        |  Remove 0
d e g f          |  Remove 2
d e f

Ваша задача - выполнить этот процесс, собирать значения Sпосле каждой операции и отображать каждое в новой строке по порядку. Окончательный ответ будет

S = 'codegolf'
X = [1, 4, 4, 0, 2]

Answer:

codegolf
cdegolf
cdeglf
cdegf
degf
def
  • Это поэтому сделайте ваш код как можно короче.
  • Вы можете предположить, что значения in Xвсегда являются действительными индексами S, и вы можете использовать индексирование на основе 0 или 1.
  • Строка будет содержать только [A-Za-z0-9]
  • Либо Sили xможет быть пустым. Если Sпусто, значит, оно xтакже должно быть пустым.
  • Вы также можете использовать Sв качестве списка символов вместо строки.
  • Вы можете распечатать вывод или вернуть список строк. Начальные и конечные пробелы приемлемы. Любая форма вывода хороша, если она легко читаема.

Тестовые случаи

S = 'abc', x = [0]
'abc'
'bc'

S = 'abc', x = []
'abc'

S = 'abc', x = [2, 0, 0]
'abc'
'ab'
'b'
''

S = '', x = []
''

S = 'codegolfing', x = [10, 9, 8, 3, 2, 1, 0]
'codegolfing'
'codegolfin'
'codegolfi'
'codegolf'
'codgolf'
'cogolf'
'cgolf'
'golf'
code-golf  string  array-manipulation  code-golf  string  ascii-art  code-golf  number  sequence  pi  code-golf  number  array-manipulation  code-golf  string  ascii-art  code-golf  math  number  game  code-golf  math  sequence  polynomials  recursion  code-golf  math  number  sequence  number-theory  code-golf  permutations  balanced-string  code-golf  string  ascii-art  integer  code-golf  decision-problem  hexagonal-grid  code-golf  ascii-art  kolmogorov-complexity  code-golf  number  code-golf  matrix  binary-matrix  code-golf  math  statistics  code-golf  string  polyglot  code-golf  random  lost  code-golf  date  path-finding  code-golf  string  code-golf  math  number  arithmetic  number-theory  code-golf  tetris  binary-matrix  code-golf  array-manipulation  sorting  code-golf  number  code-golf  array-manipulation  rubiks-cube  cubically  code-golf  grid  optimization  code-golf  math  function  code-golf  string  quine  code-golf  ascii-art  grid  code-golf  decision-problem  grid  simulation  code-golf  math  sequence  code-golf  path-finding  code-golf  ascii-art  grid  simulation  code-golf  number  whitespace  code-golf  sequence  code-golf  sequence  code-golf  sequence  integer  code-golf  math  game  code-golf  internet  stack-exchange-api  code-golf  sequence  code-golf  internet  stack-exchange-api  code-golf  math  factoring  code-challenge  sequence  polyglot  rosetta-stone  code-golf  string  browser  code-golf  date  code-golf  base-conversion  code-challenge  cops-and-robbers  hello-world  code-golf  cops-and-robbers  hello-world 

Можем ли мы взять Sв качестве списка персонажей?
мистер Xcoder

@ Mr.Xcoder Конечно, я добавлю это в спецификации.
мили

Можем ли мы напечатать в виде списка символов?
Эрик Outgolfer

Можем ли мы пропустить первый элемент (исходную строку) в выводе?
ETHproductions

@ETHproductions Нет, сначала вывод должен быть исходной строкой, а затем каждой строкой, полученной в результате удаления символа. Таким образом, вывод должен содержать len(x)+1строки.
мили

Ответы:


8

Haskell, 38 33 байта

s#i=take i s++drop(i+1)s
scanl(#)

Прямо вперед: несколько раз возьмите элементы до и после индекса i, присоединитесь к ним и соберите результаты.

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

Редактировать: @Lynn сохранил 5 байтов. Благодарность!


s#i=take i s++drop(i+1)sна самом деле короче, экономя 5 байтов.
Линн

1
Нет, тебе сейчас 33 - не забывай, что там есть фрагмент TIO q=^^;
Линн

Да, ты прав.
Ними

8

JavaScript (ES6), 57 50 48 45 42 байта

Принимает строку как массив отдельных символов, выводит массив, содержащий разделенную запятыми строку оригинала, за которой следует подстрока строк, разделенных запятыми, для каждого шага.

s=>a=>[s+"",a.map(x=>s.splice(x,1)&&s+"")]
  • 3 байта сохранены благодаря Арно, который предположил, что я злоупотребляю свободной выходной спецификацией больше, чем я уже был, что привело меня к злоупотреблению ею еще больше для сохранения еще 3 байтов.

Проверь это

o.innerText=JSON.stringify((f=

s=>a=>[s+"",a.map(x=>s.splice(x,1)&&s+"")]

)([...i.value="codegolf"])(j.value=[1,4,4,0,2]));oninput=_=>o.innerText=JSON.stringify(f([...i.value])(j.value.split`,`))
label,input{font-family:sans-serif;font-size:14px;height:20px;line-height:20px;vertical-align:middle}input{margin:0 5px 0 0;width:100px;}
<label for=i>String: </label><input id=i><label for=j>Indices: </label><input id=j><pre id=o>


объяснение

Мы принимаем два входа через параметры s(строковый массив) и a(целочисленный массив) в синтаксисе карри, то есть мы вызываем функцию с f(s)(a).

Мы строим новый массив и начинаем его с оригинала s. Однако, поскольку spliceметод, который мы будем использовать позже, модифицирует массив, нам нужно сделать его копию, что мы можем сделать, преобразовав его в строку (просто добавив пустую строку).

Чтобы сгенерировать подмассив, мы mapнад массивом целых чисел a(где xтекущее целое число) и для каждого элемента мы splice1 элемент s, начиная с индекса x. Мы возвращаем измененное s, снова делая его копию, преобразовав его в строку.


Поскольку любая форма вывода хороша до тех пор, пока она легко читаема , я полагаю, что она также должна быть приемлемой:s=>a=>[s+'',...a.map(x=>s.splice(x,1)&&s+'')]
Arnauld

Хороший, @Arnuald - я бы даже не подумал продвинуться так далеко, даже учитывая эту спецификацию.
Лохматый

6

Japt , 6 байт

åjV uV

Проверьте это онлайн!

объяснение

UåjV uV   Implicit: U = array of integers, V = string
Uå        Cumulatively reduce U by
  j         removing the item at that index in the previous value,
   V        with an initial value of V.
     uV   Push V to the beginning of the result.

В качестве альтернативы:

uQ åjV

UuQ       Push a quotation mark to the beginning of U.
    å     Cumulatively reduce by
     j      removing the item at that index in the previous value,
      V     with an initial value of V.

Это работает, потому что удаление элемента в index "ничего не делает и поэтому возвращает исходную строку.


6

Шелуха , 7 байт

G§+oh↑↓

Принимает сначала строку, затем (на основе 1) индексы. Попробуйте онлайн!

объяснение

G§+oh↑↓
G        Scan from left by function:
           Arguments are string, say s = "abcde", and index, say i = 3.
      ↓    Drop i elements: "de"
     ↑     Take i elements
   oh      and drop the last one: "ab"
 §+        Concatenate: "abde"
         Implicitly print list of strings on separate lines.

Как мне использовать пустой список индексов x?
мили

@ Мили Вы должны указать тип, как это .
Згарб

Ясно спасибо. Я не очень знаком ни с Хаскеллом, ни с Хаском.
мили

6

Python 2 , 43 байта

s,i=input()
for i in i+[0]:print s;s.pop(i)

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

Любая форма вывода хороша, если она легко читаема.

Так что это печатает как списки символов.


1
Хорошо, но почему вы выбрали неправильное обозначение for i in i+[0]?
г-н Xcoder

@ Mr.Xcoder Потому что так отображается последняя строка. (и причина, которую я разместил отдельно на первом месте)
Эрик Outgolfer

Нет, не о чем +[0]я говорю for i in i. for k in iэквивалентно .
мистер Xcoder

@ Mr.Xcoder Потому что мне так нравится ...
Эрик Аутгольфер

Хорошо, просто любопытно ... Может быть, это был трюк, о котором я не знал :)
Мистер Xcoder

5

Python 2 , 47 байт

Это может быть сокращено до 43 байт , как указывало @LuisMendo, но это уже решение @ ErktheOutgolfer.

a,b=input();print a
for i in b:a.pop(i);print a

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


`a`[2::5]вместо этого''.join(a)
Род

@ Род Как работает чем?
г-н Xcoder

reprи разделение строк, хорошо работает для преобразования списка символов в строку, `a`[1::3]также может использоваться со списком цифр
Rod

@ Род Я знаю, что они, я не понимаю, как ::5здесь работает: P
Мистер Xcoder

@ Mr.Xcoder хорошо, тогда изучай нарезку строк;) в основном это занимает каждый 5-й символ, начиная со 2-го
Эрик Аутгольфер

4

Java 8, 78 байт

Это лямбда с карри, от int[]потребителя StringBuilderилиStringBuffer . Вывод распечатывается на стандартный вывод.

l->s->{System.out.println(s);for(int i:l)System.out.println(s.delete(i,i+1));}

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


1
Ваш второй ответ является действительной записью. Ничто не запрещает вам тщательно выбирать тип ввода, если это имеет смысл. Я уже несколько раз принимал даже Streams в качестве входных данных и получал очень хорошие ответы. Фактически, почти все языки гольфа используют потоки, эквивалентные внутренне. Таким образом, выбрав свой вход, вы просто выровняете немного. +1 тем не менее
Оливье Грегуар

Может быть, вы правы. Я думаю, что я склонен быть более консервативным, чем большинство в этих вещах. Я переключусь на второе решение.
Якоб

3

05AB1E , 11 байт

v=ā0m0yǝÏ},

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

v           # For each index:
 =          #   Print without popping
  ā         #   Push range(1, len(a) + 1)
   0m       #   Raise each to the power of 0. 
            #   This gives a list of equal length containing all 1s
     0yǝ    #   Put a 0 at the location that we want to remove
        Ï   #   Keep only the characters that correspond to a 1 in the new list
         }, # Print the last step

Первая строка не там. О, и не уверен, что вы можете печатать так.
Эрик Outgolfer

@EriktheOutgolferAny form of output is fine as long as it is easily readable
Riley

Тогда я могу сохранить несколько байтов ...
Эрик Аутгольфер


3

R , 46 32 байта

function(S,X)Reduce(`[`,-X,S,,T)

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

Вводит в виде списка символов и Xосновывается на 1. Reduceявляется эквивалентом R fold, функция в этом случае [является подмножеством. Выполняется итерация, -Xпоскольку отрицательное индексирование в R удаляет элемент и initустанавливается равным S, accum=TRUEпоэтому мы накапливаем промежуточные результаты.

R , 80 байт

function(S,X,g=substring)Reduce(function(s,i)paste0(g(s,0,i-1),g(s,i+1)),X,S,,T)

2-аргументная функция, принимает X1-индексированный. принимаетS как строку.

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


Очень умный, чтобы использовать Reduceздесь. Отлично сработано!
Джурио


3

PowerShell , 94 84 байта

param($s,$x)$a=[Collections.Generic.list[char]]$s;$x|%{-join$a;,$a|% r*t $_};-join$a

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

Принимает ввод $sкак строку и $xкак явный массив. Затем мы создаем $aна основе $sсписка.

Массивы в PowerShell имеют фиксированный размер (для наших целей здесь), поэтому нам нужно использовать длинные [System.Collections.Generic.list] тип longy, чтобы получить доступ к.removeAt() функции, которая в точности соответствует тому, что написано на жестком диске.

Я пожертвовал 10 байтами, чтобы включить два -joinоператора, чтобы сделать вывод красивым. ОП заявил, что вывод списка символов - это нормально, поэтому я мог бы выводить только $aвместо -join$a, но, на мой взгляд, это действительно ужасно.

Сохранено 10 байт благодаря бриантисту.


Вы можете остановиться Systemи просто использовать [Collections.Generic.list[char]]. Чтобы сохранить его красивым, не жертвуя байтами, вы можете поместить последний -join$aв нижний колонтитул в TIO.
Бриантист

Я думаю, что вы также можете сохранить 3 байта, изменив $a.removeat($_)на ,$a|% r*t $_.
Бриантист

@briantist Спасибо за это - я всегда забываю удалить Systemиз названия класса. К сожалению, последний -join$aкод необходим для кода, поэтому я не могу переместить его в нижний колонтитул.
AdmBorkBork


2

05AB1E , 9 7 байт

=svõyǝ=

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


=s        # Print original string, swap with indices.
  v       # Loop through indices...
   õyǝ    # Replace current index with empty string.

-2 благодаря идее от @ETHProductions.


Это ничего не печатает, если xпусто.
Райли

@ Райли исправлено. (#ETHProductions исправлено.)
Волшебная урна с осьминогом

1
Не могли бы вы просто сделать =sv""yǝ=или что-то подобное вместо замены новой строки, а затем удаления новой строки?
ETHproductions

@ETHproductions õтакже работает :)
Волшебная урна с осьминогом

Ну, я не знаю 05AB1E, ха-ха
ETHproductions

2

Сетчатка , 58 байт

¶\d+
¶¶1$&$*
+1`(?=.*¶¶.(.)*)(((?<-1>.)*).(.*)¶)¶.*
$2$3$4

Попробуйте онлайн! Объяснение:

¶\d+

Сопоставьте индексы (которые никогда не находятся на первой строке, поэтому всегда начинаются с новой строки).

¶¶1$&$*

Двойные пробелы индексов, преобразование в унарное и добавление 1 (потому что нули жесткие в сетчатке).

+1`

Повторно меняйте первое совпадение, которое всегда является текущим значением строки.

   (?=.*¶¶.(.)*)

Получить следующий индекс в $#1.

                (           .    ¶)

Захватите строку, включая $#1символ th и одну новую строку .

                 ((?<-1>.)*) (.*)

Отдельно запишите префикс и суффикс $#1 th-го символа строки.

                                   ¶.*

Подходим индекс.

$2$3$4

Замените строку на себя, а индекс - на префикс и суффикс $#1символа th.



2

PowerShell , 54 58 байт

param($s,$x),-1+$x|%{$z=$_;$i=0;-join($s=$s|?{$z-ne$i++})}

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

объяснение

Принимает ввод как массив символов ([char[]] ).

Перебирает массив индексов ( $x) плюс впрыскивает первый элемент -1, то для каждого из них, присваивает текущий элемент $z, инициализирует $iк 0, а затем итерации через массив символов ( $s), возвращая новый массив только символы , чьи индекс ( $i) не равно ( -ne) текущему индексу для исключения ( $z). Этот новый массив присваивается обратно $s, и одновременно возвращается (это происходит, когда присваивание выполняется в скобках). Этот возвращенный результат-join редактируется для формирования строки, которая отправляется в конвейер.

Внедрение -1в начале гарантирует, что оригинальная строка будет напечатана, так как это первый элемент, и индекс никогда не будет совпадать -1.


1
Очень умный способ вытащить соответствующие показатели.
AdmBorkBork

2

q / kdb +, 27 10 байт

Решение:

{x _\0N,y}

Примеры:

q){x _\0N,y}["codegolf";1 4 4 0 2]
"codegolf"
"cdegolf"
"cdeglf"
"cdegf"
"degf"
"def"
q){x _\0N,y}["abc";0]
"abc"
"bc"
q){x _\0N,y}["abc";()]
"abc"
q){x _\0N,y}["abc";2 0 0]
"abc"
"ab"
,"b"
""    
q){x _\0N,y}["";()]
""

Объяснение:

Использует преимущества как конвергентной функциональности, \так и дропа _.

{x _\0N,y}
{        } / lambda function, x and y are implicit variables
     0N,y  / join null to the front of list (y), drop null does nothing
   _\      / drop over (until result converges) printing each stage
 x         / the string (need the space as x_ could be a variable name)

Примечания:

Если нам не нужно печатать исходный результат, это будет 2 байта q:

q)_\["codegolfing";10 9 8 3 2 1 0]
"codegolfin"
"codegolfi"
"codegolf"
"codgolf"
"cogolf"
"cgolf"
"golf"

2

Perl 5 , 55 байт (54 + " -l")

sub{print($s=shift);for(@_){substr$s,$_,1,"";print$s}}

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


Ницца! Я придумал очень похожий подход, но в качестве полной программы (использующей -pa) на 44 байта:$_=<>;substr$_,shift@F,print,""while@F&&$_
Дом Гастингс

Ницца! Не уверен, что вам нужен финал, &&$_так как вы можете предположить, что ввод действителен (список индексов не может быть длиннее строки). Использование возвращаемого значения в printкачестве количества символов довольно гладко.
aschepler

Ах, это правда! Я не заметил эту часть спецификации! Я думал, что мой ответ слишком похож на ваш, чтобы публиковать отдельно, хотя!
Дом Гастингс

2

MATL , 8 байт

ii"t[]@(

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

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

объяснение

i      % Input string. Input has to be done explicitly so that the string
       % will be displayed even if the row vector of indices is empty
i      % Input row vector of indices
"      % For each
  t    %   Duplicate current string
  []   %   Push empty array
  @    %   Push current index
  (    %   Assignment indexing: write [] to string at specified index
       % End (implicit). Display stack (implicit)

2

C # (.NET Core) , 87 87 74 70 байт

S=>I=>{for(int i=0;;S=S.Remove(I[i++],1))System.Console.WriteLine(S);}

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

Это говорит о том, что рекурсия не всегда является лучшим решением. Это на самом деле короче, чем мой первоначальный неверный ответ. Все еще печатает в STDOUT, а не возвращает, что необходимо, потому что это заканчивается ошибкой.

-4 байта благодаря TheLethalCoder


Согласно недавнему мета-консенсусу (который я не могу найти) рекурсивные лямбды в C # запрещены, если вы не укажете, что они компилируют в счетчике байтов. Следовательно, полный метод в этом случае короче. Я голосую, пока это не будет исправлено, дайте мне знать, когда.
TheLethalCoder

@TheLethalCoder Я, возможно, не согласен с консенсусом, но, похоже, это консенсус . Я обновил свой ответ.
Камил Дракари

70 байтов . Используйте каррирование и переместите один оператор в цикл, чтобы прекратить использовать фигурные скобки.
TheLethalCoder

@TheLethalCoder Ах, так вот как вы используете карри в C #! Я знал, что это было короче ровно для двух аргументов, но это всегда заканчивалось жалобами на какую-то часть моего синтаксиса. Спасибо за улучшения
Камил Дракари

Не беспокойтесь и да первый всегда должен быть , Funcчто возвращает другой Func, Action, Predicate, ...
TheLethalCoder


1

Pyth , 10 байт

Изменения правил спасли мне 1 байт:

V+E0Q .(QN

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

Pyth , 11 байт

V+E0sQ .(QN

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


@miles не разрешен ли вывод stderr по умолчанию?
Эрик Outgolfer

@ Mr.Xcoder Я думал, что вывод stderr в этом случае был проигнорирован ...
Эрик, Outgolfer

@miles Я удаляю свои и отмечаю их модом, если мы их не удалим. Благодарность!
г-н Xcoder

1

Gaia , 9 байт

+⟪Seḥ+⟫⊣ṣ

Я действительно должен добавить функцию "удалить по индексу" ...

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

объяснение

+          Add the string to the list
 ⟪Seḥ+⟫⊣   Cumulatively reduce by this block:
  S         Split around index n
   e        Dump the list
    ḥ       Remove the first char of the second part
     +      Concatenate back together
        ṣ  Join the result with newlines

1

V , 12 байт

òdt,GÙ@-|xHx

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

Это 1-индексированный, ввод выглядит так:

11,10,9,4,3,2,1,
codegolfing

объяснение

ò              ' <M-r>ecursively until error
 dt,           ' (d)elete (t)o the next , (errors when no more commas)
    G          ' (G)oto the last line
     Ù         ' Duplicate it down
        |      ' Goto column ...
      @-       ' (deleted number from the short register)
         x     ' And delete the character there
          H    ' Go back home
           x   ' And delete the comma that I missed

Как мне использовать пустой список индексов x?
мили

@ миль, добавив несколько байтов :). Теперь будет работать просто пустая первая строка. Вы были бы в порядке, если бы я взял списки с запятой? IE 1,2,3,. Пустой список был бы ничем, Синглтон был бы1,
nmjcman101

Конечно, вы можете использовать этот формат ввода.
мили


1

Pyth, 8 байт

+zm=z.Dz

Тестирование!

объяснение

+zm=z.DzdQ    # implicit: input and iteration variable
  m      Q    # for each of the elements of the first input (the array of numbers, Q)
     .Dzd     # remove that index from the second input (the string, z)
   =z         # Store that new value in z
+z            # prepend the starting value



Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.