การทำบัญชีสำหรับ Bob-omb เพศ (ตรวจสอบว่าผลรวมการทำงานที่เคยได้รับต่ำเกินไป)


15

เชื่อหรือไม่ว่าSex Bob-ombsได้กลายเป็นวงดนตรีที่โด่งดังไปทั่วโลกและกำลังอยู่ในระหว่างการทัวร์รอบโลก! ในฐานะผู้ทำบัญชีของพวกเขาคุณจะต้องดูแลด้านการเงินแบบวันต่อวันและจัดทำรายงานเป็นประจำ

ทุกสองสามสัปดาห์คุณจะรวบรวมรายการค่าใช้จ่ายของพวกเขา (ทั้งUSD ) ตามลำดับที่เกิดขึ้น

ตัวอย่างเช่นรายการ

378
-95
2234

หมายความว่ามีการฝากเงิน $ 378 ไปยังบัญชีของพวกเขาและหลังจากนั้นก็ถอนเงิน $ 95 และหลังจากนั้นก็ฝาก $ 2234

คุณต้องการให้แน่ใจว่าผลรวมการทำงานของค่าเหล่านี้ไม่เคยไปด้านล่างค่าเกณฑ์T คุณตัดสินใจที่จะเขียนโปรแกรมเพื่อทำสิ่งนี้ให้คุณ

ท้าทาย

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

คุณสามารถใช้วิธีป้อนข้อมูลตามปกติ (stdin, จากไฟล์, บรรทัดคำสั่ง, อาร์กิวเมนต์ไปยังฟังก์ชัน)

  • ที่จุดเริ่มต้นของรายการผลรวมสะสมคือ 0 ดังนั้นค่าTหมายถึงผลลัพธ์จะผิดพลาดเสมอ
  • + จะไม่เป็นจำนวนเต็มบวก
  • รายการอาจประกอบด้วย 0
  • รายการอาจว่างเปล่า

กรณีทดสอบ

Tคือ -5 ในสิ่งเหล่านี้ทั้งหมด

Falsy:

-6
1
2
3
-20
200
-300
1000

Truthy:

[empty list]
-5
4
-3
-6

เกณฑ์การให้คะแนน

การส่งที่มีไบต์น้อยที่สุดจะเป็นผู้ชนะ Tiebreaker ไปที่การโพสต์ที่ส่งเร็วที่สุด

ความคิดเห็นที่น่าเศร้าที่บังคับให้ฉันทำสิ่งนี้


1
กรณีทดสอบจำเป็นต้องมี T = 5, L = [10] บางทีฉันอาจจะพลาดประเด็นทั้งหมด
edc65

1
@ edc65 "ที่จุดเริ่มต้นของรายการผลรวมสะสมคือ 0 (ดังนั้นค่า T หมายถึงผลลัพธ์จะเป็นเท็จเสมอ)"
Martin Ender

@optimizer ไม่ต้องเสียใจฉันได้รับการอ้างอิงของคุณ <3
undergroundmonorail

@undergroundmonorail สายเกินไป และมีลิงค์อยู่ในนั้น
เครื่องมือเพิ่มประสิทธิภาพ

คำตอบ:


2

gs2 - 6 ไบต์

สมมติว่ารายการอยู่ด้านบนสุดของสแต็กและขีด จำกัด อยู่ใน register A ในตัวช่วยจำ:

inits
sum get-a lt filter3
not

ในไบต์:

78 64 D0 70 F2 22

ฟังก์ชั่นนี้เทียบเท่ากับใน gs2 หรือไม่? โดยพื้นฐานแล้วคุณสามารถปรับสมมติฐานของคุณให้มากขึ้นได้หรือไม่? (ฉันน่าจะยอมรับได้ถ้าคุณทำ)
Calvin's Hobbies

gs2 ไม่มีฟังก์ชั่นจริงๆ แต่คุณสามารถใส่รหัสลงในบล็อคกดมันลงบนสุดของสแต็คและเรียกใช้ eval ได้เหมือนใน GolfScript หากคุณวางหกไบต์เหล่านี้ในบล็อกและประเมินในสถานการณ์ที่ฉันอธิบายรายการด้านบนของสแต็กจะถูกแทนที่ด้วยคำตอบ (0 สำหรับเท็จ 1 สำหรับจริง) เช่นเดียวกันหากคุณนำหน้ารหัสนี้ด้วยรหัสบางรายการที่ผลักรายการและกำหนดเกณฑ์การลงทะเบียน A คุณจะได้รับผลลัพธ์ที่ถูกต้อง
ลินน์

มันทำงานในลักษณะที่คล้ายกับโซลูชั่นอื่น ๆ initsเป็นเหมือนใน Haskell: "abcd" inits["" "a" "ab" "abc" "abcd"]ทำให้ทุกคำนำหน้า จากนั้นเราก็กรองด้วย "แลมบ์ดา" สามคำสั่งซึ่งเป็น__ __ __ F2ใน bytecode: Aเรามองหาคำนำหน้าทั้งหมดซึ่งรวมเป็นน้อยกว่าสิ่งที่อยู่ใน จากนั้นnotกำหนดว่ารายการว่างเปล่า
ลินน์

11

Haskell, 22 ไบต์

f t=all(>=t).scanl(+)0

การใช้งาน: f (-5) [4,-3,-6]ผลลัพธ์Trueใด

ทำรายการผลรวมย่อยและตรวจสอบว่าองค์ประกอบทั้งหมดเป็น> = t

แก้ไข: แก้ไขข้อผิดพลาดสำหรับรายการที่ว่างเปล่าและบวกts


@ MartinBüttner: เริ่มต้น0ไม่ได้อยู่ในรายการตามที่scanl1ส่งกลับรายการว่างถ้าป้อนด้วยรายการที่ว่างเปล่า แต่allจับกรณีที่ ผลตอบแทนf (-5) [] True
nimi

@ MartinBüttner: โอ๊ะคุณพูดถูก พลาดกรณีนั้นและแก้ไข ขอบคุณ!
nimi

7

Python 2, 41

f=lambda a,t:t<=0<(a and f(a[1:],t-a[0]))

อาร์กิวเมนต์แรกคืออาร์เรย์ ที่สองคือผลรวมการทำงานขั้นต่ำ


6

J, 11 ไบต์

   */@:<:0,+/\

การทดสอบ

   _5 (*/@:<:0,+/\)  1 2 3 _20
0
   _5 (*/@:<:0,+/\)  >a: NB. empty list
1

ขอบคุณการปรับปรุง 1 ไบต์ FUZxxl

คำอธิบายสำหรับเวอร์ชันดั้งเดิม (*/@(<:0,+/\))

  • +/\ สร้างผลรวมสะสม (ผลรวม +/ของส่วนนำหน้า\)
  • 0,+/\ ผนวก 0 เข้ากับผลรวมสะสม
  • (<:0,+/\)อินพุตด้านซ้ายเล็กกว่าหรือเท่ากับ<:(องค์ประกอบของ) ผลลัพธ์ของ0,+/\ที่อินพุตด้านขวา
  • @ กับผลลัพธ์ก่อนหน้า
  • */ ผลิตภัณฑ์ขององค์ประกอบทั้งหมด (1 ถ้าองค์ประกอบทั้งหมดเป็น 1, 0 ถ้าองค์ประกอบคือ 0)

คุณสามารถทำได้*/@:<:0,+/\ สำหรับตัวละครตัวหนึ่งฉันคิดว่า
FUZxxl

6

APL, 8 10

∧.≤∘(0,+\)

นี่คือฟังก์ชันที่ใช้Tเป็นอาร์กิวเมนต์ด้านซ้ายและรายการเป็นอาร์กิวเมนต์ที่ถูกต้อง

  • 0,+\: ใช้ผลรวมของอาร์กิวเมนต์ที่ถูกต้องผนวกเข้ากับ 0
  • ∧.≤: อาร์กิวเมนต์ซ้ายมีขนาดเล็กกว่าหรือเท่ากับ (≤) มากกว่ารายการทั้งหมด (∧) ในอาร์กิวเมนต์ที่ถูกต้อง

ฉันลองสิ่งนี้ด้วยเช่นกัน "ดังนั้นค่าบวก T หมายความว่าผลลัพธ์จะเป็นเท็จเสมอ"
jimmy23013

@ user23013: ไอ้มัน มันได้รับการแก้ไขแล้ว แต่จะไม่ชนะ
marinus

4

Mathematica, 34 ไบต์

FreeQ[Accumulate@{0,##2},n_/;n<#]&

สิ่งนี้นิยามฟังก์ชัน Variadic ที่ไม่มีชื่อซึ่งใช้Tเป็นพารามิเตอร์แรกและธุรกรรมเป็นพารามิเตอร์ที่เหลือและส่งคืนบูลีน:

FreeQ[Accumulate@{0,##2},n_/;n<#]&[-5, 1, 2, 3, -20]
(* False *)

ฉันเช่นนี้เพราะผมจะทำให้การใช้งานของหายากค่อนข้าง##2ที่ "เครื่องหมาย" ขัดแย้งทั้งหมดจากสองเข้าไปในรายการ สำหรับรายละเอียดเพิ่มเติมให้ดูส่วนสุดท้ายในเคล็ดลับการเล่นกอล์ฟนี้


4

k, 8 ตัวอักษร

กริยา dyadic ที่ใช้ threshold เป็นอาร์กิวเมนต์แรกและรายการเป็น second สิ่งนี้สามารถใช้ได้กับ k ทุกเวอร์ชั่นรวมถึง Kona แบบโอเพ่นซอร์ส

&/~0<-\,

ใน k องค์ประกอบของฟังก์ชั่นนั้นทำได้โดยการเขียนหนึ่งและอีกอันเพื่อให้เราสามารถแยกสิ่งนี้ด้วยฟังก์ชั่น จากขวาไปซ้าย:

  • -\,ใช้จำนวนเงินที่ทำงานต่อเนื่องและลบออกจากเกณฑ์ (ถ้าfเป็น dyadic ให้f\ (a; b; c; ...) ขยายเป็น(a; a f b; (a f b) f c; ...). ,เพียงแค่รวมรายชื่อเข้าด้วยกัน) การแตกเกิดขึ้นเมื่อบางสิ่งมีค่าเท่ากับ 0 และการถอนออกมากเกินไปจะให้ค่าบวกอย่างเคร่งครัด
  • ~0<ไม่น้อยกว่า 0 k ไม่ได้มี<=โอเปอเรเตอร์ที่มากกว่าหรือเท่ากับจริงดังนั้นเราต้องโยนบูลีนไม่ได้อยู่ในค่าที่น้อยกว่า แต่การทดสอบนี้เพื่อดูว่าผลลัพธ์ไม่เป็นเชิงลบหรือไม่ มันใช้กับแต่ละอะตอมในรายการโดยอัตโนมัติ
  • &/เป็นเท่าของตรรกะและในรายการ (สำหรับfdyadic) ดังนั้นนี่เป็นการทดสอบว่าบูลีนทุกตัวในรายการนั้นเป็น True หรือไม่

ตัวอย่าง:

  (&/~0<-\,)[-5; 1 2 3 -20]
0
  f:&/~0<-\,  /assign to a name
  f[-5; 4 -3 -6]
1

ฉันอาจเพิ่ม 2 ตัวอักษรสำหรับ parantheses และคุณสามารถโกน 1 ถ่านออกถ้าคุณทำ~|/>+\,
tmartin

@tmartin Monadic >คือ "เรียงลำดับเรียงลำดับจากมากไปน้อย" ดังนั้น~|/>+\,จะให้ความจริงเฉพาะเมื่อรายการอินพุตว่างเปล่า ...
algorithmshark

อาคุณพูดถูกความผิดของฉัน
tmartin


3

Pyth, 16 15

!sm>vzs+0<QdhlQ

ลองมัน ออนไลน์ด้วยอินพุต

-5
[4, -3, 6]

คำอธิบาย:

                   Implicit: z and Q read 2 line from input
                   z = "-5" (this is not evaluated, it's a string)
                   Q = [4, -3, 6] (this is a list though)
 m         hlQ     map each number d in [0, 1, 2, ..., len(Q)] to:
  >vz                 the boolean value of: evaluated z > 
     s+0<Qd                                 the sum of the first d elements in Q 
!s                  print the boolen value of: 1 > sum(...)

และอีกครั้งที่sฟังก์ชั่นโง่เสียสองไบต์ ฉันคิดว่าฉันจะรายงานสิ่งนี้เป็นข้อผิดพลาดของ Pytho repo

แก้ไข: 13 (ไม่ถูกต้อง)

ขอบคุณ isaacg สำหรับการบันทึกหนึ่งไบต์ ( >1เป็น!) และสำหรับการเปลี่ยนการใช้งานsใน Pyth repo ตอนนี้รหัสต่อไปนี้เป็นไปได้ (แต่แน่นอนว่าไม่ถูกต้องสำหรับความท้าทายนี้)

!sm>vzs<QdhlQ

ฉันใช้มันบ่อยๆ ดูที่นี่: codegolf.stackexchange.com/questions/45264/fill-in-the-blanks/... มันจะบันทึก 2 ตัวอักษรในกรณีนี้ แต่จะสูญเสีย 5 ตัวในรายการของรายการ ฉันดูว่ามีจดหมายที่ไม่ได้ใช้เพื่อแยกสิ่งเหล่านี้ออกเป็นสองฟังก์ชันที่แตกต่างกันหรือไม่ นอกจากนี้คุณยังสามารถบันทึกตัวอักษรโดยใช้แทน! >1
isaacg

@isaacg การกำหนดผลรวมของรายการว่างเปล่าเป็น 0 (เกือบ) จะไม่ทำลายรหัส Pyth ใด ๆ ที่มีอยู่ รหัสเพียง #sYแต่มันจะแตกเป็น และขอขอบคุณสำหรับการบันทึก 1 ไบต์
Jakube

ฉันคิดว่ามันยุติธรรม - ข้อยกเว้นการขว้างปาไม่ได้ช่วยใคร แก้ไขแล้ว.
isaacg


3

Julia, 33 ไบต์

(T,l)->all(i->i>=T,cumsum([0,l]))

สิ่งนี้จะสร้างฟังก์ชั่นที่ไม่มีชื่อที่ยอมรับสองพารามิเตอร์Tและlและส่งคืนบูลีน

all()ฟังก์ชั่นไม่ทั้งหมดยกของหนักที่นี่ มันต้องใช้สองข้อโต้แย้ง: กริยาและ iterable สำหรับคำกริยาที่เราบอกว่าiหมายถึงมูลค่าปัจจุบันของ iterable i->ใช้ฟังก์ชั่นที่ไม่มีชื่อตามที่ระบุไว้ แล้วที่ซ้ำกันเราเปรียบเทียบiการใช้Ti>=T

เพื่อให้แน่ใจว่าจูเลียจะไม่ประหลาดใจกับการใช้cumsum()รายการที่ว่างเปล่าเราสามารถใช้เลขศูนย์ในการใช้งาน[0, l]ได้


3

โหมโรง , 144 136 ไบต์

นี่คือ ... ยาก ...

?
?(1- )v1+(1-
 ^    #       1) v #  -)1+(#
  v#         vv (##^v^+
   ^?+     v-(0## ^ #   01 #)(#)#
1         v#                  # )!

ฉันคิดว่าเสียง 6 เสียงเป็นสถิติใหม่สำหรับฉันแม้ว่าฉันจะแน่ใจว่ามีวิธีลดความดังกล่าวและกำจัดช่องว่างที่น่ารำคาญมากมาย การตรวจสอบเครื่องหมายของค่า (ดังนั้นการตรวจสอบว่าค่าหนึ่งมากกว่าอีกค่าหนึ่ง) ค่อนข้างยุ่งยากในโหมโรง

อินพุตและเอาต์พุตถูกกำหนดเป็นค่าไบต์ เมื่อคุณใช้ล่ามหลามคุณสามารถตั้งค่าNUMERIC_OUTPUT = Trueเพื่อให้คุณได้รับจริง ASCII หรือ0 1สำหรับการป้อนตัวเลขคุณจะต้องเพิ่มใหม่NUMERIC_INPUTตั้งค่าสถานะ (ฉันควรเผยแพร่ล่าม tweaked ของฉันในบางจุด)

โปรดทราบว่าพรีลูดไม่สามารถแยกความแตกต่างของรายการจาก0ภายในรายการได้ ดังนั้นเพื่อให้การทำธุรกรรมเป็นศูนย์ฉันกำลังอ่านTแล้วความยาวLของรายการแล้วก็การLทำธุรกรรม


2

CJam, 18 ไบต์

อีกวิธีในไบต์เดียวกันกับอีกวิธีหนึ่ง

q~_,),\f<1fb:)f<:&

รับอินพุตผ่าน STDIN ในรูปแบบของ <threshold> <array of transactions>

ลองออนไลน์ได้ที่นี่


1
ฉันคิดว่าคุณสามารถใช้f>:|!แทน:)f<:&
aditsu ออกเพราะ SE เป็นความชั่วร้าย

2

JavaScript (ES6) 38 33

แก้ไขข้อผิดพลาดสมดุลเริ่มต้น ขอบคุณ @martin & @rainbolt

F=(t,l)=>![r=0,...l].some(v=>(r+=v)<t)

ทดสอบในคอนโซล Firefox / FireBug

console.log(F(-5,[-6]),F(-5,[1,2,3,-20]),F(-5,[200,-300,1000]))
console.log(F(-5,[]),F(-5,[-5]),F(-5,[4,-3,-6]))
console.log(F(5,[10]),F(5,[]))

เท็จเท็จเท็จจริง
จริงจริง
เท็จเท็จ


2
ยอดเงินเริ่มต้นเป็นศูนย์ การฝากครั้งแรกคือ 10 แต่เราต่ำกว่าเกณฑ์ของเราแล้วก่อนที่การฝากครั้งแรกจะไปถึงธนาคาร
Rainbolt

2

Python 2.7 - 55 ไบต์

f=lambda T,l:all(T<=sum(l[:i])for i in range(len(l)+1))

print f(-5,[1,2,3,-20])โทรเช่น ทดสอบที่นี่

ขอบคุณ Jakube ที่ช่วย


2

> <>, 29 + 3 = 32 ไบต์

r0}&v >1n;n0<
&:&:<+^?=1l ^?(

วิ่งเหมือน

py -3 fish.py bookkeep.fish -v -5 4 3 -6

โดยที่ threshold คือตัวเลขแรก



1

Perl 6 (21 ไบต์)

{$^a>none [\+] 0,@^b}

เป็นฟังก์ชันที่รับอาร์กิวเมนต์เริ่มต้นและรายการองค์ประกอบ มันทำงานโดยการตรวจสอบว่าไม่มี ( โดยใช้ทางแยก ) ขององค์ประกอบที่อยู่ต่ำกว่าเกณฑ์ [\+]จะใช้สำหรับการสร้างผลรวมการทำงานเช่นให้[\+] 1, 2, 3 เพื่อต่อท้าย1, 3, 60,0ที่จุดเริ่มต้นของรายการเป็นสิ่งจำเป็นเนื่องจากข้อกำหนดที่เกณฑ์บวกควรล้มเหลวเสมอ

ค่อนข้างเหมือนกันกับโซลูชั่น Haskell เพียงแค่ในไวยากรณ์ของ Perl 6 (Perl 6 ใช้คุณสมบัติการเขียนโปรแกรมที่เป็นระเบียบมากมายจาก Haskell)


0

Perl - 20

ใช้รายการตัวเลขSTDINคั่นด้วยการขึ้นบรรทัดใหม่และใช้Tกับ-iแฟล็ก

die if$^I>($i+=$_)

+2 สำหรับ-iและตั้ง-nค่าสถานะ ค่าการออก255สำหรับความล้มเหลวและ0ความสำเร็จ

ทำงานด้วย:

echo -e "4\n3\n-6" | perl -i0 -ne'die if$^I>($i+=$_)'

0

Clojure, 45

(fn[T t](every? #(<= T %)(reductions + 0 t)))

เช่น

((fn[T t](every? #(<= T %)(reductions + 0 t))) -5 [1 2 3 -20])
;; =>false

หรือดีกว่า

(defn f[T t](every? #(<= T %)(reductions + 0 t)))

(testing
  (testing "tests from question"
    (is (false? (f -5 [-6])))
    (is (false? (f -5 [1 2 3 -20])))
    (is (false? (f -5 [200 -300 1000])))
    (is (true? (f -5 [-5])))
    (is (true? (f -5 [4 -3 -6])))
    (is (true? (f -5 []))))
  (testing "the start of the list the running sum is 0. So a positive T means the result is always falsy"
    (is (false? (f 5 [5])))
    (is (false? (f 5 [10])))
    (is (false? (f 5 [])))))

0

Java 8 - 153 ตัวอักษร

ฟังก์ชั่น golfed:

import java.util.stream.*;
boolean f(int t, IntStream s){int r=1;try{s.reduce(0,(a,b)->(a+b>=t)?(a+b):(a/(a-a)));}catch(Exception e){r=0;}return r==1;} 

Ungolfed:

import java.util.stream.*;

boolean f(int t, IntStream s) {
    int r=1;
    try {
        s.reduce(0,(a,b) -> (a+b>=t) ? (a+b) : (a/(a-a)));
    } catch(Exception e) {
        r=0;
    }

    return r==1;
} 

โปรแกรมควบคุม:

import java.util.stream.*;
import java.util.*;

public class A {
    // function f as above

    public static void main(String... args) {
        int t = -5;
        IntStream s = null;

        s = Arrays.asList(-6).stream().mapToInt(i->i);
        System.out.println(new A().f(t,s));

        s = Arrays.asList(1,2,3,-20).stream().mapToInt(i->i);
        System.out.println(new A().f(t,s));

        s = Arrays.asList(200,-300,1000).stream().mapToInt(i->i);
        System.out.println(new A().f(t,s));

        System.out.println("above false, below true");

        s = IntStream.empty();
        System.out.println(new A().f(t,s));

        s = Arrays.asList(4,-3,-6).stream().mapToInt(i->i);
        System.out.println(new A().f(t,s));

        s = Arrays.asList(-5).stream().mapToInt(i->i);
        System.out.println(new A().f(t,s));
}

}

เอาท์พุท:

bash-3.2$ javac A.java ; java A

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