セックス・ボブ・オンブスの簿記(現在の金額が低すぎるかどうかを確認してください)


15

信じられないかもしれませんが、Sex Bob-ombsは世界的に有名なバンドになり、現在世界ツアー中です!ブックキーパーとして、日々の財務を監督し、定期的なレポートを提供する必要があります。

数週間ごとに、発生した順番で費用のリスト(米ドル全体)を作成します。

たとえば、リスト

378
-95
2234

アカウントに378ドルが入金され、その後95ドルが出金され、その後2234ドルが入金されたことを意味します。

これらの値の累積合計がしきい値Tを下回らないようにする必要があります。これを行うプログラムを作成することにしました。

チャレンジ

単一の整数Tと整数のリストを取り込むプログラムまたは関数を作成します。整数のリストの現在の合計がTより小さい場合は、偽の値を出力するか、それ以外の場合は、真の値を出力します。

通常の入力方法(stdin、ファイルから、コマンドライン、関数への引数)を使用できます。

  • リストの先頭では、現在の合計は0です。したがって、正のTは結果が常に偽であることを意味します。
  • + 正の整数の前に来ることはありません。
  • リストには0を含めることができます。
  • リストは空かもしれません。

テストケース

Tはこれらすべてで-5です。

偽物:

-6
1
2
3
-20
200
-300
1000

真実:

[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バイト

リストがスタックの一番上にあり、しきい値がレジスタAにあると仮定します。ニーモニックでは:

inits
sum get-a lt filter3
not

バイトコード内:

78 64 D0 70 F2 22

これは本当にgs2で同等の機能ですか?基本的に、仮定をもう少し正当化できますか?(もしそうなら受け入れます。)
カルビンの趣味

gs2には実際には関数はありませんが、GolfScriptの場合と同様に、ブロックにコードを入れてスタックの一番上にプッシュし、evalを呼び出すことができます。これらの6バイトをブロックに入れて、私が説明した状況で評価すると、スタックの一番上のリストが答え(0はfalse、1はtrue)に置き換えられます。同様に、リストをプッシュしてレジスタAにしきい値を割り当てるコードをこのコードの前に付けると、正しい結果が得られます。
リン

他のソリューションとかなり似た方法で機能します。initsHaskellのようなものです。"abcd" inits["" "a" "ab" "abc" "abcd"]すべてのプレフィックスを取得します。次に__ __ __ F2、バイトコードにある3つのコマンドの「ラムダ」でフィルター処理します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]))

最初の引数は配列です。2番目は、最小実行合計です。


6

J、11バイト

   */@:<:0,+/\

テスト

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

おかげで1バイト改善 FUZxxlによる

元のバージョンの説明 (*/@(<:0,+/\))

  • +/\ ランニングサム(sum +/プレフィックスの\)を
  • 0,+/\ ランニングサムに0を追加します
  • (<:0,+/\)<:(の要素)の結果以下の左側入力0,+/\左側の入力
  • @ 前の結果で
  • */ すべての要素の積(すべての要素が1の場合は1、要素が0の場合は0)

あなたは*/@:<:0,+/\ 私が思う1人のキャラクターのために行うことができます。
FUZxxl

6

APL、8 10

∧.≤∘(0,+\)

これは、T左引数としてリストを取り、右引数としてリストを取る関数です。

  • 0,+\:右側の引数の合計を実行し、0に追加
  • ∧.≤:左引数が右引数のすべての(∧)項目よりも小さいか等しい(≤)

私もこれを試してみましたが、「正のTは結果が常に偽物であることを意味します」。
-jimmy23013

@ user23013:いまいましい。さて、今は修正されていますが、勝ちません。
マリヌス

4

Mathematica、34バイト

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

これは、名前のない可変引数関数を定義します。これは、T最初のパラメーターとして、トランザクションを残りのパラメーターとして受け取り、ブール値を返します。

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

##2リストの2番目からのすべての引数を「スプラット」するかなりまれなものを使用できるため、これが気に入っています。詳細については、このゴルフのヒントの最後のセクションを参照してください。


4

k、8文字

最初の引数としてしきい値を、2番目の引数としてリストをとる二項動詞。驚くべきことに、これはオープンソースのコナを含むkのすべてのバージョンで機能します。

&/~0<-\,

kでは、関数の合成は1つを作成してからもう1つを作成するだけで行われるため、これを関数で分割できます。右から左へ:

  • -\,連続した連続した合計を取得し、しきい値から減算します。(fが二項の場合、。にf\ (a; b; c; ...) 展開すると、リストが結合されるだけです。)何かが0に等しい場合でもブレークが発生し、オーバードローは厳密に正の値を与えます。(a; a f b; (a f b) f c; ...),
  • ~0<0未満ではありません。kには実際には、より大きいか等しい<=演算子がないため、より小さいNOTにブール値NOTをスローする必要がありますが、これは結果が正でないかどうかをテストします。リスト内の各原子に自動的に適用されます。
  • &/リスト上の論理ANDのフォールドです。(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 >は「降順ソート順列」なので~|/>+\,、入力リストが空の場合にのみtrueになります...-
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関数は2バイトを無駄にします。これをバグとしてPythリポジトリに報告するつもりです。

編集:13(無効)

isaacgに1バイトの保存(>1to !)とsPythリポジトリでの実装の変更に感謝します。これで、次のコードが可能になりました(もちろん、このチャレンジでは無効です)。

!sm>vzs<QdhlQ

かなり頻繁に使用します。こちらをご覧ください:codegolf.stackexchange.com/questions/45264/fill-in-the-blanks/…。この場合、2文字を保存しますが、リストのリストの場合は5文字を失います。ただし、これらを2つの異なる機能に分ける未使用の文字があるかどうかを確認します。また、の!代わりにを使用してキャラクターを保存することもできます>1
isaacg

@isaacg空のリストの合計を0(ほぼ)として定義しても、既存のPythコードは壊れません。壊れる唯一のコードは#sYです。そして、1バイトの保存に感謝します。
ジャクベ

私はそれが公平だと思う-例外を投げることは誰にも役に立たない。修繕。
isaacg


3

ジュリア、33バイト

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

これにより、2つのパラメーター、Tおよびを受け入れる名前のない関数が作成され、lブール値が返されます。

all()関数は、ここですべての重荷を持ち上げます。述語と反復可能という2つの引数を取ります。述部についてはi、で指定された名前のない関数を使用して、イテラブルの現在の値を表すことを伝えますi->。そして、各繰り返しで、私たちは比較iT使用しましたi>=T

ジュリアが使用することに驚かないように cumsum()空のリストでのしてゼロを追加し[0, l]ます。


3

プレリュード144 136バイト

これは...難しい...

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

6ボイスは私にとって新しい記録だと思いますが、それを減らし、多くの迷惑な空白を取り除く方法があると確信しています。Preludeでは、値の符号をチェックする(したがって、ある値が別の値より大きいかどうかをチェックする)ことは非常に難しい。

入力と出力はバイト値として与えられます。Pythonインタープリターを使用する場合、を設定してNUMERIC_OUTPUT = True、実際にASCII 0または1。数値入力の場合は、別のものを追加する必要がありますNUMERIC_INPUTフラグ(おそらく、微調整したインタープリターをいつか公開する必要があります)。

また、Preludeはリストの末尾とリスト0内を実際に区別できないことに注意してください。だから、ゼロのトランザクションを許可するために、私は、リストTの長さ、そしてトランザクションを読んでいます。LL



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ですが、最初の入金が銀行に入金される前に既にしきい値を下回っています。
レインボルト

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, 60,正の0しきい値は常に失敗する必要があるため、リストの先頭に追加する必要があります。

Haskellソリューションとほとんど同じで、Perl 6構文のみです(Perl 6はHaskellから多くのすばらしいプログラミング機能を取り入れました)。


0

Perl-20

STDIN改行で区切られた番号のリストを取得Tし、-iフラグを使用します。

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

フラグ-iと+2 -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文字

ゴルフ機能:

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.