Бухгалтерія для секс-бобів-омб (перевірте, чи не надто низька сума запущеної суми)


15

Вірите чи ні, Sex Bob-ombs стали всесвітньо відомою групою і в даний час знаходяться у світовому гастролі! Як їхній бухгалтер, ви повинні контролювати їх щоденні фінанси та регулярно надавати звіти.

Кожні кілька тижнів ви складаєте перелік їхніх витрат (у цілому USD ) у порядку, в якому вони були понесені.

Наприклад, список

378
-95
2234

означає, що на їх рахунок було внесено 378 доларів, а після цього було знято 95 доларів, а після цього 2234 доларів.

Ви хочете , щоб переконатися , що поточна сума цих значень не опускається нижче деякого порогового значення Т . Ви вирішили написати програму, щоб зробити це для вас.

Виклик

Напишіть програму або функцію, яка містить одне ціле число T і список цілих чисел. Якщо загальна сума у ​​списку цілих чисел колись менша за Т , то надрукуйте або поверніть хибне значення , інакше надрукуйте або поверніть триєдне значення.

Ви можете використовувати будь-які звичайні способи введення (stdin, з файлу, командного рядка, аргументів до функції).

  • На початку списку поточна сума дорівнює 0. Отже, позитивний T означає, що результат завжди хибний.
  • + ніколи не буде перед натуральними числами.
  • Список може містити 0.
  • Список може бути порожнім.

Випробування

T - у всіх цих випадках -5.

Фальсі:

-6
1
2
3
-20
200
-300
1000

Truthy:

[empty list]
-5
4
-3
-6

Оцінка балів

Виграє подання з найменшими байтами . Tiereaker переходить до найбільш ранніх публікацій.

Жалючий коментар, який змусив мене це зробити.


1
Тестовий випадок потрібен T = 5, L = [10]. Можливо, я повністю пропустив пункт
edc65

1
@ edc65 "На початку списку поточна сума дорівнює 0. (Отже, позитивний T означає, що результат завжди хибний.)"
Мартін Ендер

@optimizer не журіться, я отримав ваше посилання <3
undergroundmonorail

@undergroundmonorail занадто пізно. І там є посилання.
Оптимізатор

Відповіді:


2

gs2 - 6 байт

Припустимо, що список знаходиться на вершині стека, і поріг знаходиться в регістрі А. У мнемоніці:

inits
sum get-a lt filter3
not

У байт-коді:

78 64 D0 70 F2 22

Це дійсно еквівалент функції в gs2? В основному, ви можете виправдати свої припущення ще трохи? (Я, швидше за все, прийму, якщо ви це зробите.)
Захоплення Кальвіна

gs2 насправді не має функцій, але ви можете помістити якийсь код у блок, натиснути його на вершину стека та зателефонувати на нього eval, як у GolfScript. Якщо ви покладете ці шість байтів у блок і прирівняйте їх до описаної мною ситуації, список у верхній частині стека заміниться відповіддю (0 для помилкових, 1 - для істинних). Так само, якщо ви просто приставте цей код до якогось коду, який висуває список і призначає поріг для реєстрації А, ви отримаєте правильний результат.
Лінн

Це працює досить схожим чином, як і інші рішення. initsяк у Haskell: "abcd" inits["" "a" "ab" "abc" "abcd"]отримує нам усі префікси. Потім ми фільтруємо за допомогою "лямбда" з трьох команд, що знаходиться __ __ __ F2в байт-коді: шукаємо всі префікси, сума яких менша за все, що є A. Потім notвизначає, чи список порожній.
Лінн

11

Хаскелл, 22 байти

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

Використання: f (-5) [4,-3,-6]які виходиTrue .

Складіть список підсумків і перевірте, чи всі елементи> = t.

Редагувати: Виправлення помилок для порожнього списку та позитивних ts


@ MartinBüttner: Початковий 0відсутній у списку, оскільки scanl1повертає порожній список, якщо він подається з порожнім списком, але він allфіксує цей випадок. f (-5) []повертає True.
німі

@ MartinBüttner: На жаль, ви праві. Пропустив цю справу і виправив її. Спасибі!
німі

7

Пітон 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

Математика, 34 байти

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

Це визначає неназвану варіативну функцію, яка приймає Tяк перший параметр, а транзакції як параметри, що залишилися, і повертає булеву форму:

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

Мені це подобається, тому що я міг би скористатися досить рідкісним, ##2який "виплескає" всі аргументи з другого у списку. Більш детально див. Останній розділ у цій підказці для гольфу .


4

k, 8 char

Діадичне дієслово, яке бере за поріг перший аргумент, а список - як другий. Примітно, що це працює у будь-якій версії k, включаючи відкритий код Kona.

&/~0<-\,

У k склад композицій виконується лише шляхом написання однієї, а потім іншої, тому ми можемо розбити це за функціями. Справа наліво:

  • -\,приймає послідовні запущені суми і віднімає їх від порогу. (Якщо fдіадичний, то f\ (a; b; c; ...) розширюється до (a; a f b; (a f b) f c; ...)., Просто приєднується до списків разом.) Порушення навіть відбувається, коли щось дорівнює 0, а переоцінка дає суворо позитивні значення.
  • ~0<не 0 менше, ніж. k насправді не має <=оператора, який більше, ніж рівний або рівний , тому нам доведеться кидати булевий НЕ на менший, ніж це, але це тести на те, чи є результат непостижним. Він автоматично застосовується до кожного атома у списку.
  • &/- це складка логічного І над списком. (Для fдіадічного) Отже, це перевіряє, чи справді кожен булевий список у списку.

Приклади:

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

Я, мабуть, додав би два символи для парантезів. І ви можете поголити 1 ~|/>+\,
чару,

@tmartin Monadic >є " перехідною сортуванням перестановки", тому він відповідає ~|/>+\,дійсності лише тоді, коли список вводу порожній ...
Алгоритм

Ах ти маєш рацію, моя помилка.
tmartin


3

Піта, 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функція витрачає два байти. Думаю, я повідомлю про це як про помилку в Pyth 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 байт.
Якубе

Я думаю, що це справедливо - кидання винятків нікому не допомагає. Виправлено.
isaacg


3

Джулія, 33 байти

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

Це створює неназвану функцію, яка приймає два параметри, Tі l, і повертає булева.

Ця all()функція виконує всі важкі підйому тут. Він бере два аргументи: присудок і ітерабельний. Для присудка ми говоримо, що iпредставляє поточне значення ітерабельного, використовуючи неназвану функцію, задану i->. Потім на кожній ітерації ми порівнюємо iз Tвикористанням i>=T.

Щоб переконатися, що Юлія не вигадає використання cumsum()в порожньому списку, ми можемо застосувати нуль, використовуючи там [0, l].


3

Прелюдія , 144 136 байт

Це було ... важко ...

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

Я думаю, що 6 голосів - це новий запис для мене, хоча я впевнений, що є спосіб зменшити це і позбутися від багатьох цього дратівливого простору. Перевірка знака значення (і, отже, перевірка того, чи є одне значення більше іншого), є досить складною у прелюдії.

Вхід і вихід подаються у вигляді байтових значень. Використовуючи інтерпретатор Python , ви можете встановити NUMERIC_OUTPUT = True, щоб ви фактично отримали ASCII 0або 1. Для цифрового введення вам доведеться додати ще один NUMERIC_INPUTпрапор (я, мабуть, повинен опублікувати свого переробленого перекладача в якийсь момент).

Також зауважте, що Прелюдія не може насправді відрізнити кінець списку від списку 0всередині. Отже, щоб дозволити нульові транзакції, я читаю T, потім довжина Lсписку, а потім Lтранзакції.



2

JavaScript (ES6) 38 33

Редагувати виправлену помилку початкового балансу. Thx @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,[]))

false false false
true true true
false false


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]). Тестуйте це тут .

Дякую Якубе за допомогу.


2

> <>, 29 + 3 = 32 байти

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

Бігай, як

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

де поріг - це перше число.



1

Perl 6 (21 байт)

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

Це функція, що приймає початковий аргумент та список елементів. Він працює, перевіряючи, чи жоден елемент ( за допомогою стиків ) елементів не перевищує поріг. [\+]використовується для генерації поточної суми, наприклад, [\+] 1, 2, 3дає 1, 3, 6. 0,додавати 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

Ява 8 - 153 символів

Гольф функція:

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.*;

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.