Odznacz ciąg

29

Biorąc pod uwagę listę plasterków łańcucha, wypisz oryginalny łańcuch.

Każdy wycinek zostanie podany jako lista o długości 2, zawierająca pozycję początkową wycinka (liczba całkowita ≥0) i sam wycinek. Jeśli twój język nie obsługuje tablic dowolnych typów, możesz również wziąć to jako strukturę lub podobne, lub po prostu ciąg składający się z liczby, spacji, a następnie plastra.

Kolejność dwóch elementów każdego plasterka zależy od Ciebie. Ponadto, jeśli zdecydujesz się użyć reprezentacji wycinków jako tablicy o długości 2, możesz wprowadzić dane jako tablicę 2-wymiarową lub pojedynczą płaską. Wreszcie, liczba całkowita reprezentująca pozycję może być albo indeksowana zerowo, albo indeksowana jednokrotnie (wszystkie przykłady tutaj są indeksowane zerowo).

Dane wejściowe zawsze będą wystarczające do określenia całego łańcucha do najwyższej podanej pozycji. Oznacza to, że nie będzie „dziur” ani „luk”. Dlatego wynik nie może zawierać żadnych dodatkowych znaków końcowych ani wiodących (innych niż typowy opcjonalny znak nowej linii). Dane wejściowe zawsze będą spójne i żadne plasterki nie będą ze sobą sprzeczne.

Ponieważ jest to , wygra najkrótszy kod w bajtach.

Przypadki testowe:

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
Klamka
źródło
Czy są jakieś ograniczenia dotyczące znaków, które będzie zawierał łańcuch?
GamrCorps
@GrrCorps Nie, bez specjalnych ograniczeń.
Klamka
1
Czy są jakieś ograniczenia dotyczące długości ciągu wyjściowego?
Mego
@Mego Brak oprócz naturalnych ograniczeń narzuconych przez pamięć / pamięć.
Klamka
1
HA! Oto mechanizm cofania w moim edytorze tekstu: D
slebetman

Odpowiedzi:

5

Galaretka, 10 9 bajtów

Ḣ0ẋ;Fµ€o/

Wypróbuj online!

Jak to działa

Ḣ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.
Dennis
źródło
14

Python 2, 49 bajtów

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

Najpierw wyrównuje ciągi, wypełniając ich odsunięcia spacjami (pokazanymi dla podkreślenia jako podkreślenia)

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

__CG
PP
_PC

Następnie, do zastosowań mapdo zipi podejmuje maksymalnie każdej kolumny, która pomija mniejsze wartości przestrzenie (najmniejsza do drukowania znaków) i NoneS, jeżeli niektóre łańcuchy zbyt krótki.

__CG
PP
_PC

PPCG

Wreszcie ''.joindo ciągu przy użyciu [2::5]lewy.

xnor
źródło
Jaka jest sztuczka 2 :: 5? Jak to się łączy w łańcuch? Czy to nie co 5 indeks, zaczynając od 2?
Robert Fraser
@RobertFraser Zobacz tutaj .
xnor
8

Perl, 25

Dodano +2 do -lp

Uzyskaj dane wejściowe z STDIN, np

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

(Zamknij za pomocą ^ D lub ^ Z lub cokolwiek, co zamyka STDIN w twoim systemie)

slices.pl:

/ /;$r|=v0 x$`.$'}{*_=r
Ton Hospel
źródło
Czy bajt zerowy nie v0oszczędziłby ci dwóch bajtów (ponieważ możesz również pominąć spację przed x)? Edycja: Hm, nie, kiedy spróbowałem, dostałem Can't locate object method "x" via package "2"(lub jakikolwiek numer jest w mojej pierwszej linii) z jakiegoś powodu.
msh210
1
Tylko nazwy takie jak zmienne C mogą być literałami niecytowanymi. Więc v0 jest najkrótszym sposobem na uzyskanie \ 0 (lub \ 0 między cytatami dla remisu w tym przypadku ze względu na dodatkowe miejsce)
Ton Hospel
8

JavaScript (ES6), 61 bajtów

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

Edycja: Zapisano 4 bajty dzięki @ edc65.

Neil
źródło
a => a.map (([o, s]) => [... s] .map (c => r [o ++] = c), r = []) && r.join`` zapisuje 4 bajty
edc65
7

Haskell, 57 bajtów

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

Przykład użycia:

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

Jak to działa: ułóż pary (index,letter)dla każdej litery każdego plasterka, połącz w jedną listę, usuń duplikaty, sortuj według indeksu, usuń indeksy.

nimi
źródło
4

MATL , 15 bajtów

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

Działa z bieżącą wersją języka / kompilatora (13.0.0)

Dane wejściowe obejmują nawiasy klamrowe i pojedyncze cudzysłowy. (Nawiasy klamrowe w MATLAB / MATL definiują tablice komórek , które są listami, które mogą zawierać zawartość dowolnych, ewentualnie różnych typów). Przypadki testowe są zatem:

{{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'}}

Wypróbuj online!

''      % 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
Luis Mendo
źródło
1
Ta odpowiedź to błahostka!
Conor O'Brien
3

DUP , 14 bajtów

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

Try it here.

Anonimowa lambda. Stosowanie:

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

UWAGA: DUP tak naprawdę nie ma tablic, więc mam nadzieję, że ten format wejściowy jest w porządku.

Wyjaśnienie

Cóż, rozumienie strun przez DUP jest ... interesujące. Ciągi są przechowywane jako seria zmiennych liczbowych, z których każda zawiera kod znaków z ciągu. Coś jak2"CG" działa jak wypychanie 2 na stos, a następnie tworzenie łańcucha z indeksem od 2.

Ponieważ te indeksy są naprawdę zmiennymi, można je zastąpić. Tak naprawdę robi to wejście: przesłonięcie! Spróbuj nacisnąć Stepna stronie tłumacza, aby uzyskać lepszy pomysł. Następnie otrzymujemy nieskomplikowany ciąg.

W tym momencie pojawia się wyjście.

[            ] {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}
Mama Fun Roll
źródło
Brawo dla DUP!
kot
2

PHP, 146 znaków

Uwaga: Sprawdzanie danych wprowadzanych przez użytkowników jest zawsze dobrym pomysłem.

Grał w golfa

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

Nie golfił

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

Widzisz, że właśnie piszę dane wejściowe do tablicy z określonym kluczem, który ma każdy znak, a następnie wypisuję wszystko.

Testy

php unslice.php '[[0, "foobar"], [6, "baz"]]' -> foobarbaz

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

php shorten.php unslice.php-> Skrócony skrypt o 107 znaków. :RE

timmyRS
źródło
Sprawdzanie opinii użytkowników nigdy nie jest dobrym pomysłem ” Code Golf opowiada o najgorszych praktykach: D
kot
$a[$f]=$c;$f++;Nie znam PHP, ale nie może tak być $a[$f++]=c;?
kot
Będę próbować ..: D
timmyRS
@cat Thx mate, zwierałem go o 3 znaki. : D
timmyRS
1

Poważnie, 48 bajtów

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

Poważnie jest poważnie zły w manipulowaniu strunami.

Wypróbuj online!

Wyjaśnienie:

,`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

Mapa 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

Mapa 2:

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

Mapa 3:

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

Mapa 4:

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

W skrócie, ten program tworzy ciąg ze nspacjami, gdzie nminimalna długość może być oparta na danych wejściowych. Określa indeks w ciągu wynikowym każdego znaku w każdym wycinku i ustawia znak w ciągu wynikowym pod tym indeksem na znak.

Mego
źródło
1

Python, 91 bajtów.

Zaoszczędzono 1 bajt dzięki cat.

To jest trochę długie. Za chwilę będę grać w golfa.

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)))
Morgan Thrapp
źródło
1

Python, 119 115 bajtów

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

Przypadki testowe

wprowadź opis zdjęcia tutaj

Argenis García
źródło
0

CJam, 26 bajtów

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

Wypróbuj online! . Pobiera dane wejściowe w formie [["CG"2]["PP"0]["PC"1]].

Wyjaśnienie:

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
GamrCorps
źródło
0

R 181 bajtów

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="")

Z podziałami linii:

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="")

Działa w R Gui (jeden wiersz lub pozyskiwanie w przypadku wielu wierszy), ale nie w ideone, przykład:

> 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

Uwaga na temat metody wprowadzania:

lub po prostu ciąg składający się z liczby, spacji, a następnie plastra.

Zakładam, że stosuję się do tej części specyfikacji przy tego rodzaju danych wejściowych, można je podawać w wielu wierszach, nie ma to wpływu, o ile jest pusta linia kończąca dane wejściowe.

Myślę, że 2 znaki można zapisać, usuwając +1 i używając indeksowania opartego na 1, ale zacząłem od wprowadzania wyzwania.

Tensibai
źródło
0

C, 110 bajtów

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

Ten program pobiera plasterek po indeksie w jednym wierszu danych wejściowych.

Nie golfowany:

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

Przetestuj na ideone.com

oddalony
źródło
0

Lua, 113 bajtów

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

To prawdopodobnie najbardziej bezpieczny kod, który napisałem. Pomysł jest prosty. Użytkownik wprowadzi tablicę sformatowaną w ten sposób: {{1, "1"}, {3, "3"}, {2, "2"}}a następnie tabela zostanie posortowana według pierwszego indeksu i wydrukowany zostanie drugi indeks.

Skyl3r
źródło