P Pr Pre Pref คำนำหน้าคำนำหน้าคำนำหน้าคำนำหน้า


34

ให้รายการ จำกัด บางรายการกลับรายการของคำนำหน้าทั้งหมดรวมถึงรายการที่ว่างในลำดับความยาวของพวกเขา

(โดยทั่วไปจะใช้ฟังก์ชัน Haskell inits)

รายละเอียด

  • รายการอินพุตมีตัวเลข (หรือประเภทอื่นหากสะดวกกว่า)
  • การส่งออกจะต้องเป็นรายชื่อของรายการ
  • การส่งสามารถ แต่ไม่จำเป็นต้องเป็นฟังก์ชันสามารถใช้I / O เริ่มต้นใด ๆได้
  • มีเป็นคำตอบ CWสำหรับทุกการแก้ปัญหาจิ๊บจ๊อย

ตัวอย่าง

[] -> [[]]
[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]]

หากภาษาไม่ได้กำหนดประเภทใด ๆ ยกเว้นตัวละครฉันสามารถรับอินพุตเป็นสตริงและแยกอินพุตด้วยบรรทัดใหม่ในกรณีของโปรแกรมเต็มรูปแบบได้หรือไม่
NieDzejkob

@NieDzejkob ฉันไม่แน่ใจว่าฉันทามติอะไรในกรณีนี้ แต่คำตอบ Brainfuck ดูเหมือนจะทำอะไรแบบนั้น
ข้อบกพร่อง

เราคาดหวังได้ไหมว่ารายการจะถูกยกเลิกเป็นโมฆะ?

เป็นเรื่องธรรมดาโดยเฉพาะอย่างยิ่งใน C / C ++ การใช้งานหลักเป็นสตริง

@Rogem ถ้าเป็นเรื่องธรรมดาฉันคิดว่ามันสมเหตุสมผล
ข้อบกพร่อง

คำตอบ:


15

Haskell , 20 ไบต์

แก้ไข: สั้นลงหนึ่งไบต์ด้วยการสแกนที่แตกต่างอย่างสิ้นเชิง

ฟังก์ชั่นที่ไม่ระบุชื่อเต้นเล็กน้อยนำเข้าเล็กน้อย

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

ลองออนไลน์!

  • ใช้สำหรับย่อ=<<(scanr(\_->init)=<<id) l = scanr(\_->init) l l
  • สแกนรายการจากขวาไปซ้ายรวบรวมผลกลางที่มีฟังก์ชั่นl\_->init
  • ฟังก์ชั่นที่ไม่สนใจองค์ประกอบที่ผ่านการสแกน (พวกเขากำลังใช้เพียงเพื่อให้ได้ความยาวรวมที่เหมาะสมเพื่อให้ได้ผลลัพธ์ที่เก็บรวบรวมได้) ดังนั้นจริงๆ iterates ใช้เป็นค่าเริ่มต้นของการสแกนซึ่งยังเป็นinitl

13

brainfuck , 21 12 ไบต์

-9 ไบต์ขอบคุณ Arnauld ที่แนะนำตัวคั่นÿแทนการขึ้นบรรทัดใหม่

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

ลองออนไลน์!

ใช้ไบต์ผ่าน STDIN โดยไม่มีไบต์ว่างและพิมพ์ชุดของส่วนนำหน้าคั่นด้วยÿอักขระด้วยÿอักขระนำหน้า ตัวอย่างเช่นสำหรับการป้อนข้อมูลผลลัพธ์คือPrefixesÿÿPÿPrÿPreÿPrefÿPrefiÿPrefixÿPrefixeÿPrefixes

สำหรับการอ่านนี่เป็นรุ่นที่มีการขึ้นบรรทัดใหม่แทน

คำอธิบาย:

-              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
ใช้งานได้กับการใช้งานกับ BF ด้วยการห่อเซลล์แบบ 8 บิตที่ไม่ได้ลงชื่อเท่านั้น
Dev

11

JavaScript (ES6), 33 ไบต์

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

ลองออนไลน์!

อย่างไร?

+--- 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

ว้าวนั่นเป็นระดับใหม่ของการอธิบายโค้ดงานที่ยอดเยี่ยม: O
Brian H.

@BrianH ขอขอบคุณ! งานง่าย ๆ เป็นโอกาสที่ดีในการเขียนคำอธิบายโดยละเอียดซึ่งไม่สามารถนำมาใช้ในรหัสที่หนาแน่นกว่าได้
Arnauld

คุณทำด้วยมือหรือไม่ หรือคุณได้รับความช่วยเหลือจากซอฟต์แวร์แปลก ๆ ที่ฉันไม่เคยได้ยินมาก่อน?
Brian H.

2
เพียงแค่ Notepad ++ กับบางแก้ไขโหมดคอลัมน์
Arnauld

8

CW สำหรับรายการที่ไม่สำคัญทั้งหมด

ทำความสะอาด , 19 ไบต์

รุ่น Haskell ทำงานใน Clean ด้วยเช่นกัน

import StdLib
inits

ลองออนไลน์!

Haskell , 22 ไบต์

import Data.List
inits

ลองออนไลน์!

Prolog (SWI) 6 ไบต์

prefix

ลองออนไลน์!


ดังนั้นขาด - เพื่อโหวตหรือไม่ ในอีกด้านหนึ่งฉันขอขอบคุณโซลูชั่นที่มีอยู่ทั้งหมดในที่เดียว อีกอันฉันไม่ชอบ



6

Perl 6 , 13 ไบต์

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

ลองออนไลน์!

อธิบาย:

ใน Perl 6 คุณสามารถตัดโอเปอเรเตอร์ในวงเล็บเหลี่ยมเป็นอีกวิธีหนึ่งในการเขียนการลดรายการ [+] @arrayผลตอบแทนรวมขององค์ประกอบในการ@array, [*] @arrayผลตอบแทนสินค้า ฯลฯ นอกจากนี้คุณยังสามารถนำผู้ประกอบการด้วยเครื่องหมายทับขวาเพื่อให้ลดลง "สามเหลี่ยม" ซึ่งบางภาษาเรียกว่า "สแกน". ดังนั้น[\+] @arrayส่งคืนรายการที่ประกอบด้วยองค์ประกอบแรกของ@arrayจากนั้นผลรวมของสององค์ประกอบแรกจากนั้นรวมผลรวมของสามองค์ประกอบแรก ฯลฯ

นี่[\,] @_คือการลดสามเหลี่ยมมากกว่าอาร์เรย์การป้อนข้อมูลที่ใช้ประกอบรายการก่อสร้าง@_ ,ดังนั้นจึงประเมินรายการของรายการ: องค์ประกอบแรกของ@_สององค์ประกอบแรกของ@_ฯลฯ ที่เกือบจะเป็นสิ่งที่จำเป็น แต่ปัญหาเรียกร้องรายการที่ว่างเปล่าก่อน ดังนั้นองค์ประกอบแรกของรายการกลับมาเป็นรายการที่ว่างเปล่าที่แท้จริงแล้วลดลงมากกว่ารายการป้อนข้อมูลจะถูกทำให้เป็นส่วนที่เหลือของรายการกลับมาด้วย(),|


2
O_o สิ่งที่เกิดขึ้นที่นี่
ASCII เท่านั้น



5

R , 40 39 ไบต์

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

ลองออนไลน์!

-1 ไบต์ต้องขอบคุณdigEmAll

ผลลัพธ์ของlistประเภทR นั้นค่อนข้างแปลก มันใช้การจัดทำดัชนีตามลำดับดังนั้นเช่นเอาท์พุทสำหรับ

list(1,2) คือ

[[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

การป้อนข้อมูลที่เป็นเวกเตอร์แทนจะช่วยให้รูปแบบการออก neater แม้แล้วปัจจัยการผลิตไม่ได้ในทางเทคนิคlists



@digEmAll ขอบคุณ!
Giuseppe


4

Mathematica, 22 21 ไบต์

-1 ไบต์ต้องขอบคุณMisha Lavrov !

{}~FoldList@Append~#&

ฟังก์ชั่นบริสุทธิ์ รับรายการเป็นอินพุตและส่งคืนรายการเป็นเอาต์พุต ฉันเชื่อว่านี่เป็นทางออกที่สั้นที่สุด


{}~FoldList@Append~#&เราสามารถเขียนวิธีการแก้ปัญหาเดียวกันมากขึ้นเป็นดาน
Misha Lavrov

@MishaLavrov ขอบคุณ! ฉันไม่คิดว่าจะใช้รูปแบบการโต้แย้ง 1 + 2 แบบ curried
LegionMammal978



3

PowerShellขนาด 65 ไบต์

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

ลองออนไลน์!

PowerShell เป็นประโยชน์หนึบรายชื่อของรายการเมื่อเริ่มต้นWrite-Outputเกิดขึ้นที่เสร็จสิ้นโปรแกรมเพื่อให้คุณได้รับหนึ่งรายการต่อบรรทัด แทคที่ a -join','เพื่อดูรายการของรายการที่ดีขึ้นโดยแปลงรายการด้านในเป็นสตริง

(Ab) ใช้ความจริงที่ว่าพยายามส่งออกอาเรย์ที่ว่างเปล่า (เช่น@()) ส่งผลให้ไม่มีเอาต์พุตดังนั้นอินพุตอาเรย์ที่ว่างเปล่าก็มีเพียงแค่''เป็นเอาท์พุทเนื่องจาก$a[0..$_]จะไม่มีผลอะไรเลย มันจะส่งข้อความผิดพลาดที่น่าตื่นเต้นออกไป


ห่อไว้ใน parens แทนการกำหนดมันจะช่วยประหยัด 20 ไบต์ นอกจากว่าคุณไม่คิดว่าจะนับเป็นการส่งคืนรายการ ฉันมักจะคลุมเครือในความแตกต่างนั้น
Veskah

@veskah ใช่นั่นเกือบจะเป็นสิ่งที่ฉันมีก่อนที่จะแก้ไขเป็นเวอร์ชันนี้ ปัญหาเกี่ยวกับวิธีแก้ไขปัญหาของคุณหรือวิธีแก้ไขปัญหาก่อนหน้าของฉัน - ไม่ได้ส่งคืนรายการของ TIO1 VS TiO2
AdmBorkBork

3

K (ngn / k) , 8 ไบต์

,\(,!0),

ลองออนไลน์!


1
นี่คือวูดูชนิดหนึ่ง ,\(,()),ใน K4 กำลังเข้าร่วมเกณฑ์ null พร้อมอินพุตที่เข้าร่วมหรือไม่ howsitwork?
streetster

1
@streetster ()เป็นรายการว่างเปล่า (,()),xprepends xมัน ในที่สุดก็,\ ทำการสแกน concat xถูกละไว้ในรูปแบบองค์ประกอบ โปรดทราบว่าการตามรอย,คือ dyadic ดังนั้นจึงเป็น "concat" ไม่ใช่ "enlist"
ngn

1
@streetster ใน k4 สามารถสั้นกว่า byte: 1_',\0,แต่ parser ของฉันไม่ฉลาดพอที่จะจัดการกับเรื่องนี้ ...
ngn

3

Lisp ทั่วไป , 39 ไบต์

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

ลองออนไลน์!

คำอธิบาย

(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 ไบต์

ฉันได้คำตอบที่คล้ายกันสองข้อนี้มาจากความยาวเดียวกัน พวกเขาทั้งสองใช้ลำดับทั่วไปsเป็นพารามิเตอร์

วิธีแก้ปัญหาแรก:

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

ลองออนไลน์!

Seq.takeใช้nองค์ประกอบแรกของลำดับ Seq.initสร้างลำดับใหม่ที่มีการนับ (ในกรณีนี้) ความยาวของลำดับsบวก 1 และสำหรับองค์ประกอบในแต่ละลำดับเตะแรกองค์ประกอบในns

ทางออกที่สอง:

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

คล้ายกับก่อนที่จะยกเว้นมันจะสร้างลำดับจาก 0 sถึงความยาวของ จากนั้นใช้องค์ประกอบจำนวนsนั้น

ลองออนไลน์ด้วยเช่นกัน!


fun s->Seq.map(fun n->Seq.take n s){0..Seq.length s} ประหยัด 1 ไบต์
ศูนย์รวมของความไม่รู้

3

MATL, 15 12 ไบต์

บันทึก 3 ไบต์ด้วย @Giuseppe

vin:"G@:)]Xh

ลองมันที่MATL ออนไลน์

เนื่องจากวิธีที่ MATL แสดงผลลัพธ์คุณจะไม่สามารถเห็นอาร์เรย์ว่างในเซลล์อาร์เรย์ได้อย่างชัดเจน นี่คือรุ่นที่แสดงผลลัพธ์เล็กน้อยอย่างชัดเจน

คำอธิบาย

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

ใช้แทนv []และไม่ได้:ใช้1เป็นอาร์กิวเมนต์แรกเริ่มต้นใช่หรือไม่ นี่อาจเป็นvin:"G@:)]Xh12 ไบต์
Giuseppe

@iuseppe ขอบคุณ! MATL ของฉันดูสนิมนิดหน่อย :(
Suever


2

ถ่าน 6 ไบต์

Eθ…θκθ

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

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

เป็นไปได้ที่ค่า 1 ไบต์เพื่อขอให้ Charcoal พิมพ์n+1อาร์เรย์องค์ประกอบซึ่งรวมถึงอินพุตเป็นองค์ประกอบสุดท้ายของมัน แต่ผลลัพธ์นั้นเหมือนกันแม้ว่าตำแหน่งเคอร์เซอร์จะแตกต่างกันหากคุณไปพิมพ์สิ่งอื่น



2

RAD , 7 ไบต์

(⊂⍬),,\

ลองออนไลน์!

สิ่งนี้ยังทำงานใน Dyalog APL เป็นฟังก์ชัน

อย่างไร?

สิ่งนี้ใช้ได้เหมือนกันทั้ง APL และ RAD เนื่องจากมีความสัมพันธ์ใกล้ชิด

  • (⊂⍬) อาร์เรย์ที่ว่างเปล่า
  • , ผนวกกับ
  • ,\ คำนำหน้า (ซึ่งไม่รวมอาร์เรย์ว่าง)



2

brainfuck , 43 ไบต์

ใช้รายการอักขระที่ไม่ใช่ null เป็นอินพุตและส่งคืนคำนำหน้าทั้งหมดคั่นด้วยบรรทัดใหม่ ต้องใช้สองครั้งไม่มีที่สิ้นสุดหรือเทปห่อ

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

ลองออนไลน์!


คำตอบอีกข้อหนึ่งทำให้ฉันมากกว่าครึ่งเพราะฉันไม่ได้คิดถึงการพิมพ์ในขณะที่อ่าน แน่นอนว่าวิธีการดังกล่าวจะไม่สามารถใช้ได้กับการพิมพ์คำต่อท้ายที่เพิ่มขึ้น
user202729

40 ไบต์พร้อมการจัดเรียงใหม่
Jo King

2

C # (Visual C # Interactive Compiler) , 39 ไบต์

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

ลองออนไลน์!


คุณต้องรวมถึงการใช้System.Linq; ใน bytecount ของคุณ และดูเหมือนว่าตรรกะเอาต์พุตบางตัวของคุณอยู่ในเอาต์พุตของอาร์เรย์ เพราะอาเรย์ที่ว่างเปล่าเพียงแค่ส่งกลับอาเรย์ที่ว่างเปล่า
LiefdeWen

@LiefdeWen - ความเข้าใจของฉันคือเนื่องจากล่ามนี้มีการอ้างอิงถึงSystem.Linqฉันไม่จำเป็นต้องรวมสิ่งนี้ในการนับไบต์ .NET Coreการส่งของฉันจะได้รับการพิจารณาเป็นภาษาที่แตกต่างกันมากกว่าพูด github.com/dotnet/roslyn/wiki/C%23-Interactive-Walkthrough - คุณพูดถึงการพิมพ์ซึ่งเป็นปัญหาที่แยกต่างหากฉันต้องการได้ความชัดเจนในครั้งแรก
dana

เกี่ยวกับการพิมพ์นี่คือรุ่นที่ทิ้งผลลัพธ์ไปที่คอนโซลโดยทั่วไป - tio.run/##XY29CsIwGEX3PEXGBGKhtVt/ - ไม่สวยแน่นอน! คำถามที่ผมมีคือเมื่อมันเป็นที่ยอมรับในการใช้ArrayVS VSIList IEnumerable
dana

2

F # (โมโน) 45 ไบต์

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

ลองออนไลน์!

ฉันไม่แน่ใจว่าทั้งหมดนี้ถูกต้องหรือไม่ แต่ดูเหมือนว่าจะเป็นไปตามไวยากรณ์ "lambda แบบไม่ระบุชื่อ" แบบเดียวกับที่ฉันใช้ในภาษาอื่นหลายภาษา


2

Java 8+ , 86 77 ไบต์

-9 ไบต์ขอบคุณKevin Cruijssen (กำจัดการนำเข้า)!

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

ลองออนไลน์!

ทางเลือก 65 ไบต์

ข้อมูลต่อไปนี้จะพิมพ์ผลลัพธ์ไปยังstdout (เนื่องจากOlivier Grégoire ):

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

ลองออนไลน์


คุณสามารถเล่นกอล์ฟได้ถึง 77 ไบต์เพียงแค่ใช้java.util.stream.IntStreamโดยตรงและนำเข้า
Kevin Cruijssen

@KevinCruijssen: โอ้ขอบคุณ! ฉันไม่รู้ด้วยซ้ำว่าสิ่งนี้เป็นไปได้มีประโยชน์แน่นอน (อย่างน้อยก็เพื่อจุดประสงค์ในการเล่นกอล์ฟ)
ბიმო

x->{for(int i=0;i<=x.size();)System.out.println(x.subList(0,i++));}( 67 ไบต์ ) สิ่งนี้พิมพ์แทนการใช้สตรีม การพิมพ์มักจะเป็นวิธีที่สั้นที่สุดในการส่งออกโครงสร้างที่ซับซ้อน
Olivier Grégoire

@ OlivierGrégoire: ในกรณีนี้คุณอาจหนีไปได้System.out.printเนื่องจากเอาต์พุตยังไม่ชัดเจน
იოო

@BMO แน่นอนว่าจะเป็นไปได้!
Olivier Grégoire


2

Ruby , 31 29 ไบต์

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

ลองออนไลน์!

คำอธิบาย:

->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
  }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.