Seks Bob-ombs için defter tutma (hareketli bir toplamın çok düşük olup olmadığını kontrol edin)


15

İster inanın ister inanmayın, Seks Bob-ombs dünyaca ünlü bir grup haline geldi ve şu anda dünya turunda! Onların olarak muhasebecisi gündüz mali onların gün nezaret ve düzenli raporlar sunmalıdır.

Birkaç haftada bir masraflarının bir listesini (tam ABD doları olarak ) gerçekleştikleri sıraya göre derlersiniz .

Örneğin, liste

378
-95
2234

378 $ hesabına yatırıldı ve bundan sonra 95 $ çekildi ve bundan sonra 2234 $ yatırıldı.

Bu değerlerin çalışma toplamının hiçbir zaman T eşik değerinin altına düşmediğinden emin olmak istersiniz . Bunu sizin için yapmak üzere bir program yazmaya karar veriyorsunuz.

Meydan okuma

Tek bir tamsayı T ve bir tamsayı listesi alan bir program veya işlev yazın . Tamsayı listesinin çalışma toplamı T'den daha azsa , bir yanlış değeri yazdırın veya döndürün , aksi takdirde doğruluk değeri yazdırın veya döndürün.

Normal giriş yöntemlerini kullanabilirsiniz (stdin, dosyadan, komut satırından argümanlara işlev).

  • Listenin başlangıcında, koşu toplamı 0'dır. Dolayısıyla pozitif bir T , sonucun her zaman sahte olduğu anlamına gelir.
  • + asla pozitif tamsayıların önünde olmaz.
  • Liste 0 içerebilir.
  • Liste boş olabilir.

Test Durumları

Bunların hepsinde T -5'tir.

Falsy:

-6
1
2
3
-20
200
-300
1000

Doğru:

[empty list]
-5
4
-3
-6

puanlama

En az bayt içeren gönderim kazanır. Tiebreaker en erken gönderilen gönderime gider.

Beni bunu yapmaya zorlayan üzücü yorum.


1
Test durumu gerekli T = 5, L = [10]. Belki de noktayı tamamen kaçırdım
edc65

1
@ edc65 "Listenin başlangıcında, koşu toplamı 0'dır. (Yani pozitif bir T, sonucun her zaman sahte olduğu anlamına gelir.)"
Martin Ender

@optimizer üzülme, referansını aldım <3
undergroundmonorail

@ undergroundmonorail çok geç. Ve orada bir bağlantı var.
Doktor

Yanıtlar:


2

gs2 - 6 bayt

Listenin yığının üstünde olduğunu ve eşiğin A kaydında olduğunu varsayalım.

inits
sum get-a lt filter3
not

Bayt kodunda:

78 64 D0 70 F2 22

Bu gerçekten gs2'deki işlev eşdeğeri mi? Temel olarak, varsayımlarınızı biraz daha gerekçelendirebilir misiniz? (Muhtemelen kabul edeceğim.)
Calvin'in Hobileri

gs2'nin gerçekten işlevleri yoktur, ancak bir bloğa bazı kodlar koyabilir, yığının üstüne itebilir ve GolfScript'teki gibi eval'i çağırabilirsiniz. Bu altı baytı bir bloğa koyar ve tanımladığım durumda değerlendirirseniz, yığının üstündeki liste yanıtla değiştirilir (false için 0, true için 1). Aynı şekilde, bu kodu sadece listeyi zorlayan ve A kaydı için bir eşik değeri atayan bir kodla ön eklerseniz, doğru sonucu alırsınız.
Lynn

Diğer çözümlerle oldukça benzer şekilde çalışır. initsHaskell'deki gibidir: "abcd" inits["" "a" "ab" "abc" "abcd"]bize tüm önekleri getirir. Sonra __ __ __ F2bayt kodunda bulunan üç komuttan oluşan bir "lambda" ile filtreliyoruz : toplamı içerdiği değerden daha az olan tüm önekleri ararız A. Ardından notlistenin boş olup olmadığını belirler.
Lynn

11

Haskell, 22 bayt

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

Kullanımı: f (-5) [4,-3,-6]hangi çıktılar True.

Alt toplamların bir listesini yapın ve tüm öğelerin> = t olup olmadığını kontrol edin.

Düzenleme: Boş liste ve pozitif ts için hata düzeltme


@ MartinBüttner: İlk 0liste listede değil scanl1, boş listeyle beslenirse boş listeyi döndürür, ancak allbu durumu yakalar. f (-5) []döner True.
nimi

@ MartinBüttner: Hata! Haklısın. Bu davayı kaçırıp düzelttim. Teşekkürler!
nimi

7

Python 2, 41

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

İlk argüman dizidir; ikincisi asgari çalışma toplamıdır.


6

J, 11 bayt

   */@:<:0,+/\

Testler

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

FUZxxl sayesinde 1 baytlık iyileştirme .

Orijinal versiyonun açıklaması (*/@(<:0,+/\))

  • +/\akan toplam oluşturur ( +/öneklerin toplamı \)
  • 0,+/\ devam eden tutara 0 ekler
  • (<:0,+/\)sol taraftaki giriş , sağ taraftaki girişin <:sonucundan (öğelerinin) daha küçük veya eşit0,+/\
  • @ önceki sonuçla
  • */ tüm elemanların çarpımı (tüm elemanlar 1 ise 1, eleman 0 ise 1)

*/@:<:0,+/\ Sanırım bir karakter için yapabilirsin .
FUZxxl

6

APL, 8 10

∧.≤∘(0,+\)

Bu, Tsol argümanı ve listeyi sağ argümanı olarak alan bir işlevdir .

  • 0,+\: 0'a eklenen doğru argüman toplamı
  • ∧.≤: sol argüman sağ argümandaki tüm (∧) öğelerden daha küçük veya eşit (≤)

Bunu da denedim ama, "Yani pozitif bir T, sonucun daima sahte olduğu anlamına gelir."
jimmy23013

@ user23013: kahretsin. şimdi düzeltildi ama kazanamayacak.
marinus

4

Mathematica, 34 bayt

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

Bu T, ilk parametre ve işlemleri kalan parametreler olarak alan adsız bir varyasyon işlevini tanımlar ve bir boolean döndürür:

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

Bunu sevdim çünkü ##2ikinci argümanları listeye "savunan" oldukça nadir olanı kullanabilirim . Daha fazla ayrıntı için bu golf ipucundaki son bölüme bakın .


4

k, 8 karakter

İlk argüman olarak eşiği ve ikinci olarak listeyi alan bir ikili fiil. Dikkat çekici bir şekilde, bu, açık kaynak kodlu Kona da dahil olmak üzere her k sürümünde çalışır.

&/~0<-\,

K'de, fonksiyonların bileşimi sadece birini sonra diğerini yazarak yapılır, böylece bunu fonksiyonlarla parçalayabiliriz. Sağdan sola doğru:

  • -\,art arda toplamları alır ve eşikten çıkarır. (Eğer fikili ise, o zaman f\ (a; b; c; ...) genişler (a; a f b; (a f b) f c; ...). ,Sadece listeleri birleştirir.) Bir şey 0'a eşit olduğunda bile kırılma meydana gelir ve aşırı çekme kesinlikle pozitif değerler verir.
  • ~0<0'dan Küçük Değil. k gerçekten ona göre daha büyük veya eşit bir <=operatöre sahip değildir, bu yüzden boolean'ı NOT'den daha azına atmak zorundayız, ancak bu, sonucun pozitif olup olmadığını test eder. Listedeki her bir atom için otomatik olarak uygulanır.
  • &/bir liste üzerinde mantıksal AND katlamasıdır. ( fİkili için) Bu, listedeki her boolean'ın True olup olmadığını test eder.

Örnekler:

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

Muhtemelen parantezler için 2 karakter eklerdim. Ve eğer yaparsanız 1 karakter tıraş edebilirsiniz~|/>+\,
tmartin

@tmartin Monadic >"azalan sıralama permütasyonudur", bu yüzden ~|/>+\,sadece giriş listesi boş olduğunda doğrudur ...
algoritmaharş

Ah haklısın, benim hatam.
tmartin


3

Pyth, 16 15

!sm>vzs+0<QdhlQ

Giriş ile çevrimiçi deneyin

-5
[4, -3, 6]

Açıklama:

                   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(...)

Ve yine aptal sişlev iki bayt harcar. Sanırım bunu bir hata olarak Pyth repo'suna bildireceğim.

değiştir: 13 (geçerli değil)

Bir bayt kaydetme ( >1to !) için isaacg sve Pyth deposunda uygulanmasını değiştirdiği için teşekkürler . Şimdi aşağıdaki kod mümkündür (ancak elbette bu meydan okuma için geçerli değildir).

!sm>vzs<QdhlQ

Onları oldukça sık kullanıyorum. Buraya bakın: codegolf.stackexchange.com/questions/45264/fill-in-the-blanks/… . Bu durumda 2 karakter kaydeder, ancak listeler durumunda 5 karakter kaybeder. Bunları iki farklı işleve ayırmak için kullanılmayan bir mektup olup olmadığını görüyorum. Ayrıca, !yerine kullanarak bir karakteri kaydedebilirsiniz >1.
isaacg

@isaacg Boş bir listenin toplamını 0 (neredeyse) olarak tanımlamak mevcut herhangi bir Pyth kodunu bozmaz. Keseceği tek kod #sY. Ve 1 bayt tasarruf için teşekkürler.
Jakube

Sanırım bu adil - istisnalar atmak kimseye yardım etmiyor. Sabit.
isaacg


3

Julia, 33 bayt

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

Bu iki parametre kabul eden isimsiz bir işlevi oluşturur, Tve l, ve bir boolean döndürür.

all()Buradaki görevi ağır kaldırma hepsini yapıyor. İki argüman alır: yüklem ve yinelenebilir. Yüklem için, iadsız bir işlev kullanılarak belirtilebilir yinelenebilir öğenin geçerli değerini temsil ettiğini söyleriz i->. Sonra her tekrarda biz karşılaştırmak iiçin Tkullanıyor i>=T.

Julia'nın cumsum()boş bir listede kullanmaktan korkmadığından emin olmak için , orada kullanarak sıfır atabiliriz [0, l].


3

Başlangıç , 144136 bayt

Bu ... zor ...

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

Sanırım 6 ses benim için yeni bir kayıt, ancak bunu azaltmanın ve o sinir bozucu boşluklardan kurtulmanın bir yolu olduğuna eminim. Bir değerin işaretini kontrol etmek (ve bu nedenle, bir değerin diğerinden daha büyük olup olmadığını kontrol etmek) Prelude'da oldukça zordur.

Giriş ve çıkış bayt değerleri olarak verilir. Kullandığınızda Python yorumlayıcısı , ayarlayabilirsiniz NUMERIC_OUTPUT = Trueaslında bir ASCII olsun böylece, 0ya 1. Sayısal girdi için başka bir NUMERIC_INPUTbayrak eklemeniz gerekir (muhtemelen bir noktada düzeltilmiş tercümanımı yayınlamalıyım).

Ayrıca Prelude'un bir listenin sonunu listedeki bir listeden ayırt edemeyeceğini unutmayın 0. Sıfır işleme izin vermek için okuyorumT , Llistenin uzunluğunu ve ardından Lişlemleri.



2

JavaScript (ES6) 38 33

Düzenle Sabit ilk bakiye hatası. Thx @martin & @rainbolt

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

Firefox / FireBug konsolunda test et

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

yanlış yanlış yanlış
doğru doğru doğru
yanlış yanlış


2
Başlangıç ​​bakiyesi sıfırdır. İlk para yatırma işlemi 10'dur, ancak ilk para yatırma işlemini bankaya göndermeden önce eşik değerinin altındayız.
Rainbolt

2

Python 2.7-55 bayt

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

Gibi arayın print f(-5,[1,2,3,-20]). Burada test edin .

Yardım ettiği için Jakube'e teşekkürler.


2

> <>, 29 + 3 = 32 bayt

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

Gibi koş

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

burada eşik ilk sayıdır.



1

Perl 6 (21 bayt)

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

Başlangıç ​​argümanını ve eleman listesini alan bir işlevdir. Hiçbir elemanın ( kavşak kullanarak ) eşiğin altında olup olmadığını kontrol ederek çalışır . [\+]Örneğin [\+] 1, 2, 3, toplamı oluşturmak için kullanılır 1, 3, 6. 0,eklemek0 listenin başında en çünkü pozitif eşik her zaman başarısız gerektiğini gereksinimi gereklidir.

Haskell çözümü ile hemen hemen aynı şey, sadece Perl 6 sözdiziminde (Perl 6, Haskell'den çok güzel programlama özellikleri aldı).


0

Perl - 20

Yeni STDINsatırlarla ayrılmış numaraların listesini alın ve bayrağıyla Tbirlikte alın -i.

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

+2 için -ive -nişaretler. Çıkış değeri 255hatalar ve 0başarı içindir.

Şununla çalıştır:

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

0

Clojure, 45

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

Örneğin

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

Ya da bir lil 'daha hoş;

(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 karakter

Golf fonksiyonu:

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;
} 

Sürücü programı:

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));
}

}

Çıktı:

bash-3.2$ javac A.java ; java A

false
false
false
above false, below true
true
true
true
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.