2017-12-27 99 views
7

Daha basit bir çözüm arıyorum.Perl listelerinde bulunan ürünler Birleştirme 3

karşılık gelen ekleri ve köklerin bir listesi ile öneklerin bir listesi var.

my @prefixes = 'A'..'E'; 
my @suffixes = 'a'..'e'; 
my @roots = 1, 2; 
Tüm olası 'kelimeleri' yapmak istiyorum

: A1a, B1b ... A2a ... E2e.

my @words; 
for @roots -> $r { 
    for @prefixes.kv -> $i, $p { 
     my $s = @suffixes[$i]; 
     my $word = [~] $p, $r, $s; 
     @words.push: $word; 
    } 
} 
say @words; # [A1a B1b C1c D1d E1e A2a B2b C2c D2d E2e] 

Ben

+1

'(("A" .. "E," Z " bir" .. "e") X 1,2) .map (-> (($ a, $ c), $ b) {"$ a $ b $ c"}) – Christoph

+1

veya "((" A ".." E "Z" a ".." e ") X 1,2) .flat.map (* ~ * R ~ *)', denedimceye kadar önceliğe/çağrışıma göre çalışacağından emin değildim. o ... – Christoph

+0

@Christoph Teşekkürler! Ve gerçekten de 'Rop' 'op''den daha yüksek önceliğe sahip görünüyor. [Docs] 'da (https://docs.perl6.org/language/operators#index-entry-R_reverse_meta_operator), sadece şifreli bir ifade vardır: "İşlenenlerin birliği de tersine döndü". –

cevap

8

Birkaç yolu onu yazmak için:


say @roots X[&join] (@prefixes Z @suffixes); 

say @roots.map({ |(@prefixes Z @suffixes)».join($_) }); 

say @roots.map({ (@prefixes X~ $_) Z~ @suffixes }).flat; 

say (|@prefixes xx *) Z~ (@roots X~ @suffixes); 

my @formats = (@prefixes Z @suffixes).flat.map(* ~ '%s' ~ *); 
say @formats X[&sprintf] @roots; 

(Not:. Bu, bir farklı bir sırayla yazdırır)


say do for @roots -> $root { 
    |do for (@prefixes Z @suffixes) -> [$prefix, $suffix] { 
     $prefix ~ $root ~ $suffix 
    } 
} 
+0

Teşekkürler, ilk çözüm en açık olanıdır! Ve bu sorunun tüm farklı çözümü Perl 6'nın bir mini ansiklopedi sağlar. :) –

10

Benim çözüm olacaktır ... zip veya cross gibi bir şey kullanarak çok daha kolay yapmak mümkün olduğunu varsayalım, ama nasıl bilemiyorum:

say @roots.map: |(@prefixes >>~>> * <<~<< @postfixes); 

Birbirini tamamladığınız skaler değerlerle bir Seq elde etmek için sonucu kaydırarak birleştirme metalaştırmak için bir WhateverCode oluşturun.

+0

Bu harika bir çözüm, teşekkürler! –

İlgili konular