Dize ekleme


29

Bir dize dilim listesinin bir girişi göz önüne alındığında, orijinal dize çıktı.

Her dilim, dilimin başlangıç ​​konumunu (bir tamsayı ≥0) ve dilimin kendisini içeren bir uzunluk 2 listesi olarak verilecektir. Diliniz isteğe bağlı türlerden oluşan dizileri desteklemiyorsa, bunu bir yapı veya benzeri veya basitçe sayı, boşluk ve sonra dilimden oluşan bir dize olarak da alabilirsiniz.

Her dilimin iki elementinin sırası size kalmış. Ayrıca, dilimlerin gösterimini bir uzunluk-2 dizisi olarak kullanmayı seçerseniz, girişi 2 boyutlu bir dizi veya tek bir düz dizi olarak alabilirsiniz. Son olarak, pozisyonu temsil eden tamsayı ya sıfır indekslenmiş ya da bir indekslenmiş olabilir (buradaki tüm örnekler sıfır indekslenmiştir).

Giriş, tüm dizgiyi verilen en yüksek pozisyona kadar belirlemek için her zaman yeterli olacaktır. Yani, "delik" veya "boşluk" olmayacak. Bu nedenle, çıktı herhangi bir ekstra ya da baştaki karakter içermemelidir (tipik isteğe bağlı izleyen yeni satır dışında). Girdi her zaman tutarlı olacak ve hiçbir dilim birbiriyle çakışmayacak.

Bu olduğundan, bayttaki en kısa kod kazanır.

Test durumları:

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

Dizenin hangi karakterleri içereceği konusunda herhangi bir kısıtlama var mı?
GamrCorps

@GamrCorps Hayır, özel bir kısıtlama yok.
Doorknob

1
Çıkış dizesinin uzunluğu üzerinde herhangi bir kısıtlama var mı?
Mego

@Mego Bellek / depolama tarafından getirilen doğal sınırların dışında.
Doorknob

1
HA! Bu benim metin editörümdeki geri alma mekanizması: D
slebetman

Yanıtlar:


5

Jöle, 10 9 bayt

Ḣ0ẋ;Fµ€o/

Çevrimiçi deneyin!

Nasıl çalışır

Ḣ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 bayt

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

İlk olarak, ofsetlerini boşluklarla doldurmak suretiyle dizeleri hizalar (netlik için alt çizgi olarak gösterilir)

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

__CG
PP
_PC

Daha sonra, kullanımlar mapiçin zipve boşlukların küçük değerler (küçük basılabilir karakteri) göz ardı eder ve her bir sütunun, maksimum almak Nonebazı şeritleri çok kısa burada s.

__CG
PP
_PC

PPCG

Son olarak, hileyi ''.joinkullanarak bir dize [2::5].


2 :: 5 numarası nedir? Bu bir dizgeye nasıl katılır? Her 5. endeks 2'de başlamaz mı?
Robert Fraser,

Bkz @RobertFraser burada .
xnor

8

Perl, 25

İçin +2 eklendi -lp

STDIN'den girdi al, örneğin

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

(^ D veya ^ Z ile kapatın veya sisteminizde STDIN'i ne kapatırsa)

slices.pl:

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

Boş bayt yerine v0iki bayt kurtarmaz mıydınız (çünkü daha önce boş bırakabileceği için x)? Düzenleme: Hm, hayır, denedim, Can't locate object method "x" via package "2"bazı nedenlerden dolayı aldım (ya da numara ilk satırda ne olursa olsun).
msh210

1
Sadece C değişkenleri gibi isimler değişmemiş harfleri olabilir. V0 (nedeniyle ekstra alana veya bu durumda bir kravat tırnak arasında bir \ 0) \ 0 almak için en kısa yoldur Yani
Ton Hospel

8

JavaScript (ES6), 61 bayt

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

Düzenleme: @ edc65 sayesinde 4 bayt kaydedildi.


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

7

Haskell, 57 bayt

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

Kullanım örneği:

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

Nasıl çalışır: (index,letter)her dilimin her harfi için çiftler oluşturun , tek bir listede birleştirin, çiftleri kaldırın, dizine göre sıralayın, dizinleri kaldırın.


4

MATL , 15 bayt

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

Dilin / derleyicinin geçerli sürümü (13.0.0) ile çalışır .

Giriş, küme parantezleri ve tek tırnaklarla yapılır. (MATLAB / MATL'deki kıvrık parantezler isteğe bağlı, muhtemelen farklı türler içerebilen listeler olan hücre dizilerini tanımlar .) Test durumları şöyledir:

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

Çevrimiçi deneyin!

''      % 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
Bu cevap bir kıçı!
Conor O'Brien,

3

DUP , 14 bayt

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

Try it here.

Anonim lambda. Kullanımı:

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

Not: DUP gerçekten dizileri yok, bu yüzden bu giriş biçimini tamam umarım.

açıklama

DUP'un yaylı anlama ... ilginç. Dizeler, her biri dizeden bir charcode tutan bir dizi sayı değişkeni olarak kaydedilir. Gibi bir şey2"CG" 2'yi yığına itmek, ardından 2'den başlayarak dizini oluşturmak için bir dize oluşturmak çalışır.

Bu dizinler gerçekten değişken olduğundan, üzerine yazılabilirler. Girdi gerçekten böyle yapıyor: geçersiz kılma! Tuşuna basmayı deneStep daha iyi bir fikir edinmek için tercüman sitesine . Bundan sonra, etiketlenmemiş bir dize elde ederiz.

Çıkışın geldiği yer burasıdır.

[            ] {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 için Yaşasın!
kedi

2

PHP, 146 karakter

Not: Kullanıcı girişini değerlendirmek her zaman iyi bir fikirdir.

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

Sadece girdiyi her karakterin kendine özgü anahtarı olan bir diziye yazıyorum ve sonra hepsini çıkarıyorum.

Testler

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

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

php shorten.php unslice.php-> Script 107 karakterle kısaltıldı. : D


" Kullanıcı girişini değerlendirmek asla iyi bir fikir değildir " Code Golf en kötü uygulamalar hakkında: D
cat

$a[$f]=$c;$f++;PHP bilmiyorum ama bu olamaz $a[$f++]=c;mı?
kedi

Ben deneyeceğim ..: D
timmyRS

@cat Thx arkadaşı, 3 karakterle kısalttı. : D
timmyRS

1

Cidden, 48 bayt

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

Ciddi bir ciddi dize manipülasyon kötü.

Çevrimiçi deneyin!

Açıklama:

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

Harita 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

Harita 2:

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

Harita 3:

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

Harita 4:

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

Özetle, bu program nboşluklarla bir dize oluşturur ; burada ndize girdiye dayanabileceği minimum uzunluktur. Her dilimdeki her karakterin sonuç dizesindeki dizini belirler ve o dizindeki sonuç dizesindeki karakteri karaktere ayarlar.


1

Python, 91 bayt.

Kedi sayesinde 1 byte kurtarıldı.

Biraz uzun. Biraz daha golf oynarım.

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

Python, 119 115 bayt

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

Test durumları

görüntü tanımını buraya girin


0

CJam, 26 bayt

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

Çevrimiçi deneyin! . Formdaki girişi alır [["CG"2]["PP"0]["PC"1]].

Açıklama:

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 bayt

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

Satır sonları ile:

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'de çalışır (tek satır bir veya çok satır için kaynak), ancak ideone içinde değil, örnek:

> 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

Giriş yöntemine dikkat edin:

veya sadece sayı, boşluk ve sonra dilimden oluşan bir dizedir.

Spesifikasyonun bu bölümüne bu tür bir girişle uyduğumu, birden fazla satıra verilebileceğini, girişi sonlandıracak boş bir satır olduğu sürece bunun hiçbir etkisi olmadığını kabul ediyorum.

Sanırım +1'i kaldırarak ve 1 tabanlı indeksleme kullanarak 2 karakter kaydedilebiliyor ama zorlu girişlerle başladım.


0

C, 110 bayt

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

Bu program, her biri bir satırdaki indeksinden sonra dilimini alır.

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

İdeone.com'da test edin


0

Lua, 113 bayt

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

Bu muhtemelen yazdığım daha güvenli kodlardan bazıları. Fikir basit. Kullanıcı, şu şekilde biçimlendirilmiş bir dizi girecektir: {{1, "1"}, {3, "3"}, {2, "2"}}ve ardından tablo ilk dizine göre sıralanacak ve ikinci dizin basılacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.