Розв’яжіть рядок


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? Як це приєднується до рядка? Чи не кожен 5-й індекс починається з 2?
Роберт Фрейзер

@RobertFraser Дивіться тут .
xnor

8

Перл, 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
Ця відповідь - це гріх!
Conor O'Brien

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 символів

Примітка. Оцінка користувальницьких даних - це завжди хороша ідея.

Гольф

<?$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";

Безумовно

<?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"]]' -> foobarbaz

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;?
кіт


@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

Пітон, 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)))


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++]));}

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

Безголовки:

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.