Interleave dizeleri


30

İlham. * Daha önce bu zorluğa girmediğimize inanamıyorum:

Görev

Bir veya daha fazla yazdırılabilir ASCII dizesi verildiğinde, karakterleri karakter dizisine kadar, her dizgeden bir karakter alarak bunları serpiştirin. Bir dize diğerlerinden önce karakterlerin tükenmesi durumunda, bunu bir sonraki adımdan atlayın.

Örnekler

SIMPLE verir SIMPLE

POLLSve EPEESverirPEOPLELESS

LYESve APRONSverirLAYPERSONS

ABCDEve a cve 123 567verirAa1B 2Cc3D E567

"\n$?*ve (boş dize) ve ,(.)" (arkadaki boşluk) verir ",\(n.$)?"* (arkadaki boşluk)


* Daha kısa APL çözümleri var.


Bu temelde sadece devrik bir işlem olduğundan, çok benzer, ancak muhtemelen hiçbiri tamamen aynı olmayan birkaç zorluk yaşadık.
Martin Ender,

7
Bu soruyu CS HW'mde yaşadım, bu bir ev ödevi sorusu olarak kapatabileceğim anlamına mı geliyor? P
Downgoat

@EriktheOutgolfer Harika! Bugün bir şey öğrendim.
Ad

Yanıtlar:


23

Jöle , 1 bayt

Z

Çevrimiçi deneyin!

“Devrik” yerleşik, tam olarak bunu bir dizi listesine yapacaktır.


Merak ediyorum, kısa dizeleri boşluklarla doldurmak zorunda olsaydınız kodun neye benzeyeceğini düşünürdüm.
Ad

2
Bu olurdu z⁶. z“transpozit sola, sağa doldurma”; bir alandır.
Lynn,

1
@ Adám Jelly listelerde çok iyi çalışıyor; Yerleşikler nerede sonlanır ve dil yapıları / tasarımı nerede başlar?
steenbergh

1
Jelly @Lynn? Atomlar ve Hızlılar listelerindeki her şey yerleşiktir.
Aralık'ta

2
@ Adám ;"(element-bilge birleştirme) görevi yerleşik olmayan bir şekilde çözecektir.
Dennis,

8

Python 2, 101 89 86 69 bayt

Umarım bunu bir lambdaya sokabilirim, özyinelemeli hale getirerek kısaltabilirim. Bu ideal değildir, çünkü transpozisyonun daha kısa olduğunu umarsınız, ne yazık ki değildir (şu ana kadar elde ettiklerimden).

f=lambda s:' '*any(s)and''.join(x[:1]for x in s)+f([x[1:]for x in s])

Eski çözümler:

w=input();o=''
while any(w):
 for i in range(len(w)):o+=w[i][:1];w[i]=w[i][1:]
print o

lambda s:''.join(''.join([c,''][c<' ']for c in x)for x in map(None,*[list(y)for y in s]))

w=input();o=''
while any(x>=' 'for x in w):
 for i in range(len(w)):o+=w[i][:1];w[i]=w[i][1:]
print o

bana aptal hissettirdiği için mathmandan sayesinde;) beni bir sürü bayt kurtardı! (eski bir çözümde)


Sadece yapamaz while any(w):mısın? Boş dizeler Python'da sahtedir.
mathmandan

@ mathmandan Kesinlikle haklısın, ne düşündüğümü bilmiyorum ..
Kade

Sorun değil :) Yeni çözümünüz harika görünüyor, ancak hazırlamanız gerektiğini düşünüyorum f=.
mathmandan

[]Yinelemeli aramayı çıkararak, bırakarak f(x[1:] for x in s), bu bağlamda bir liste gibi davranan bir jeneratör anlayışı haline getirebilirsiniz .
bioweasel



7

Pyth - 3 bayt

Çok basit, daha sonra mobilde genişleme ekleyecektir.

s.T

Test odası

s                         Join all the strings together
 .T                       Transpose, without chopping off overhang
  (Q implicit)

4
@Daniel Ben de okuldayım: P
Maltysen

Açıklama ekleme konusunda herhangi bir planın var mı?
John Dvorak

@JanDvorak şimdi yapıyor emin.
Maltysen

6

JavaScript (ES6), 52 46 bayt

f=([[c,...s],...a])=>s+a?c+f(s+s?[...a,s]:a):c

Bir dizge dizisi olarak girdiyi alır ve tek bir dizge olarak çıktılar.

Test snippet'i

f=([[c,...s],...a])=>s+a?c+f(s+s?[...a,s]:a):c

g=a=>console.log("Input:",JSON.stringify(a),"Output:",JSON.stringify(f(a)))

g(["SIMPLE"])
g(["POLLS","EPEES"])
g(["LYES","APRONS"])
g(["ABCDE","a c","123 567"])
g(["\"\\n$?*",",(.)\" "]) // Backslash and quote are escaped, but in/output are correct


f=([[c,...s],...a])=>c?c+f([...a,s]):a+a&&f(a)
Neil

@Neil Bu harika bir yaklaşım. Ben kendi :-) kapalı 6 bayt golf başardı
ETHproductions

6

Haskell, 33 bayt

import Data.List
concat.transpose

Ideone'da dene. Kullanımı:

Prelude Data.List> concat.transpose$["ABCDE","a c","123 567"]
"Aa1B 2Cc3D E567"

Bir yerleşik kullanmadan: ( 38 34 bayt)

f[]=[]
f x=[h|h:_<-x]++f[t|_:t<-x]

Ideone'da dene. Zgarb sayesinde 4 bayt kapalı! Kullanımı:

Prelude> f["ABCDE","a c","123 567"]
"Aa1B 2Cc3D E567"

1
Alternatif sürümde tüm parens kaldırabilirsiniz. Yine de yine de ithalatı yenmeyecek.
Zgarb

Temel davaya gerçekten ihtiyacın var mı?
xnor

Boşver, elbette temel dava gerekli.
xnor

@xnor Ayrıca baz büyük / küçük harfini sonuna kadar taşıyamazsınız ve f a=aher ikisinin []de farklı bir türü olduğundan çok bayt kaydetmek için onunla değiştiremezsiniz .
Laikoni

5

C, 114 84 bayt

-20 uzunluğu hesaplamak için bayt.

i,b;f(char**s){b=1;while(b){i=-1;b=0;while(s[++i]>0)if(*s[i])putchar(*s[i]++),++b;}}

Karakter işaretçisi dizisini kabul eder ve son öğenin boş gösterici olmasını gerektirir (kullanıma bakın).

Ungolfed ve kullanım:

i,b;f(char**s){
 b=1;
 while(b){
  i=-1;
  b=0;
  while(s[++i]>0)
   if(*s[i])
    putchar(*s[i]++),++b;
 }
}


int main(){
 char*a[]={ 
//  "POLLS","EPEES"
//  "LYES","APRONS"
 "ABCDE","a c","123 567"
 ,0};
 f(a);
 puts("");
}

Printf / sprintf kullanımına izin verilmiyor mu? : D oldukça bayt kazanırsınız.
Walfrat

@Walfrat Doğrudan yazdırmadan önce bir dize ayırmam gerekir, bu nasıl bir şeyi kurtarırdı.
Karl Napf

++ b eklediğiniz ve uzunluk hesaplamanızı kaldırdığınız düzenlemenizden önceydi, bu yüzden evet artık çalışamıyor.
Walfrat

Evet @Walfrat, ama bir vardı mallocve returnönce ve bu sadece baskı daha uzundu
Karl Napf

5

PHP, 68 67 bayt

for(;$f=!$k=$f;$i++)for(;y|$v=$argv[++$k];$f&=""==$c)echo$c=$v[$i];

Komut satırı argümanları üzerinden döngüler. İle koş -r.

İç döngü sonrasında $fise 1tüm dizeleri, bittiğinde 0başka (bit &yayınları ""==$cint kadar).
Dış döngünün Sonraki yineleme: Kopya $fiçin $k(bir byte dan kaydeder $k=0ve geçiş) $f:
Tüm dizeleri bittiğinde, $fartık falseve döngü bozuluyor.


Boş giriş dizeleriyle çalışmıyor. Son test
belgesine

@ aross: sabit. Teşekkürler.
Titus

4

Retina , 13 bayt

Bayt sayısı, ISO 8859-1 kodlamasını varsayar.

O$#`.
$.%`
¶

Çevrimiçi deneyin!

açıklama

O$#`.
$.%`

Bu, Retina'daki standart transpozisyon tekniğine dayanmaktadır. Bir nevi ( O) olmayan tüm satır besleme karakterleri ( .) tarafından ( $#) aynı hat üzerinde önlerinde karakter sayısı ( $.%`), yani kendi yatay konumu.

İkinci aşama daha sonra satır beslemelerini girdiden kaldırır.


4

Java, 19 + 155 = 174 160

String f(java.util.Queue<String> q){String s,r="";while(!q.isEmpty()){s=q.poll();r+=s.isEmpty()?"":s.charAt(0);if(s.length()>1)q.add(s.substring(1));}return r;}

Ungolfed:

  String f(java.util.Queue<String> q) {
    String s, r = "";
    while (!q.isEmpty()) {
      s = q.poll();
      r += s.isEmpty() ? "" : s.charAt(0);
      if (s.length() > 1) {
        q.add(s.substring(1));
      }
    }
    return r;
  }

Çıktı:

BASİT

insansızlaştırılıyor

sıradan kişiler,

Aa1B 2Cc3D E567

", (n. $)?" *

İlk değişiklik: bazı baytları kurtarmak için dize bildirimi birleştirildi. Kaldırıldı import, main()ayrıca gerekli olan yöntemle (burada gösterilmemiştir) kullanıldı LinkedList. QueueDoğrudan yönlendirmek için daha az bayt var .


string s'yi string r ile
başlatalım,

Neredeyse bir yıl önce olduğunu biliyorum, ancak birkaç baytlık golf String f(java.util.Queue<String>q){String s,r="";for(;!q.isEmpty();r+=s.isEmpty()?"":s.charAt(0))if((s=q.poll()).length()>1)q.add(s.substring(1));return r;}
oynayabilirsiniz

3

PHP, 77 bayt

golfed

function($a){for($d=1;$d!=$s;$i++){$d=$s;foreach($a as$v)$s.=$v[$i];}echo$s;}

Bir dizi dizeyi alan adsız işlev.

Bunun daha çok golf oynayabileceğine eminim, ama erken. Her yinelemede, verilen her diziden i-inci harfini alır ve birer birer son dizimize ekleriz. PHP, varolmayan dizgecik parçalarına erişirsek uyarı verir, yani sorun değil. Tüm dizgilerden bir kez döngülendikten sonra herhangi bir değişiklik yapılmamışsa dururuz.

Kullanımı $ddaha fazla golf olabilir gibi hissediyorum , ancak erken. : P


Tek bir argümana bir dizi dizgiyi tam olarak nasıl yerleştirirsiniz?
Titus,

@Titus. Bilirsin, bunun hakkında hiç düşünmedim. Sadece yapabileceğini sanmıştım.
Xanderhall

3

Aslında , 7 6 bayt

Golf önerileri hoş geldiniz! Çevrimiçi deneyin!

Düzenleme: Teal pelikan sayesinde -1 bayt.

a Z♂ΣΣ

Ungolfing

          Implicit input each string.
a         Invert the stack so that the strings are in the correct order.
<space>   Get the number of items on the stack, len(stack).
Z         Zip all len(stack) strings into one, transposing them.
♂Σ        sum() every transposed list of chars into strings.
Σ         sum() again to join the strings together.

# 6 bayt yapmak için # kaldıramazsınız?
Peal Pelikan

Welp @Tealpelican, şimdi benim eski Aslında tüm cevapları kazmak ve ben değiştiremem olmadığını görmek zorunda gidiyorum Z♂#Σiçin Z♂Σhepsinde. Tavsiyeniz için teşekkürler: D
Sherlock9

Dile ilk kez baktığımızda, çok eğlenceli görünüyor! Ben yardımcı olabilir sevindim :))
Peal Pican

3

JavaScript (ES6), 46 bayt

f=([[c,...s],...a])=>c?c+f([...a,s]):a+a&&f(a)
<textarea oninput=o.textContent=f(this.value.split`\n`)></textarea><div id=o>



2

J , 13 bayt

({~/:)&;#\&.>

Çevrimiçi deneyin!

Bu soru için ilham alınarak hazırlandı .

Bunu yapmak için başka bir yol 27 bayt alır, ancak transpozisyon kullanarak çalışır. Baytların çoğu, dolgudan otomatik olarak eklenen sıfırları ele almak içindir.

[:u:0<:@-.~[:,@|:(1+3&u:)&>

açıklama

({~/:)&;#\&.>  Input: list of boxed strings S
          &.>  For each boxed string x in S
        #\       Get the length of each prefix from shortest to longest
                 This forms the range [1, 2, ..., len(x)]
                 Rebox it
(    )         Operate on S and the prefix lengths
      &;         Raze both
   /:            Grade up the raze of the prefix lengths
 {~              Index into the raze of S using the grades
               Return

J'nin karma dizileri yasaklaması sizi gerçekten çok üzüyor. APL'de deneyin.
Ad

2

Bash + GNU yardımcı programları, 55

 eval paste `sed "s/.*/<(fold -1<<<'&')/g"`|tr -d \\n\\t

STDIN (satırla ayrılmış) ve STDOUT aracılığıyla G / Ç.

sedBir her satırı biçimlendirir Bash işlemi yerine . Bunlar daha sonra evaliçine girilirpaste gerçek dönüşümlü yapmak. trsonra gereksiz yeni satırları ve sekmeleri kaldırır.

Ideone.


2

PHP, 63 bayt

Not: IBM-850 kodlamasını kullanır

for(;$s^=1;$i++)for(;n|$w=$argv[++$$i];$s&=$x<~■)echo$x=$w[$i];

Bu şekilde koş:

php -r 'for(;$s^=1;$i++)for(;n|$w=$argv[++$$i];$s&=$x<~■)echo$x=$w[$i];' "\"\n\$?*" "" ",(.)\" " 2>/dev/null;echo
> ",\(n.$)?"* 

açıklama

for(                       # Iterate over string index.
  ;
  $s ^= 1;                 # Continue until $s (stop iterating) is 1.
                           # Flip $s so each iteration starts with $s
                           # being 1.
  $i++                     # Increment string index.
)
  for(
    ;
    "n" | $w=$argv[++$$i]; # Iterate over all input strings. OR with "n"
                           # to allow for empty strings.
    $s &= $x<~■            # If last character printed was greater than
                           # \x0 (all printable chars), set $s to 0,
                           # causing the loop to continue.
  )
    echo $x = $w[$i];      # Print char $i of current string.

IBM 850 ?! Bu PHP için doğal bir kodlama mı?
Adam

@ Adám "doğal" ile ne demek istiyorsunuz? PHP 128-255 aralığındaki baytları metin olarak ele alır, bu nedenle sabit olarak yorumlanır. Sabit tanımsızsa, dize olarak yorumlanır. Bu yüzden (ikili 1) ~■yerine yapabilirim (ikili 254 "\x1").
aross

1
Anlıyorum. Bu kod sayfasına gerçekten ihtiyacınız yok, sadece 254 bayta ihtiyacınız var.
Adam

@ Adám evet, kod sayfası sadece biraz daha sinir bozucu olan yazdırılabilir bir karakter yapar.
16'ya kadar

Harika kullanımı $$!
Titus

2

Python 3, 75 Bayt

Diğer Python'un daha kısa olduğunu biliyorum, ama bu maphayatımda ilk defa kullandığım için gurur duyuyorum.

lambda n:''.join(i[k]for k in range(max(map(len,n)))for i in n if len(i)>k)

1

C, 75 71 bayt

Çıktı uzunluğu sadece sınırlamadır. Şu anda 99, ancak kolayca 999 (+1 byte) için uzatılabilir.

i;main(a,b)char**b;{a--;for(;i<99;i++)*b[i%a+1]&&putchar(*b[i%a+1]++);}

Ungolfed:

i;
main( a, b )
char **b;
{
    a--;
    for( ; i < 99; i++ )
        *b[i % a + 1] && putchar( *b[i % a + 1]++ );
}

1

Oracle SQL, 195 bayt

    select listagg(b,'') within group(order by l,o) from(select substr(a,level,1) b,level l,o from i start with length(a)>0 connect by prior a=a and level<=length(a) and prior sys_guid() is not null)

Girişini isütunlarla a(dizeyi içeren) ve o(dizenin sırası ) adlı bir tablodan alır :

    create table i (a varchar2(4000), a integer)

Açıklama:
Biz istismar ediyoruz CONNECT BYonları oluşturan karakterlerin her birine dizeleri kırmak için. PRIOR SYS_GUID()varlık NOT NULLteminat altın bir döngüde takılıp kalmak değil.
Daha sonra tek karakterleri bir araya getiririz, LISTAGGancak bunları birORDER BY onları ilk cümlede ilk sıralarına ve sadece daha sonra geldikleri sıraya göre sıralayarak, cümlecikle .

Diğer cevaplar kadar kısa değil ama SQL gerçekten bir dize işleme dili demek değildir :)


1

Python 2, 128 96

İtertools kullanmak zorunda kalmamayı umuyordum

a=lambda a:"".join([i for i in reduce(lambda: b,c:b+c, map(None,*map(lambda m:list(m),a)) if i])

Ungolfed

 a=lambda a:                              #Start a lambda taking in a
    "".join(                              #Join the result together with empty string
        [i for i in reduce(               #For every item, apply the function and 'keep'
           lambda: b,c:b+c,               #Add lists from...
                map(None,*map(            #None = Identity function, over a map of...
                    lambda m:list(m), a)  #list made for mthe strings m
                   ) if i                 #truthy values only (otherwise the outer map will padd with None.
       ])

Bunu geliştirmek için geri bildirim / tavsiye için teşekkür ederiz.
Pureferret


1

R , 73 bayt

for(i in 1:max(nchar(s<-scan(,""))))for(j in seq(s))cat(substr(s[j],i,i))

Çevrimiçi deneyin!

Açıklama: çok basit (ama ayrıntılı), sadece th dizesinin ith karakterini basarken döngü j. Neyse ki, substraralık dışı bir girdi verilirse boş bir dize döndürür.


0

Python, 112 bayt

i=len(x)if len(x)>len(y) else len(y) h=0 a="" while h<i: if h<len(x) a+=x[h] if h<len(y): a += y[h] h+=1 print a

6
Biçimlendirmeniz gerçekten berbat .. nereden xve ynereden aldınız ?
Kade

0

Perl 5 , 53 bayt

$i=0,map{push@{$a[$i++]},$_}/./g for<>;print@$_ for@a

Çevrimiçi deneyin!

Yöntem

Satır sayısının en uzun dize uzunluğuna eşit olduğu ve maksimum sütun sayısının dize sayısına eşit olduğu iki boyutlu bir dizi oluşturur. Sonra dizinin her satırını boşluk bırakmadan çıktılayın.


0

TXR Lisp , 20 bayt

(opip weave cat-str)

Koşmak:

1> (opip weave cat-str)
#<intrinsic fun: 0 param + variadic>
2> [*1 "LYES" "APRONS"]
"LAYPERSONS"
3> [*1 "ABCDE" "a c" "" "123 567"]
"Aa1B 2Cc3D E567"
4> [*1 "\"\\n$?*" "" ",(.) "]
"\",\\(n.$)? *"

weaveİşlevi bir listesini döndürür yüzden bir dizeye sonucu zorlamak zorunda, o yüzden tembel. Tembel olmak, sonsuz dizileri örebilir. Örneğin, kendileri sonsuz tembel listeler olan düz ve tuhaf doğal sayıları örebiliriz:

5> (take 20 (weave (range 2 : 2) (range 1 : 2)))
(2 1 4 3 6 5 8 7 10 9 12 11 14 13 16 15 18 17 20 19)

0

K (oK) , 35 29 bayt

Çözüm:

{`c$r@&~^r:,/+(`i$x)[;!#,/x]}

Çevrimiçi deneyin!

Örnek:

> {`c$r@&~^r:,/+(`i$x)[;!#,/x]}("ABCDE";"a c";"123 567")
"Aa1B 2Cc3D E567"
> {`c$r@&~^r:,/+(`i$x)[;!#,/x]}("\n$?*";"";",(.)\" ")
"\n,$(?.*)\" "
> {`c$r@&~^r:,/+(`i$x)[;!#,/x]}("POLLS";"EPEES")
"PEOPLELESS"

Açıklama:

Tüm giriş listelerinde 0 ile maksimum (düzleştirilmiş listenin uzunluğu) dizinleri çıkarmak için 2. düzey dizinlemeyi kullanın. Alt listenin sınırlarının ötesindeki herhangi bir indeksleme boş değer döndürür. Döndürün (90 döndürür), düzleştirin ve boş olmayan sonuçları çıkarın.

Notlar:

  • İnteger ( i$) ' e atıfta bulundum, böylece boş olanları alalım, boşluk ( ) boş karakter listesi olarak kabul edilir, bu da geçerli boşluklardan boş değerleri söyleyemeyeceğiniz anlamına gelir.
  • Ayrıca TIO'nun girişle çalışmasını sağlayamadım (OK Repl'de iyi çalıştı), böylece TIO bağlantısı "ABCDE" ... örneğini içeriyor.

0

Jq 1.5 , 49 bayt

map(explode)|transpose|map(map(values)[])|implode

açıklama

                      # example input:          ["LYES","APRONS"]
  map(explode)        # make list of ordinals   [[76,89,69,83],[65,80,82,79,78,83]]
| transpose           # zip lists               [[76,65],[89,80],[69,82],[83,79],[null,78],[null,83]]
| map(map(values)[])  # rm nulls and flatten    [76,65,89,80,69,82,83,79,78,83]
| implode             # convert back to string  "LAYPERSONS"

Örnek çalışma

$ paste input <(jq -Mrc 'map(explode)|transpose|map(map(values)[])|implode' input)
["SIMPLE"]                  SIMPLE
["POLLS","EPEES"]           PEOPLELESS
["LYES","APRONS"]           LAYPERSONS
["ABCDE", "a c", "123 567"] Aa1B 2Cc3D E567
["\"\\n$?*", "", ",(.)\" "] ",\(n.$)?"* 

$ echo -n 'map(explode)|transpose|map(map(values)[])|implode' | wc -c
  49    

Çevrimiçi deneyin

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.