Batalkan string

29

Diberikan input dari daftar irisan string, output string asli.

Setiap irisan akan diberikan sebagai daftar panjang 2, berisi posisi awal irisan (bilangan bulat ≥0) dan irisan itu sendiri. Jika bahasa Anda tidak mendukung array tipe sewenang-wenang, Anda juga dapat menganggap ini sebagai struct atau serupa, atau hanya string yang terdiri dari angka, spasi, dan kemudian irisan.

Urutan kedua elemen dari masing-masing slice terserah Anda. Selain itu, jika Anda memilih untuk menggunakan representasi irisan sebagai array panjang-2, Anda dapat mengambil input sebagai array 2 dimensi atau array flat tunggal. Akhirnya, bilangan bulat yang mewakili posisi dapat berupa indeks-nol atau indeks-tunggal (semua contoh di sini adalah indeks-nol).

Input akan selalu cukup untuk menentukan seluruh string hingga posisi tertinggi yang diberikan. Artinya, tidak akan ada "lubang" atau "celah". Oleh karena itu, output tidak boleh mengandung karakter tambahan tambahan atau utama (selain baris tambahan opsional khas) Masukan akan selalu konsisten, dan tidak ada irisan yang akan saling bertentangan.

Karena ini adalah , kode terpendek dalam byte akan menang.

Kasus uji:

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
Gagang pintu
sumber
Apakah ada batasan pada karakter apa yang akan berisi string?
GamrCorps
@ GarrCorps Tidak, tidak ada batasan khusus.
Gagang Pintu
1
Apakah ada batasan panjang string keluaran?
Mego
@Mego Tidak ada selain dari batasan alami yang ditentukan oleh memori / penyimpanan.
Gagang Pintu
1
HA! Ini adalah mekanisme undo di editor teks saya: D
slebetman

Jawaban:

5

Jelly, 10 9 byte

Ḣ0ẋ;Fµ€o/

Cobalah online!

Bagaimana itu bekerja

Ḣ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
sumber
14

Python 2, 49 byte

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

Pertama, sejajarkan senar dengan mengisi offset mereka dengan spasi (ditunjukkan sebagai garis bawah untuk kejelasan)

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

__CG
PP
_PC

Kemudian, gunakan mapuntuk zipdan mengambil maksimum setiap kolom, yang mengabaikan nilai ruang yang lebih kecil (karakter terkecil yang dapat dicetak) dan Nonedi mana beberapa string terlalu pendek.

__CG
PP
_PC

PPCG

Akhirnya, ''.joinuntuk string menggunakan [2::5]triknya.

Tidak
sumber
Whats the 2 :: 5 trick? Bagaimana cara bergabung dengan string? Bukankah itu setiap indeks ke-5 mulai dari 2?
Robert Fraser
@RobertFraser Lihat di sini .
xnor
8

Perl, 25

Menambahkan +2 untuk -lp

Dapatkan input dari STDIN, mis

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

(Tutup dengan ^ D atau ^ Z atau apa pun yang menutup STDIN pada sistem Anda)

slices.pl:

/ /;$r|=v0 x$`.$'}{*_=r
Ton Hospel
sumber
Bukankah byte nol bukannya v0menghemat dua byte (karena Anda juga bisa menghilangkan ruang sebelum x)? Sunting: Hm, tidak, ketika saya mencobanya, saya dapat Can't locate object method "x" via package "2"(atau apa pun nomornya pada baris pertama saya) karena beberapa alasan.
msh210
1
Hanya nama seperti variabel C yang dapat berupa tanda kutip tanpa tanda kutip. Jadi v0 adalah cara terpendek untuk mendapatkan \ 0 (atau a \ 0 antara kutipan untuk dasi dalam kasus ini karena ruang tambahan)
Ton Hospel
8

JavaScript (ES6), 61 byte

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

Sunting: Disimpan 4 byte berkat @ edc65.

Neil
sumber
a => a.map (([o, s]) => [... s] .map (c => r [o ++] = c), r = []) && r.join`` menyimpan 4 byte
edc65
7

Haskell, 57 byte

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

Contoh penggunaan:

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

Cara kerjanya: membuat pasangan (index,letter)untuk setiap huruf dari setiap irisan, menyatukannya menjadi satu daftar, menghapus duplikat, mengurutkan berdasarkan indeks, menghapus indeks.

nimi
sumber
4

MATL , 15 byte

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

Bekerja dengan versi saat ini (13.0.0) dari bahasa / kompiler.

Input dengan kurung kurawal dan tanda kutip tunggal. (Kurung kurawal di MATLAB / MATL menentukan susunan sel , yang merupakan daftar yang dapat memiliki konten jenis yang arbitrer, mungkin berbeda.)

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

Cobalah 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
sumber
1
Jawaban ini bukan apa-apa!
Conor O'Brien
3

DUP , 14 byte

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

Try it here.

Lambda anonim Pemakaian:

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

CATATAN: DUP tidak benar-benar memiliki array, jadi saya harap format input ini baik-baik saja.

Penjelasan

Pemahaman string DUP adalah ... menarik. String disimpan sebagai serangkaian variabel angka, yang masing-masing memegang charcode dari string. Sesuatu seperti 2"CG"berfungsi sebagai mendorong 2 ke tumpukan, lalu membuat string dengan indeks mulai dari 2.

Karena indeks ini benar-benar variabel, mereka dapat ditimpa. Itulah yang sebenarnya dilakukan input: mengesampingkan! Coba tekan Steppada situs juru bahasa untuk mendapatkan ide yang lebih baik untuk ini. Setelah ini, kami mendapatkan string yang tidak berlisensi.

Di sinilah keluarannya masuk.

[            ] {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
sumber
Hore untuk DUP!
kucing
2

PHP, 146 karakter

Catatan: Menghindari input pengguna selalu merupakan ide bagus.

Golf

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

Tidak disatukan

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

Anda dapat melihat bahwa saya hanya menulis input ke dalam array dengan kunci spesifik yang dimiliki masing-masing karakter dan kemudian menampilkan semuanya.

Tes

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

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

php shorten.php unslice.php-> Script yang disingkat 107 karakter. : D

timmyRS
sumber
" Menghindari input pengguna tidak pernah merupakan ide yang baik " Code Golf adalah tentang praktik terburuk: D
cat
$a[$f]=$c;$f++;Saya tidak tahu PHP tetapi tidakkah ini bisa terjadi $a[$f++]=c;?
kucing
Aku akan mencobanya ..: D
timmyRS
@cat Thx mate, korslet dengan 3 karakter. : D
timmyRS
1

Serius, 48 ​​byte

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

Serius benar - benar buruk dalam manipulasi string.

Cobalah online!

Penjelasan:

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

Peta 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

Peta 2:

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

Peta 3:

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

Peta 4:

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

Singkatnya, program ini membuat string dengan nspasi, di mana npanjang minimum string dapat didasarkan pada input. Ini menentukan indeks dalam string hasil dari setiap karakter di setiap slice, dan menetapkan karakter dalam string hasil pada indeks itu ke karakter.

Mego
sumber
1

Python, 91 byte.

Disimpan 1 byte berkat kucing.

Agak panjang. Saya akan menurunkannya sedikit lagi.

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
sumber
1

Python, 119 115 byte

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

Uji kasus

masukkan deskripsi gambar di sini

Argenis García
sumber
0

CJam, 26 byte

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

Cobalah online! . Mengambil input dalam bentuk [["CG"2]["PP"0]["PC"1]].

Penjelasan:

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
sumber
0

R, 181 byte

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

Dengan jeda baris:

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

Bekerja di R Gui (satu baris, atau sumber untuk multi-baris) tetapi tidak dalam ideone, contoh:

> 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

Catatan tentang metode input:

atau hanya string yang terdiri dari angka, spasi, dan kemudian irisan.

Saya berasumsi bahwa saya mematuhi bagian spesifikasi ini dengan input semacam ini, dapat diberikan pada beberapa baris, ini tidak memiliki dampak selama ada baris kosong untuk mengakhiri input.

Saya pikir 2 karakter dapat disimpan dengan menghapus +1 dan menggunakan pengindeksan berbasis 1 tapi saya mulai dengan input tantangan.

Tensibai
sumber
0

C, 110 byte

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

Program ini mengambil irisan setelah indeksnya dalam satu baris input masing-masing.

Tidak Terkumpul:

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

Tes di ideone.com

dihapus
sumber
0

Lua, 113 byte

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

Ini mungkin beberapa kode yang lebih aman yang saya tulis. Idenya sederhana. Pengguna akan memasukkan array yang diformat seperti itu: {{1, "1"}, {3, "3"}, {2, "2"}}dan kemudian tabel akan diurutkan berdasarkan indeks pertama dan indeks kedua akan dicetak.

Skyl3r
sumber