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


17

แรงจูงใจ : บางครั้งบางรายการในรายการจะไม่นับรวมกับยอดรวมของคุณ ตัวอย่างเช่นการนับจำนวนผู้โดยสารเครื่องบินในแถวที่ทารกนั่งอยู่บนตักของผู้ปกครอง

ท้าทาย : เขียนโปรแกรมในการแยกรายชื่อของรายการเป็นชิ้น แต่ละอัน (ยกเว้นอาจเป็นครั้งสุดท้าย) มีขนาดเท่ากันซึ่งขนาดถูกกำหนดเป็นจำนวนรายการที่ผ่านฟังก์ชันเพรดิเคต

กฎ :

  1. โปรแกรมของคุณต้องใช้
    • รายการของรายการ
    • ขนาดก้อนจำนวนเต็มบวก
    • ฟังก์ชันเพรดิเคต (รับไอเท็มและส่งคืนจริงหรือเท็จ)
  2. คุณต้องส่งคืนรายการอินพุตแยกเป็นชิ้น ๆ
  3. แต่ละอันคือรายการของรายการ
  4. โดยรวมแล้วรายการจะต้องอยู่ในลำดับเดียวกันโดยไม่มีใครสนใจ
  5. จำนวนรายการที่ผ่านเพรดิเคตในแต่ละก้อน (ยกเว้นอาจเป็นรายการสุดท้าย) ควรตรงกับขนาดของก้อนข้อมูลเข้า
  6. รายการที่ล้มเหลวเพรดิเคตไม่ควรนับรวมกับขนาดนี้
  7. รายการที่ล้มเหลวของกริยาคือ
    1. ยังคงรวมอยู่ในกลุ่มเอาต์พุต
    2. จัดสรรให้กับชิ้นแรกสุดในกรณีที่ชิ้นเป็น "เต็ม" แต่รายการถัดไปเป็นรายการที่ล้มเหลวในเพรดิเคต
      • ดังนั้นชิ้นสุดท้ายอาจไม่เพียง แต่ประกอบด้วยรายการที่ล้มเหลวของเพรดิเคต
  8. ก้อนสุดท้ายอาจมีขนาดน้อยกว่าขนาดก้อนเนื่องจากรายการทั้งหมดได้รับการพิจารณา

ตัวอย่างที่ไม่ครบถ้วนสมบูรณ์:

ตัวอย่างที่ง่ายที่สุดคือการพิจารณา1และ0s x ==> x > 0ที่ฟังก์ชั่นการวินิจฉัยคือ ในกรณีนี้sumแต่ละอันจะต้องตรงกับขนาดของก้อน

  • รายการ: [], ขนาด: 2, เพรดิเคต: x > 0-> อย่างใดอย่างหนึ่ง[]หรือ[[]]
  • รายการ: [0, 0, 0, 0, 0, 0], ขนาด: 2, เพรดิเคต: x > 0->[[0, 0, 0, 0, 0, 0]]
  • รายการ: [0, 1, 1, 0], ขนาด: 2, เพรดิเคต: x > 0->[[0, 1, 1, 0]]
  • รายการ: [0, 1, 1, 0, 1, 0, 0], ขนาด: 2, เพรดิเคต: x > 0->[[0, 1, 1, 0], [1, 0, 0]]
  • รายการ: [0, 1, 0, 0, 1, 0, 1, 1, 0], ขนาด: 2, เพรดิเคต: x > 0->[[0, 1, 0, 0, 1, 0], [1, 1, 0]]

และขอจบด้วยผู้โดยสารเครื่องบินที่ทารกนั่งบนตักของผู้ปกครองตัวอย่างเช่น Aสำหรับผู้ใหญ่bสำหรับทารกแถวเครื่องบิน3กว้างที่นั่งผู้ใหญ่ระบุไว้เสมอก่อนที่ลูกของพวกเขา:

  • รายการ: [A, b, A, b, A, A, A, b, A, b, A, A, b], ขนาด: 3, เพรดิเคต: x => x == A->[[A, b, A, b, A], [A, A, b, A, b], [A, A, b]]

6
ดูเหมือนว่าเป็นคำถามที่ดี แต่ขณะนี้ยังไม่มีเกณฑ์การชนะ ผมขอแนะนำให้ใช้รหัสกอล์ฟ
Laikoni

3
เราสามารถสมมติว่ารายการเป็นอักขระตัวเดียวได้หรือไม่? หรือว่าพูดตัวเลข?
xnor

chunkingเสียงที่น่าสนใจ แต่อาจจะถูกแทนที่ด้วยชุดพาร์ทิชัน
Jonathan Frech

@Laikoni ติดแท็กcode-golf
Tom Viner

1
@Ourous ฉันได้เพิ่ม "เพราะรายการทั้งหมดได้รับการพิจารณา" นั่นคืออันสุดท้ายไม่มีโอกาสที่จะได้รับ "เต็ม" เพราะนั่นเป็นเพียงจุดสิ้นสุดของรายการอินพุต
Tom Viner

คำตอบ:


2

เยลลี่ 10 ไบต์

vⱮTm⁵ḊœṖŒṘ

โปรแกรมเต็มรูปแบบรับฟังก์ชั่นกล่องดำ monadic เป็นอาร์กิวเมนต์ตัวเลือกแรกรายการเป็นอาร์กิวเมนต์ตัวเลือกที่สองและขนาด chunk เป็นอาร์กิวเมนต์ตัวเลือกที่สามซึ่งพิมพ์การแสดง Python ของรายการผลลัพธ์ของรายการ รายการที่มีอักขระ)

ลองออนไลน์! (โปรดทราบว่ารายการของตัวละครจะถูกส่งผ่านไปยังโปรแกรม Jelly โดยจัดรูปแบบเป็นสตริงที่อ้างถึง Python)

อย่างไร?

vⱮTm⁵ḊœṖŒṘ - Main Link: B, L, S
 Ɱ         - map across second argument with (i.e. for X in L):
v          -   evaluate as a monad with input (i.e. B(X))
  T        - truthy indices (e.g. [0,0,1,0,1,1,1,0,0,0,1,0,0]T -> [3,5,6,7,10])
    ⁵      - 3rd optional argument = S
   m       - modulo slice   (e.g. [3,4,7,9,12,15,16,18,19,20]m3 -> [[3,4,7],[9,12,15],[16,18,19],[20]]
     Ḋ     - dequeue        (e.g. [[3,4,7],[9,12,15],[16,18,19],[20]]Ḋ -> [[9,12,15],[16,18,19],[20]]
      œṖ   - partition right (L) at the indices in that
        ŒṘ - print Python representaion

8

Brachylogขนาด 37 ไบต์

hW&t~c.k{↰₂ˢl}ᵐ;WxĖ∧.bhᵐ↰₂ᵐ∧.t↰₂ˢl≤W∧

ลองออนไลน์!

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

สมมติว่าคำกริยานั้นอยู่ในรูปของภาคแสดง 2 ด้านล่างรหัสนี้ เอาต์พุตรายการของรายการ ("chunks") หรือfalseสำหรับอินพุตว่าง

คำอธิบาย:

hW&               % First input is W, the expected "weight" of each chunk
                  %  (i.e. the number of items passing predicate in each chunk)

t                 % Take the second input, the list of items
 ~c.              % Output is a partition of this list
    k{    }ᵐ      % For each partition (chunk) except the last, 
      ↰₂ˢ         %   Select the items in the chunk that pass the predicate
         l        %   Get the length of that
                  % (So now we have the list of the "weights" of each chunk)
            ;Wx   % Remove the input expected weight from this list, and 
               Ė  %  the result of this should be empty.
                  %  This verifies that the list of weights is either 
                  %  composed of all W-values, or is empty (when input is [0 0 0] for eg.)

    ∧.bhᵐ↰₂ᵐ      % And, the first element of each chunk (except the first) should
                  %  pass the predicate. This is another way of saying:
                  %  "Items failing the predicate are allocated to the earliest chunk"

    ∧.t↰₂ˢl≤W     % And, the final chunk (which we haven't constrained so far)
                  %  should have weight ≤ the input expected weight
                  %  This disallows putting everything in the final chunk and calling it a day!

    ∧             % (no further constraints on output)

7

Apl (Dyalog Unicode) 17 16 ไบต์(SBCS)

ขอบคุณAdámที่ช่วยฉัน 1 ไบต์

w⊆⍨⌈⎕÷⍨1⌈+\⎕¨w←⎕

ลองออนไลน์! เพื่อวัตถุประสงค์ในการอธิบายฉันจะทิ้งโซลูชั่น 17 ไบต์

{⍵⊆⍨⌈⍺÷⍨1⌈+\⍺⍺¨⍵}

⍺⍺¨⍵แสดงคำกริยาให้กับรายการที่คืนค่าเวกเตอร์บูลีนที่
+\สร้างผลรวม
1⌈แทนที่การทำงานชั้นนำ0ที่มี1s
⌈⍺÷⍨หารแต่ละองค์ประกอบด้วยขนาดก้อนและปัดเศษ
⍵⊆⍨พาร์ติชันเวกเตอร์ดั้งเดิมด้วยสิ่งนี้


2
น่าประทับใจมาก! และฉันชอบจอแสดงผลภาพที่เหมาะสมสำหรับปัญหา
sundar - Reinstate Monica

บันทึกไบต์โดยการแปลงไปยังโปรแกรม (ร่างกาย tradfn):w⊆⍨⌈⎕÷⍨1⌈+\⎕¨w←⎕
อดัม

5

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

ใช้ฟังก์ชั่นที่มีชื่อf :: a -> Boolอนุญาตให้เป็นไปตามฉันทามติเมตา

import StdEnv,StdLib
$l n|l>[]=last[[i: $t n]\\i<-inits l&t<-tails l|n>=sum[1\\e<-i|f e]]=[]

ลองออนไลน์!

ขยาย (พร้อมการเน้นค่าเริ่มต้นเพื่อแสดงความคิดเห็น):

$ l n // define function $ on `l` and `n`
 | l > [] // if `l` is not the empty list
  = last [ // the last element of ...
                   \\ i <- inits l // prefixes of `l`
                    & t <- tails l // matching suffixes of `l`
                    | n >= // where n is greater than or equal to
                           sum [1 \\ e <- i | f e] // the number of matching elements in the prefix
          [i: $t n] // prepend that prefix to the application of $ to the rest of the list
         ]
 = [] // if `l` is empty, return empty

4

Java 10, 207 186 159 148 ไบต์

a->n->{var r=new java.util.Stack();int l=a.size(),i=0,c=0,j=0;for(;i<=l;i++)if(i==l||f(a.get(i))&&++c>n&i>0){r.add(a.subList(j,j=i));c=1;}return r;}

Java ไม่ใช่ภาษาที่เหมาะสมสำหรับความท้าทายนี้ (หรือความท้าทาย codegolf ใด ๆ .. )

-21 ไบต์ขอบคุณ@OOBalance

ลองออนไลน์

คำอธิบาย:

a->n->{                    // Method with List & int parameters & List of Lists return-type
  var r=new java.util.Stack();
                           //  Result-list, starting empty
  int l=a.size(),          //  Size of the input-List
      c=0,                 //  Count-integer, starting at 0
      j=0,                 //  Range-integer, starting at 0
  i=0;for(;i<=l;i++){      //  Loop `i` in the range [0, `l`]
    if(i==l||              //   If this is the last iteration
       f(a.get(i))         //   Or if the black-box function is true for the current item
       &&++c               //    Increase the counter by 1
        >n&                //    If the counter is now larger than the size
        &i>0){             //    and it's not the first item of the List
      a.subList(j,j=i);    //     Add a sub-List to the result from range [`j`, `i`)
                           //     And set `j` to `i` at the same time
      c=1;}                //     And reset `c` to 1
  return r;}               //  Return the List of Lists as result

รูปแบบอินพุตของกล่องดำ:

ถือว่าฟังก์ชั่นที่มีชื่อboolean f(Object i)อยู่ซึ่งได้รับอนุญาตตามคำตอบเมตานี้นี้

ฉันมีระดับนามธรรมTestที่มีฟังก์ชั่นเริ่มต้นf(i)เช่นเดียวกับแลมบ์ดาข้างต้น:

abstract class Test{
  boolean f(Object i){
    return true;
  }

  public java.util.function.Function<java.util.List, java.util.function.Function<Integer, java.util.List<java.util.List>>> c =
    a->n->{var r=new java.util.Stack();int l=a.size(),i=0,c=0,j=0;for(;i<=l;i++)if(i==l||f(a.get(i))&&++c>n&i>0){r.add(a.subList(j,j=i));c=1;}return r;}
  ;
}

สำหรับกรณีทดสอบฉันเขียนทับฟังก์ชันfนี้ ตัวอย่างเช่นกรณีทดสอบล่าสุดถูกเรียกเช่นนี้:

System.out.println(new Test(){
  @Override
  boolean f(Object i){
    return (char)i == 'A';
  }
}.c.apply(new java.util.ArrayList(java.util.Arrays.asList('A', 'b', 'A', 'b', 'A', 'A', 'A', 'b', 'A', 'b', 'A', 'A', 'b'))).apply(3));

1
" (or any codegolf-challenge of course..)" เอ๊ะฉันไม่ได้คุณกำจัดคำตอบที่สะอาดในบางกรณี อย่างไรก็ตามฉันมักจะรอคำตอบของคุณ
Οurous

2
@ Οurousเป็นมากกว่า meme ที่ Java ไม่เหมาะสำหรับ codegolf ในทางใดทางหนึ่งซึ่งฉันคิดว่าใช้กับ Clean เช่นกันถ้าเราเปรียบเทียบกับภาษากอล์ฟจริงเช่น Jelly, 05AB1E เป็นต้นฉันยังสนุกกับการแก้ codegolf เหล่านี้ทั้งหมด ใน Java แม้ว่า (และคุณใน Clean เช่นกันฉันถือว่า) และครั้งเดียวใน (ยาว) ในขณะที่Java เป็นสามารถที่จะเอาชนะงูหลาม ;) และฉันเคยเป็นคำตอบชั้นนำกับ Javaจนทุบตีมันทำลาย (และ R golfed เพิ่มเติม) xD
Kevin Cruijssen

1
186 ไบต์ถ้าคุณส่งคืนรายการอาร์เรย์: bit.ly/2mSjCIc
OOBalance

@OOBalance ขอบคุณ! ใช้อย่างชาญฉลาดArrays.copyOfRange!
Kevin Cruijssen

@OOBalance .sublistรับสามารถที่จะเล่นกอล์ฟมากขึ้นอีกนิดโดยใช้การป้อนข้อมูลที่เป็นรายการและการใช้ ฟังก์ชันการทำงานของคุณยังคงเหมือนเดิมนอกเหนือจากนั้น แต่จะช่วยประหยัดจำนวนมากและลบการนำเข้า (และตอนนี้มันก็ใช้ได้กับกรณีทดสอบด้วยตัวอักษรแทนที่จะเป็นจำนวนเต็ม)
Kevin Cruijssen


3

C (gcc) , 70 66 ไบต์

ฉันใช้โครงสร้างเพื่อบันทึกจุดเริ่มต้นของรายการย่อยเนื่องจาก C ไม่ทราบเกี่ยวกับสิ่งต่าง ๆ

ขอบคุณ Ceilingcat สำหรับคำแนะนำ

t;f(a,s,c)l*a;int(*c)();{for(;a->v;a++)(t+=c(a->v))>s?t=++a->s:0;}

ลองออนไลน์!


3

Haskell, 72 ไบต์

p#s|let l@(h:t)!a|sum[1|e<-h:a,p e]>s=a:l![]|n<-a++[h]=t!n;_!a=[a]=(![])

ลองออนไลน์!

p#s     = (![])         -- main function that takes a predicate function 'p',
                        -- a size 's' and a input list without a name that is
                        -- directly passed as the first argument to function '!'
  let  l@(h:t)!a        -- function '!' is a local function (so that 'p' and 's'
                        -- are in scope). Takes a list 'l' of at least one element
                        -- 'h' (and 't' being the rest of the list) and an
                        -- accumulator 'a'
   |sum[1|e<-h:a,p e]>s -- if 'p' holds for more than 's' elements in 'h' and 'a'
     =a:l![]            --   put 'a' in front of a recursive call with the same list
                        --   'l' and an empty accumulator
   |n<-a++[h]           -- else bind 'n' to 'h' appended to 'a' and
     =t!n               --   call '!' again with 't' and 'n'
  _!a=[a]               -- base case for '!'. If the input list is empty, return
                        --   a singleton list with 'a' 

3

MATL, 19 ไบต์

HyX$Ysi/Xk1y>+!w7XQ

ขึ้นอยู่กับคำตอบ APL jslip ยอดเยี่ยม

MATL ไม่ได้มีฟังก์ชั่นที่ผู้ใช้กำหนดเอง แต่มันมีวิธีที่จะเรียกสภาพแวดล้อมที่มันกำลังทำงานอยู่ (MATLAB / Octave) ดังนั้นสิ่งนี้จึงใช้สำหรับฟังก์ชั่นเพรดิเคต การใช้งานจะเป็นแบบนี้แต่ฟังก์ชั่นนั้นถูกปิดการใช้งานออนไลน์เพื่อเหตุผลด้านความปลอดภัยดังนั้นนี่คือรุ่นที่ใช้isoddฟังก์ชั่นเพรดิเคตของhardcoded แทน: ลองใช้งานบน MATL Onlineออนไลน์

H    % Push the function name to be called, assumed to be 
     %  stored in the H clipboard
y    % Take the first input, push copies of it both below and above the 
     %  function name
X$   % Call the function (say 'isupper') with the input as argument
     %  returns a boolean vector
Ys   % Cumulative sum
i/   % Take the chunk size and divide each element by it
Xk   % ceil
1y>+ % Turn the (initial) 0s to 1s
!    % Transpose. Now we have a column vector specifying which chunk 
     %  each input element should go into
w    % Bring the other copy of the input on top 
7    % Code for this function: '@(x){x.'}'
     %  i.e. place each chunk in a row vector and enclose it in a cell
XQ   % 'accumarray' - split the input into chunks based on
     %   the given column vector, apply the given function to each chunk
     %   (which here just wraps it up as a cell), and accumulate the results
     %   in an array.
     % implicit output

2

JavaScript (ES6), 69 ไบต์

บันทึก 3 ไบต์ขอบคุณ @tsh

(size)(predicate)(array)จะเข้าในไวยากรณ์ currying

s=>p=>g=a=>a.every(x=>p(x)?k--:++j,j=k=s)?[a]:[a.splice(0,j),...g(a)]

ลองออนไลน์!



@tsh การเพิ่มประสิทธิภาพที่ดี ขอบคุณ!
Arnauld

2

Ruby , 57 ไบต์

->a,n,g{c=-1;a.group_by{|x|[0,c+=g[x]?1:0].max/n}.values}

ลองออนไลน์!

แลมบ์ดาไม่ประสงค์ออกนามยอมรับการป้อนข้อมูลอาร์เรย์aขนาดก้อนและกริยาn gรักษาเคาน์เตอร์cของรายการที่ตรงกับเพรดิเคตและจัดกลุ่มรายการตามจำนวนชิ้นที่ใช้หมดแล้ว น่าเสียดายที่ค่าเริ่มต้น -1 / n ไม่ได้ถึง 0 ดังนั้นเราต้องใช้เวลาสองสามไบต์เพื่อแก้ไข


2

R , 100 ไบต์

function(L,K,P,s=sapply(L,P),y=cut(cumsum(s),seq(0,sum(s),K),,T))for(l in levels(y))cat(L[y==l],"
")

ลองออนไลน์!

outgolfed คล่องแคล่วโดยdigEmAll


ฉันไม่ทราบว่ารายการที่มีชื่อเนื่องจากการส่งออกเป็น ok (และถ้าฉันพลาดบางกรณีขอบ ... ): 65 ไบต์
digEmAll

อืมฉันก็โพสต์นั้นเป็นคำตอบแยกต่างหาก!
Giuseppe



1

Mathematica, 82 ไบต์

f[l_,s_,p_]:=Last@Reap[i=t=-1;Do[If[p@e,If[++i~Mod~s==0&&i>0,t++]];e~Sow~t,{e,l}]]

Ungolfed:

f[l_,s_,p_] :=                (* define a function that takes three    *)
                              (* arguments                             *)

  Last@Reap[                  (* collect and return results which were *)
                              (* gathered by the procedural loop below *)

    i=t=-1;                   (* initialize two counters               *)

    Do[                       (* start iterating over the list         *)

      If[p@e,                 (* if element passes predicate           *)
        If[                   (* then if preincremented i is 0 modulo  *)
          ++i~Mod~s==0&&i>0,  (* chunk size and i > 0                  *)
          t++                 (* increment t                           *)
        ]
      ];e~Sow~t,              (* finally sow the element tagged with   *)
                              (* the current value of t                *)

    {e,l}]                    (* e references current element of list  *)
                              (* l is the list itself                  *)
  ]

lเป็นรายการอินพุต sขนาดก้อน; pเป็นฟังก์ชั่นที่ไม่มีชื่อ / ไม่ระบุชื่อ / บริสุทธิ์ / แลมบ์ดาที่ส่งกลับการดำเนินงานจริง / เท็จในองค์ประกอบของรายการ

Last@Reap[...]กลับรายการของรายชื่อของทุกองค์ประกอบที่เป็นSowภายใน -n ...ของ พวกเขาจะถูกจัดกลุ่มเป็นรายการย่อยโดยอาร์กิวเมนต์ที่สองe~Sow~tซึ่งเป็นการจดชวเลขSow[e, t]ซึ่งเป็นชวเลข

ฉันต้องเริ่มต้นเคาน์เตอร์ถึง -1 เพื่อจัดการกับขนาดก้อน 1 มิฉะนั้นฉันจะต้องตรวจสอบMod[i, s](i~Mod~s ) เท่ากับ 1 ซึ่งไม่สามารถเกิดขึ้นได้

ส่วนที่เหลือของรหัสได้อธิบายไว้ในบล็อกที่ไม่ได้รับการดัดแปลง

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