Отсоединить строку


29

Учитывая ввод списка фрагментов строки, выведите исходную строку.

Каждый срез будет представлен в виде списка длиной 2, содержащего начальную позицию среза (целое число ≥0) и сам срез. Если ваш язык не поддерживает массивы произвольных типов, вы также можете принять это как структуру или аналог, или просто строку, состоящую из числа, пробела, а затем среза.

Порядок двух элементов каждого среза зависит от вас. Кроме того, если вы решите использовать представление срезов в виде массива длины 2, вы можете использовать входные данные как двухмерный массив или как один плоский массив. Наконец, целое число, представляющее позицию, может быть либо с нулевым индексом, либо с одним индексом (все примеры здесь имеют нулевой индекс).

Ввод всегда будет достаточным для определения всей строки до заданной максимальной позиции. То есть не будет «дыр» или «пробелов». Следовательно, выходные данные не должны содержать никаких дополнительных завершающих или начальных символов (кроме типичного необязательного завершающего символа новой строки). Ввод всегда будет согласованным, и никакие срезы не будут конфликтовать друг с другом.

Поскольку это , победит самый короткий код в байтах.

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

In                                                Out
-----------------------------------------------------------
[[2, "CG"], [0, "PP"], [1, "PC"]]               | PPCG
[[0, "foobarbaz"]]                              | foobarbaz
[[0, "foobar"], [6, "baz"]]                     | foobarbaz
[[2, "ob"], [5, "rba"], [0, "fooba"], [8, "z"]] | foobarbaz
[[0, "fo"], [0, "fooba"], [0, "foobarbaz"]]     | foobarbaz

Есть ли какие-либо ограничения на то, какие символы будет содержать строка?
GamrCorps

@GamrCorps Нет, особых ограничений нет.
Дверная ручка

1
Есть ли ограничения по длине выходной строки?
Мего

@Mego Нет, кроме естественных ограничений, налагаемых памятью / хранилищем
Ручка двери

1
ХА! Это механизм отмены в моем текстовом редакторе: D
slebetman

Ответы:


5

Желе, 10 9 байт

Ḣ0ẋ;Fµ€o/

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

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

Ḣ0ẋ;Fµ€o/  Main link. Input: A (list of pairs)

     µ€    Convert the chain to the left into a link, and apply it to each pair.
Ḣ          Pop the first element.
 0ẋ        Yield a list of that many zeroes.
   ;F      Concatenate the list of zeroes with the popped, flattened pair.
       o/  Reduce the generated lists by logical OR.
           Since all characters are truthy, this overwrites zeroes with characters,
           but never characters with zeroes.

14

Python 2, 49 байт

lambda l:`map(max,*[' '*n+s for n,s in l])`[2::5]

Во-первых, выровняйте строки, заполнив их смещения пробелами (для ясности показаны подчеркиваниями)

[[2, "CG"], [0, "PP"], [1, "PC"]] 

__CG
PP
_PC

Затем, использует mapдля zipи взять максимум каждого столбца, который игнорирует меньшие значения пространств (наименьший печати символов) и NoneS , где некоторые строки были слишком коротки.

__CG
PP
_PC

PPCG

Наконец, ''.joinк строке, используя [2::5]трюк.


Что за хитрость 2 :: 5? Как это присоединиться к строке? Разве это не каждый пятый индекс, начинающийся с 2?
Роберт Фрейзер

@RobertFraser Смотрите здесь .
xnor

8

Perl, 25

Добавлено +2 для -lp

Получите информацию от STDIN, например

perl -lp slices.pl
2 CG
0 PP
1 PC

(Закрыть с помощью ^ D или ^ Z или любого другого, что закрывает STDIN в вашей системе)

slices.pl:

/ /;$r|=v0 x$`.$'}{*_=r

Не будет ли нулевой байт вместо того, чтобы v0сэкономить вам два байта (потому что вы также можете опустить пробел перед x)? Редактировать: Хм, нет, когда я попробовал это, я получил Can't locate object method "x" via package "2"(или любой другой номер в моей первой строке) по какой-то причине.
msh210

1
Только имена, подобные переменным C, могут быть литералами без кавычек. Таким образом, v0 - самый короткий способ получить \ 0 (или \ 0 между кавычками для связи в этом случае из-за дополнительного пробела)
Тон Хоспел

8

JavaScript (ES6), 61 байт

a=>a.map(([o,s])=>[...s].map(c=>r[o++]=c),r=[])&&r.join``

Редактировать: 4 байта сохранены благодаря @ edc65.


a => a.map (([o, s]) => [... s] .map (c => r [o ++] = c), r = []) && r.join`` сохраняет 4 байта
edc65

7

Haskell, 57 байт

import Data.List
map snd.sort.nub.(>>= \(n,s)->zip[n..]s)

Пример использования:

*Main> map snd.sort.nub.(>>= \(n,s)->zip[n..]s) $ [(2,"CG"),(0,"PP"),(1,"PC")]
"PPCG"

Как это работает: создавать пары (index,letter)для каждой буквы каждого фрагмента, объединять в один список, удалять дубликаты, сортировать по индексу, удалять индексы.


4

MATL , 15 байт

''i"@Y:Y:tn:b+(

Работает с текущей версией (13.0.0) языка / компилятора.

Ввод осуществляется с помощью фигурных скобок и одинарных кавычек. (Фигурные скобки в MATLAB / MATL определяют массивы ячеек , которые представляют собой списки, которые могут иметь содержимое произвольного, возможно, различного типа.) Таким образом, тестовые примеры:

{{2, 'CG'}, {0, 'PP'} {1, 'PC'}}
{{0, 'foobarbaz'}}
{{0, 'foobar'}, {6, 'baz'}}
{{2, 'ob'}, {5, 'rba'}, {0, 'fooba'}, {8, 'z'}}
{{0, 'fo'}, {0, 'fooba'}, {0, 'foobarbaz'}}

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

''      % push empty string. This will be filled with the slices to produce the result
i       % take input: cell array of cell arrays. For example: {{0, 'foobar'}, {6, 'baz'}}
"       % for each (1st-level) cell
  @     %   push that cell. Example: {{0, 'foobar'}}
  Y:    %   unpack (1st-level) cell, i.e. push its contents. Example: {0, 'foobar'}
  Y:    %   unpack (2nd-level) cell array: gives number and substring. Example: 0, 'foobar'
  tn:   %   duplicate substring and generate vector [1,2,...,n], where n is length of
        %   current substring (in the example: 6)
  b+    %   add input number that tells the position of that substring within the whole
        %   string (in the example: 0; so this gives [1,2,...,6] again)
  (     %   assign substring to the total string, overwriting if necessary. Note that
        %   MATL uses 1-indexing
        % end for each
        % implicit display

1
Этот ответ - буте!
Конор О'Брайен

3

DUP , 14 байтов

[0[$;$][,1+]#]

Try it here.

Анонимная лямбда. Использование:

2"CG"0"PP"1"PC"[0[$;$][,1+]#]!

ПРИМЕЧАНИЕ: DUP на самом деле не имеет массивов, поэтому я надеюсь, что этот формат ввода в порядке.

объяснение

Ну, понимание строки DUP ... интересно. Строки хранятся в виде последовательности числовых переменных, каждая из которых содержит код строки. Нечто подобное 2"CG"работает так, что вы помещаете 2 в стек, а затем создаете строку с индексом, начинающимся с 2.

Поскольку эти индексы действительно переменные, они могут быть перезаписаны. Вот что действительно делает вход: переопределение! Попробуйте нажать Stepна сайте переводчика, чтобы получить лучшее представление об этом. После этого мы получаем несрезанную строку.

Вот где приходит вывод.

[            ] {lambda}
 0             {push 0 to the stack as accumulator}
  [   ][   ]#  {while loop}
   $;$         {duplicate, get var at TOS value, see if that var is defined}
        ,1+    {if so, output charcode at TOS and increment accumulator}

Ура для DUP!
кот

2

PHP, 146 символов

Примечание. Оценка пользовательского ввода всегда хорошая идея.

Golfed

<?$a=[];$f=0;eval("\$b={$argv[1]};");foreach($b as$d){$f=$d[0];$e=str_split($d[1]);foreach($e as$c){$a[$f++]=$c;}}ksort($a);echo join('',$a)."\n";

Ungolfed

<?php
$array = array();
$p = 0;
eval("\$input = {$argv[1]};");
foreach($input as $item)
{
    $p = $item[0];
    $str = str_split($item[1]);
    foreach($str as $part)
    {
        $array[$p++] = $part;
    }
}
ksort($array);
echo join('', $array)."\n";
?>

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

тесты

php unslice.php '[[0, "foobar"], [6, "baz"]]' -> Фубарбаз

php unslice.php '[[2, "CG"], [0, "PP"], [1, "PC"]]' -> PPCG

php shorten.php unslice.php-> Сокращенный сценарий на 107 символов. : D


« Оценка пользовательского ввода никогда не бывает хорошей идеей » Code Golf рассказывает о худших практиках: D
кошка

$a[$f]=$c;$f++;Я не знаю PHP, но не может ли это быть $a[$f++]=c;?
кот

Я попробую это ..: D
timmyRS

@cat Thx приятель, замкнул его на 3 символа. : D
timmyRS

1

Серьезно, 48 байтов

,`i@;l(;)+(x@#@k`M;`i@X@M`MMu' *╗`iZi`M`i╜T╗`MX╜

Серьезно это серьезно плохо к манипуляции со струнами.

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

Объяснение:

,`i@;l(;)+(x@#@k`M;`i@X@M`MMu' *╗`iZi`M`i╜T╗`MX╜
,                                                 get input
 `              `M;                               perform the first map and dupe
                   `     `MM                      perform the second map, get max element
                            u' *╗                 increment, make string of that many spaces, save in reg 0
                                 `   `M           third map
                                       `    `M    fourth map
                                              X╜  discard and push register 0

Карта 1:

i@;l(;)+(x@#@k
i@;l            flatten, swap, dupe string, get length
    (;)+(       make stack [start, end, str]
         x@#@k  push range(start, end), explode string, make list of stack

Карта 2:

i@X@M
i@X     flatten, swap, discard (discard the string)
   @M   swap, max (take maximum element from range)

Карта 3:

iZi  flatten, zip, flatten (make list of [index, char] pairs)

Карта 4:

i╜T╗  flatten, push reg 0, set element, push to reg 0

В двух словах, эта программа создает строку с nпробелами, гдеn минимальная длина строки может быть основана на вводе. Он определяет индекс в строке результата каждого символа в каждом срезе и устанавливает символ в строке результата в этом индексе на символ.


1

Python, 91 байт.

Сохранено 1 байт благодаря кат.

Это немного долго. Я буду играть в гольф немного позже.

def f(x):r={j+i:q for(i,s)in x for j,q in enumerate(s)};return"".join(map(r.get,sorted(r)))

1

Питон, 119 115 байт

def f(x,s=""):
 x.sort()
 for e in x:
  a=e[0];b=e[1]
  for i,c in enumerate(b):
   if len(s)<=(i+a):s+=c
 return s

Контрольные примеры

введите описание изображения здесь


0

CJam, 26 байтов

q~{~0c*\+}%{.{s\s|}}*e_0c-

Попробуйте онлайн! , Принимает участие в форме [["CG"2]["PP"0]["PC"1]].

Объяснение:

q~           Read and eval input

{~0c*\+}%    Convert input strings into workable format
{      }%     Map onto each input
 ~            Evaluate
  0c          Null character
    *\+       Multiply by input number and concat to string

{.{s\s|}}*   Combine strings
{       }*    Fold array
 .{    }       Vectorize, apply block to corresponding elements of arrays
   s\s         Convert elements to strings
      |        Set Union

e_0c-        Remove null characters

0

R 181 байт

n=nchar;m=matrix(scan(,'raw'),ncol=2,byrow=T);w=rep('',max(n(m[,2])+(i<-strtoi(m[,1]))));for(v in 1:nrow(m)) w[seq(i[v]+1,l=n(m[v,2]))]=unlist(strsplit(m[v,2],''));cat("",w,sep="")

С переносами строк:

n=nchar
m=matrix(scan(,'raw'),ncol=2,byrow=T)
w=rep('',max(n(m[,2])+(i<-strtoi(m[,1]))))
for(v in 1:nrow(m)) w[seq(i[v]+1,l=n(m[v,2]))]=unlist(strsplit(m[v,2],''))
cat("",w,sep="")

Работает в R Gui (одна строка или поиск для многострочной), но не в ideone, например:

> n=nchar;m=matrix(scan(,'raw'),ncol=2,byrow=T);w=rep('',max(n(m[,2])+(i<-strtoi(m[,1]))));for(v in 1:nrow(m)) w[seq(i[v]+1,l=n(m[v,2]))]=unlist(strsplit(m[v,2],''));cat("",w,sep="")
1: 2 ob 5 rba 0 fooba 8 z
9: 
Read 8 items
foobarbaz

Обратите внимание на метод ввода:

или просто строка, состоящая из числа, пробела, а затем среза.

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

Я думаю, что 2 символа можно сохранить, удалив +1 и используя индексирование на основе 1, но я начал с ввода запроса.


0

C, 110 байтов

c,i,j;char s[99];main(){while(~scanf("%i ",&i))for(;(c=getchar())>10;s[i++]=c);for(;s[j]>10;putchar(s[j++]));}

Эта программа берет фрагмент после его индекса в одной строке ввода каждая.

Ungolfed:

c,i,j;char s[99];

main(){
    while(~scanf("%i ",&i))
        for(;(c=getchar())>10;s[i++]=c);
    for(;s[j]>10;putchar(s[j++]));
}

Тест на ideone.com


0

Луа, 113 байт

z=loadstring("return "..io.read())()table.sort(z,function(a,b)return a[1]<b[1]end)for a=1,#z do print(z[a][2])end

Это, вероятно, один из наиболее безопасных кодов, которые я написал. Идея проста. Пользователь введет массив в следующем формате:{{1, "1"}, {3, "3"}, {2, "2"}} таблица будет отсортирована по первому индексу, а второй индекс будет напечатан.

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