P Pr Pre Pref Prefi Önek Önek Önek


34

Sonlu bir liste verildiğinde, boş bir liste de dahil olmak üzere tüm öneklerinin uzunluğunu artan bir sırayla döndürün.

(Temel olarak Haskell işlevini uygulamak inits.)

ayrıntılar

  • Giriş listesi, sayılar (veya daha uygunsa başka bir tür) içerir.
  • Çıktı bir liste listesi olmalıdır .
  • Gönderme bir işlev olmak zorunda olabilir, ancak herhangi bir varsayılan G / Ç kullanılabilir.
  • Tüm önemsiz çözümler için bir CW cevabı var .

Örnek

[] -> [[]]
[42] -> [[],[42]]
[1,2,3,4] -> [[], [1], [1,2], [1,2,3], [1,2,3,4]]
[4,3,2,1] -> [[], [4], [4,3], [4,3,2], [4,3,2,1]]

Bir dil karakterler dışında herhangi bir tür tanımlamıyorsa, tam bir program durumunda girdiyi dize olarak alabilir ve girişi yeni satırlarla ayırabilir miyim?
NieDzejkob

@NieDzejkob Bu dava için ne gibi bir fikir birliği olduğundan emin değilim, ancak Brainfuck'ın cevabı böyle bir şey yapıyor gibi görünüyor.
kusur

Listenin boş bırakılmasını bekleyebilir miyiz?

Özellikle C / C ++ 'da yaygındır, ana kullanım dizgedir.

@Rogem Bu kadar yaygınsa, izin vermenin makul olduğunu düşünüyorum.
kusur

Yanıtlar:


15

Haskell , 20 bayt

Düzenleme: Tamamen farklı bir tarama ile henüz bir bayt daha kısa.

Önemsiz ithalatı hafifçe yenen isimsiz bir işlev.

scanr(\_->init)=<<id

Çevrimiçi deneyin!

  • =<<Kısaltma için kullanır (scanr(\_->init)=<<id) l = scanr(\_->init) l l.
  • Listeden lsağdan sola tarar , işlevle ara sonuçları toplar \_->init.
  • Bu işlev, taranan öğeleri dikkate almaz (yalnızca toplanan sonuçlar için doğru toplam uzunluğu elde etmek için kullanılırlar), bu nedenle init, taramanın başlangıç ​​değerine de başvurmayı gerçekten yineler l.

13

brainfuck , 21 12 bayt

Arnauld sayesinde -9 bayt ÿ, yeni satırlar yerine ayırıcıyı önerdi

-[[<]>[.>],]

Çevrimiçi deneyin!

STDIN aracılığıyla boş bayt içermeyen baytları alır ve ÿkarakterin baş ÿkarakteriyle ayrılmış bir dizi önekini yazdırır . Örneğin, giriş Prefixesiçin çıktı ÿÿPÿPrÿPreÿPrefÿPrefiÿPrefixÿPrefixeÿPrefixes.

Okunabilirlik için, burada bunun yerine yeni satırları olan bir sürüm .

Açıklama:

-              Create a ÿ character in cell 0
 [        ,]   While input, starting with the ÿ
  [<]>           Go to the start of the string
      [.>]       Print the string
          ,      Append the input to the end of the string

1
Bu, yalnızca 8 bit, işaretsiz, sarma hücreli BF uygulamalarında çalışır.
Dev

11

JavaScript (ES6), 33 bayt

a=>[b=[],...a.map(n=>b=[...b,n])]

Çevrimiçi deneyin!

Nasıl?

+--- a = input array
|
|       +--- initialize b to an empty array and include it as the first entry
|       |    of the output (whatever the input is)
|       |
|       |          +--- for each value n in a[]:
|       |          |
|       |          |        +--- append n to b[] and include this new array in
|       |          |        |    the final output
|       |          |        |
a => [b = [], ...a.map(n => b = [...b, n])]
               |                  |
               +---------+--------+
                         |
      spread syntax: expands all elements of
      the child array within the parent array

vay, bu tamamen yeni bir kod açıklama düzeyi, harika bir iş: O
Brian H.

@BrianH. Teşekkür ederim! Basit görevler, daha yoğun kodda getirilemeyecek ayrıntılı açıklamalar yazmak için iyi fırsatlardır.
Arnauld,

Elle mi yaptın? ya da hiç duymadığım tuhaf yazılımlardan yardım aldınız mı?
Brian H.

2
Bazı sütun modu düzenleme ile sadece Notepad ++ .
Arnauld,


6

Jöle , 3 bayt

ṭṖƤ

Çevrimiçi deneyin!

Nasıl çalışır

ṭṖƤ  Main link. Argument: A

  Ƥ  Map the link to the left over all non-empty(!) prefixes of A.
 Ṗ       Pop; remove the last element.
ṭ    Tack; append A to the resulting list.

6

Japt , 4 bayt

²£¯Y

Çevrimiçi deneyin!

Açıklama:

²       :Add an arbitrary extra item to the end of the array
 £      :For each item in the new array:
  ¯Y    : Get an array of the items that are before it

6

Perl 6 , 13 bayt

{(),|[\,] @_}

Çevrimiçi deneyin!

Açıklamak için:

Perl 6'da, bir operatörü köşeli parantez içinde liste azaltma yazmanın alternatif bir yolu olarak sarabilirsiniz. [+] @arraydöner elemanların toplamı @array, [*] @arrayürünü, vb Ayrıca bazı diller dediğimiz bir "üçgen" azaltma yapmak için önlerine operatöre öncesinde yapabilirsiniz döndürür "tarama". Böylece [\+] @arrayilk öğenin @array, sonra ilk iki öğenin toplamının, sonra ilk üç öğenin toplamının vb.

İşte [\,] @_girdi dizisi üzerinde üçgen azalma olduğu @_liste inşaat operatörü kullanılarak ,. Bu yüzden listelerin bir listesini değerlendirir: ilk öğe @_, ilk iki öğe @_, vb. Neredeyse gerekli olan budur ancak sorun ilk önce boş bir liste gerektirir. Böylece, geri dönüş listesinin ilk elemanı değişmez bir boş listedir (),, daha sonra giriş listesindeki azalma, geri dönüş listesinin geri kalanı ile düzleştirilir |.


2
O_o burada neler oluyor
ASCII-yalnızca

1
@ ASCII sadece üçgen azaltma
user202729


5

R , 40 39 bayt

function(L)lapply(0:length(L),head,x=L)

Çevrimiçi deneyin!

DigEmAll sayesinde -1 bayt

R'nin listtürünün çıktısı biraz garip; sıralı indeksleme kullanır, örneğin

list(1,2) olduğu

[[1]]                     # first list element
list()

[[2]]                     # second list element
[[2]][[1]]                # first element of second list element
[1] 1


[[3]]                     # third list element
[[3]][[1]]                # first element of third list element
[1] 1

[[3]][[2]]                # etc.
[1] 2

Girdiyi bir vektör olarak almak , daha sonra girdilerin teknik olarak lists olmamasına rağmen daha temiz bir çıktı formatı verir .



@digEmAll teşekkürler!
Giuseppe


4

Mathematica, 22 21 bayt

Misha Lavrov sayesinde -1 bayt !

{}~FoldList@Append~#&

Saf işlevi. Listeyi girdi olarak alır ve listeler halinde çıktı olarak döndürür. Bunun mümkün olan en kısa çözüm olduğuna inanıyorum.


Aynı çözümü daha kompakt bir şekilde yazabiliriz {}~FoldList@Append~#&.
Misha Lavrov,

@MishaLavrov Teşekkürler! Körili 1 + 2 argüman biçimini bu şekilde kullanmayı düşünmedim.
LegionMammal978



3

PowerShell , 65 bayt

param($a)'';$x=,0*($y=$a.count);0..--$y|%{$x[$_]=@($a[0..$_])};$x

Çevrimiçi deneyin!

PowerShell , varsayılan program bitiminde gerçekleştiğinde liste listelerini yararlı bir şekilde kaldırır Write-Output, böylece her satıra bir öğe alırsınız. Üstüne atmak-join','İç listeleri dizgelere dönüştürerek liste listesini daha iyi görmek için .

(Ab), boş bir dizi (örneğin @()) çıktısını almaya çalışmanın çıktı vermemesi gerçeğini kullanır , bu nedenle boş bir dizi girişinin , sonuç hiçbir sonuç vermeyeceğinden '', çıktı gibi olmasını sağlar $a[0..$_]. Aynı zamanda bazı muhteşem hata mesajları atıyor.


Atamak yerine parenler içine sarmak, 20 bayt kazandırır . Tabi bunun bir liste listesi olarak sayıldığını düşünmüyorsanız. Ben her zaman bu ayrım üzerine bulanık oldum.
Veskah

@veskah Evet, bu sürüme geçmeden önce sahip olduğum neredeyse buydu. Çözümünüzle veya önceki çözümümle ilgili sorun - bir liste listesi döndürmüyor. TIO1 vs TIO2
AdmBorkBork

3

K (ngn / k) , 8 bayt

,\(,!0),

Çevrimiçi deneyin!


1
Bu bir çeşit vudu. ,\(,()),K4'te. Listelenen giriş boyunca listelenen null'a katılmak howsitwork?
Streetster

1
@streetster ()boş bir listedir. (,()),xiçin hazırlar x. Sonunda ,\ bir concat-taraması yapar. xbir bileşim oluşturmak için atlanmıştır. ,Sonucun ikilik olduğuna dikkat edin , bu yüzden "enlist" değil "concat".
ngn

1
@ streetster k4'de bir bayt daha kısa olabilir: 1_',\0,fakat çözümleyicim bunu halledecek kadar akıllı değil ...
ngn

3

Ortak Lisp , 39 bayt

(defun f(l)`(,@(if l(f(butlast l))),l))

Çevrimiçi deneyin!

açıklama

(defun f(l)                           )  ; Define a function f
           `(                        )   ; With the list (essentially capable of interpolation), containing:
             ,@                          ;     The value of, flattened to one level
               (if l              )      ;         If l is not the empty list (which is the representation of nil, i.e. the only falsy value)
                    (f(butlast l))       ;         Recurse with all of l but the tail
                                   ,l    ;     The value of l

3

F #, 53 bayt

Aslında ikisi de aynı uzunlukta olan iki benzer cevabım var. Her ikisi de sparametre olarak genel bir sekans alır .

İlk çözüm:

let i s=Seq.init(Seq.length s+1)(fun n->Seq.take n s)

Çevrimiçi deneyin!

Seq.takendizinin ilk elemanlarını alır . Seq.initdizi sartı 1 uzunluğunun sayımıyla (bu durumda) yeni bir dizi oluşturur ve dizideki her öğe için ilk nöğeleri alır .s .

İkinci çözüm:

let i s=Seq.map(fun n->Seq.take n s){0..Seq.length s}

Daha önce olduğu gibi, 0'dan 0'a kadar bir dizi oluşturur s. Sonra bu sayı elemanlarını alır.s .

Bunu da çevrimiçi deneyin!


fun s->Seq.map(fun n->Seq.take n s){0..Seq.length s} 1 bayt kazandırır
Ignorance

3

Matl, 15 12 bayt

@Giuseppe sayesinde 3 bayt kurtarıldı

vin:"G@:)]Xh

MATL Online'da deneyin .

MATL'nin çıktıyı görüntülemesi nedeniyle, boş diziyi açıkça hücre dizisinde göremezsiniz. İşte çıktıyı biraz daha açık bir şekilde gösteren sürüm.

açıklama

v       # Vertically concatenate the (empty) stack to create the array []
i       # Explicitly grab the input
n       # Compute the number of elements in the input (N)
:       # Create an array from [1, ..., N]
"       # Loop through this array
  G     # For each of these numbers, M
  @:    # Create an array from [1, ..., M]
  )     # Use this to index into the initial array
]       # End of the for loop
Xh      # Concatenate the entire stack into a cell array

vyerine kullanın []. Ve varsayılan ilk argüman olarak :kullanmaz 1? Yani bu vin:"G@:)]Xh12 bayt olabilir.
Giuseppe,

@Giuseppe Teşekkürler! MATL'im biraz paslanmış görünüyor :(
Suever


2

Kömür , 6 bayt

Eθ…θκθ

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

 θ      Input array
E       Map over elements
   θ    Input array
  …     Moulded to length
    κ   Current loop index
        Implicitly print each array double-spaced
     θ  Input array
        Implicitly print

Charcoal'dan bir baskı almasını istemek 1 byte pahasına mümkündür. n+1 , girişi son öğesi olarak içeren -element dizisini , ancak imleç konumu daha sonra başka bir şey yazdırmaya devam ederseniz, imleç konumu farklı olmasına rağmen, .



2

RAD , 7 bayt

(⊂⍬),,\

Çevrimiçi deneyin!

Bu aynı zamanda Dyalog APL'de bir fonksiyon olarak da çalışır.

Nasıl?

Bu, yakın ilişkileri göz önüne alındığında hem APL hem RAD için aynı şekilde çalışır.

  • (⊂⍬) boş dizi
  • , için hazır
  • ,\ önek (boş diziyi hariç tutar.)



2

brainfuck , 43 bayt

Boş olmayan karakterlerin listesini girdi olarak alın ve tüm önekleri newline ile ayırarak döndürür. Çift sonsuz veya sarma bandı gerektirir.

,>-[+>,]<[-<]<<++++++++++[[<]>[.>]>[-<+>]<]

Çevrimiçi deneyin!


Başka cevap Ben çıkışı yazdırma hakkında düşünmüyordu çünkü daha bir yarı yarıya beni outgolfed ise okuma. Tabii ki bu yöntem baskı son ekleri ile çalışmaz.
user202729

Bazı yeniden düzenlemelere sahip 40 bayt
Jo King

2

C # (Visual C # Etkileşimli Derleyici) , 39 bayt

x=>x.Select((_,i)=>x.Take(i)).Append(x)

Çevrimiçi deneyin!


Sen kullanarak eklemeniz gerekir System.Linq; senin ByteCount içinde. Ve çıktı mantığınızın bir kısmı dizilerin çıktısında görünüyor. Çünkü boş dizi sadece boş dizi döndürür.
LiefdeWen

@ LiefdeWen - benim anladığım kadarıyla bu tercüman bir referans içerdiğinden System.Linq, bunu bayt sayımına dahil etmek zorunda kalmam. Gönderim, söylenenden farklı bir dil olarak kabul edilir .NET Core. github.com/dotnet/roslyn/wiki/C%23-Interactive-Walkthrough - Ayrı bir konu olan baskıdan bahsediyorsunuz, ilk önce bu konuya açıklık getirmek istiyorum.
Dana

Yazdırma ile ilgili olarak, temelde sonucu konsola döken bir sürüm - tio.run/##XY29CsIwGEX3PEXGBGKhtVt/… - o kadar da kesin değil! Sahip olduğum soru ne zaman Arrayvs IListvs kullanmak kabul edilebilir IEnumerable.
Dana

2

F # (Mono) , 45 bayt

fun x->List.mapi(fun i y->List.take i x)x@[x]

Çevrimiçi deneyin!

Bunun geçerli olup olmadığından tam olarak emin değilim, ancak diğer dillerde de kullandığım aynı “anonim lambda” sözdizimini izliyor gibi görünüyor.


2

Java 8+ , 86 77 bayt

-9 byte Kevin Cruijssen sayesinde (ithalattan kurtulmak)!

x->java.util.stream.IntStream.range(0,x.size()+1).mapToObj(t->x.subList(0,t))

Çevrimiçi deneyin!

Alternatif, 65 bayt

Aşağıdakiler stdout'a sonuçları basacaktır ( Olivier Grégoire nedeniyle ):

x->{for(int i=0;i<=x.size();)System.out.print(x.subList(0,i++));}

Çevrimiçi deneyin


java.util.stream.IntStreamDoğrudan kullanarak doğrudan 77 byte'a kadar golf oynayabilir ve içe aktarmayı bırakabilirsiniz.
Kevin Cruijssen,

@KevinCruijssen: Ah, teşekkürler! Bunun mümkün olduğunu bilmiyordum, bu kesinlikle yardımcı oldu (en azından golf amaçlı).
19'da

x->{for(int i=0;i<=x.size();)System.out.println(x.subList(0,i++));}( 67 bayt ). Bu, akış kullanmak yerine yazdırır. Baskı genellikle karmaşık yapıların çıktısını almanın en kısa yoludur.
Olivier Grégoire

@ OlivierGrégoire: Bu durumda System.out.print, çıktı hala belirsiz olduğu için muhtemelen kaçabilirsiniz .
55'te

@BMO Gerçekten, bu mümkün olurdu!
Olivier Grégoire

2

Brachylog , 9 bayt

a₀ᶠ~b.hĖ∧

Çevrimiçi deneyin!

açıklama

a₀ᶠ           Find all prefixes of the input
   ~b         Add an element at the beginning of that list of prefixes
      hĖ      This element is the empty list
     .  ∧     (the list with the additional empty list is the output)

2

Ruby , 31 29 bayt

->a{[a*i=0]+a.map{a[0,i+=1]}}

Çevrimiçi deneyin!

Açıklama:

->a{             # take array input a
  [a*i=0]+       # set i to 0 and add whatever comes next to [[]] (a*0 == [])
  a.map{         # for every element in a (basically do a.length times)
    a[0,i+=1]  # increment i and return the first i-1 elements of a to map
  }
}
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.