Standarttaki sayıları toplayın


32

Satır başına bir tamsayı içeren bir akış / dosya düşünün. Örneğin:

123
5
99

Kodunuz bu sayıların toplamını yazmalıdır, yani 227.

Giriş formatı kesinlikle satır başına bir tam sayıdır. Örneğin, girişin bir tamsayı dizisi olarak bir satırda olduğunu varsayamazsınız.

STDIN'den dosya adı biçiminde veya istediğiniz bir adı taşıyan bir dosyaya giriş yapabilirsiniz; hangisini seçebilirsin. Giriş almanın başka yolu yoktur.

Giriş en az bir tam sayı içerecektir. Tüm tamsayıların negatif olmadığını ve toplamlarının daha düşük olduğunu varsayabilirsiniz .232


2
Sonunda yeni bir hat var mı? Bu newline isteğe bağlı mı?
Lütfen

9
Merhaba! Bu zorluğun altını çizdim, çünkü kısıtlayıcı bir giriş formatına sahip olarak kabul edilebilir giriş / çıkış formatları için topluluk standartlarımıza aykırı .
AdmBorkBork

1
@AdmBorkBork ve ben bunu sohbet odasında uzunca tartıştık. Kabul

22
Elverişsiz G / Ç’lerden kaçınılması gereken şeylerin yazarı ve keyfi varsayılanları geçersiz kılan şeyler olarak , bu sorunu bu gerekçelerle savunmak istiyorum. Burada işleme girişi, ana zorluğun dikkatini dağıtan fazladan bir iş değil, zorluğun etleridir. Garip G / Ç gereksinimlerine sahip "numara ekleme" değil, bir adım olarak ekleyerek "bu G / Ç'yi yapın". Standart G / Ç'yi geçersiz kılmak, ana görev boyunca kısayol yapmamak için cevaplar için gereklidir.
xnor

2
İşlev girişi neden kullanılamıyor?
Hesap MakinesiFeline

Yanıtlar:


15

05AB1E , 2 bayt

|O

Açıklama:

|   Get input as array
 O  Sum

Çevrimiçi deneyin!


6
Bu çok saçma :)

Bu standart olarak okunuyor mu?

1
@ Lembik öyle.
Okx

2 baytlık cevabın ilk olduğuna inanıyorum. Sen kazanansın! (Biri 1 baytlık bir cevap

3
@Lembik Veya 0 baytlık bir cevap ....
Yoldaş SparklePony

21

Bash + coreutils, 16 bayt

xargs|tr \  +|bc

Çevrimiçi deneyin!

Bundan sonra iki boşluk var \. Bu, negatif sayılar için de geçerlidir.

Açıklama:

xargs             # known trick to turn newlines into spaces, while adding a
                  #trailing newline when printing the result (needed for bc)
|tr \  +          # turn spaces into '+'s
|bc               # calculates the sum

Neden tr \\n +|bcdaha iyi olmadığını merak edebilirsiniz , çünkü yeni satırları doğrudan '+' ya çevirir. Peki, bu öngörülemeyen 2 hata var:

  • Girdide izleyen bir yeni satır varsa, o zaman izleyen '+' 'ya dönüştürülür, bu nedenle ekleme işlemini gerçekleştirmek için sayı yoktur.
  • ve en garip olanı, bc'nin girişten sonra takip eden bir yeni satır gerektirmesidir, ancak giriş satırlarının tümünü '+' ile değiştirdiniz.

Bunu severim. Güzel ve zekice.

Tr \\ n + yerine xargs olmadan kullanabilir misiniz?

1
@Lembik mi demek istiyorsun tr \\n +|bc? Eğer öyleyse, lütfen güncellenmiş açıklamaya bakınız. İyi soru.
seshoumara

paste -s -d+|bc15 bayttır
David Conrad

1
@Lembik Bu olayı düşünmedim, ama neyse ki senaryo hala çalışıyor. xargs|tr \ +Bu durumda hiçbir şey yapmaz ve bc bu sayıyı alır ve geri basar.
seshoumara

14

MATL , 2 bayt

Us

Bu girdi olarak adlandırılan bir metin dosyasında bekler defin.

Gif ya da olmadı :

enter image description here

Veya çevrimiçi deneyin! ( Kurulum için Dennis'e teşekkürler! )

açıklama

Bir MATL programı çalıştırıldığında, çağrılan bir dosya definbulunursa (adı "varsayılan giriş" anlamına gelir), içeriği otomatik olarak metin olarak yüklenir ve kodu çalıştırmadan önce dizeye dizeye itilir.

İşlev U, sayıyı bir sütun vektörüne dönüştürmek için dizeyi değerlendirir ve sörtülü olarak görüntülenen toplamı hesaplar.



12

Yapıştır + bc, 13 bayt

paste -sd+|bc

Açıklama:

paste -s        Take one line at a time from input
        d+      Joining by '+'
          |bc   Pass as expression to bc

Başka bir kabuk cevabı!


1
Çok temiz ve düzenli.

Ooh, vardı paste -s -d+|bcve ben anahtarları birleştirebilecek farkında değildi. Temiz!
David Conrad

12

Perl 6 , 13 bayt

say sum lines

Dene

açıklama

  • lines()bir "sihirli" komut satırı giriş tutamacından satır listesini $*INveya döndürür $*ARGFILES.
  • sum(…)[+] ListTüm değerlerini oluşturmadan toplamlarını hesaplayabilen Konumlandırmalar için optimize edilmesine izin vermek üzere Perl 6'ya eklendi 1..100000
    ( sumburada [+]normalde kullandığım gibi kullanmak için çok şirin olduğunu düşündüm )
  • say(…).gistgirişindeki yöntemi çağırır ve ek bir yeni satırla yazdırır.

Perl 5 nedir?

14
Bu lolcode gibi okur
Bryan Boettcher

@Lembik açıkça Perl 5'in bir kız kardeşi dili olan Perl 6 olarak etiketlenmiştir .
Brad Gilbert

Bir yazım hatası vardı. Perl 5’te ne demek istedim?

1
$a+=$_ for <>;print $aPerl 5'de peki çalışır, ancak daha kısa bir yol olabilir.
Brad Gilbert 22: 14'te

10

C, 53 bayt

r;main(i){for(;~scanf("%d",&i);r+=i);printf("%d",r);}

C kimlik bilgilerini tekrar gösteriyor :)

2
Daha kısa bir yol olması gerektiğini düşünüyorum, ama görmüyorum :)
Digital Trauma


9

Retina , 11 7 bayt

-4 Martin Ender'e teşekkürler

.*
$*
1

Çevrimiçi deneyin!


Birliğe dönüştür:

.*
$*

1S sayısını sayın :

1

1
Retina'nın regex tabanlı bir dil olarak, toplamı şu ana kadar verilen en kısa bash cevabından daha az byte olarak yapabilmesi ilginç. +1
seshoumara

Bu okuma standart olarak mı geliyor?

2
@Lembik Evet öyle.
Riley,

Unary girişine izin verilirse, sadece bir bayt olurdu.
mbomb007

@ mbomb007 Ben zaten sed içinde denedim.
Riley,

8

Beyin Flak , 20 bayt

(([]){[{}]{}([])}{})

Çevrimiçi deneyin!

açıklama

Bu, Riley'nin sohbette yaptığı bir çözüme ait bir golf . Onun çözümü şuydu:

([])({<{}>{}<([])>}{})

Eğer Brain-Flak'ı tanıyorsanız, bu oldukça açıklayıcıdır. İstif yüksekliğini iter ve geri saydıkça bir değer atar, sonunda tüm işlemlerin toplamını iter.

Oldukça iyi bir golf, ancak her ikisini de sıfırlıyor {}ve ([])bununla birlikte, bunların yalnızca birinden farklı olan değerleri var. Bunun yerine maskeleri çıkarır ve iki negatiften birini yaparsak neredeyse iptal etmesi gerekiyor.

([])({[{}]{}([])}{})

Her zaman bir farklılık gösterdikleri için, cevabımızın her zaman yığın yüksekliği nedeniyle kapalı olduğu talihsiz bir duruma sahibiz. Bunu düzeltmek için ilk yığının yüksekliğini saran basmanın başlangıcını hareket ettiririz.

(([]){[{}]{}([])}{})

1
Negatif pop, itilen önceki yüksekliği (döngüden önce veya önceki zamanın sonuna kadar) iptal ettiğinden ve son yükseklik 0 olduğu için ihmal edilebilir diye düşündüm.
Riley,

8

Python 2,40 bayt

import sys;print sum(map(int,sys.stdin))

7

R, 11 bayt

sum(scan())

scangirişi, satır başına bir sayı alır. Ve sum, toplamlar.


7

Perl 5 , 9 bayt

8 bayt kodu + -pbayrak.

$\+=$_}{

Çevrimiçi deneyin!

İle -pgiriş, bir seferde bir satır okunur ve $_her seferinde kaydedilir . $\Akümülatör olarak kullanıyoruz , çünkü -pbayrak sayesinde , sonunda basılıyor. Eşsiz }{kullanılır, bu nedenle -pbayrak $\, yazdırma yerine yalnızca bir kez yazdırır $_ve $\normalde olduğu gibi okuduğu her satırda yazdırır .


Ayrıştırmıyorum bile! :) Açıklama lütfen.

@ Lembik İşte başlıyorsunuz.
Dada

Eşsiz parantez kısmı çok belirsiz!

@Lembik Bunlar Ya sen ... değil parenthesizes olan Fransız ya Kıvırcık Braketler kim soracak bağlıdır, ama onlar kesinlikle değildir)(
CraigR8806

1
accoladesGörünüşe göre @Lembik .
Michael Vehrs

7

Saf Bash, 37 36 bayt

Bir bayt için @KevinCruijssen için teşekkürler!

while read a;do((b+=a));done;echo $b

Çevrimiçi deneyin!


3
Çok güzel ve temiz.

Bash'de programlanmadım , ancak aradaki boşluğu kaldırmak mümkün değil do ((mi? TIO çalışması gibi görünüyor.
Kevin Cruijssen

@KevinCruijssen Evet, çalışıyor gibi görünüyor. Günlük kabuğum olarak zsh kullanıyorum ve boşluk olmadan zsh ile çalışmıyor, sadece Bash'de işe yaramayacağını sanıyordum ama görünüşe göre çalışıyor.
17'de

6

Haskell, 32 bayt

interact$show.sum.map read.lines

Çevrimiçi deneyin! .

interactgirişin tamamını stdin'den toplar, argümanı olarak verilen işleve iletir ve bu işlevden geri aldığı dizgeyi yazdırır. İşlev:

            lines   -- split input into list of lines at nl
      map read      -- convert every line to a number (read is polymorphic,
                    -- but as want to sum it later, the type checker knows
                    -- it has to be numbers)
    sum             -- sum the list of numbers
show                -- convert back to string

1
Bu beni gerçekten Haskell gibi gösteriyor. Scala'da yapmak zorundayım lines.map(_.toInt) çünkü sum, String'den veya bu durumda açık olandan bir tür sayısal örtük dönüşüm bekliyor.
Stefan Aleksić

6

PHP, 22 bayt

<?=array_sum(file(t));

Bu, tamsayıların listesini içeren "t" isimli bir dosya olduğunu varsayar.

file()bir dosya açar ve her satır dizide ayrı bir öğe depolanmış halde bir dizi döndürür. array_sum()Bir dizideki tüm elemanları toplar.


5

Awk, 19 bayt

{s+=$1}END{print s}

Açıklama:

{s+=$1}                For all lines in the input, add to s
        END             End loop
           {print s}    Print s

1
"Açıklama yakında geliyor ™" Ticari markalı olmasaydı bu yeni
şifrem olur

2
Awk dilinde, cevabınız aslında sadece 19 bayt: {s+=$1}END{print s}:)
Digital Trauma

5

dc , 14 bayt

0[+?z2=a]dsaxp

Çevrimiçi deneyin!

Açıklama:

 [      ] sa   # recursive macro stored in register a, does the following:
  +            # - sum both numbers on stack
               #   (prints to stderr 1st time since there's only 1)
   ?           # - read next line, push to stack as number
    z          # - push size of stack
     2         # - push 2
      =a       # - if stack size = 2, ? yielded something, so recurse
               # - otherwise end macro (implicit)
0              # push 0 (accumulator)
         d     # duplicate macro before storing it
            x  # Call macro
             p # The sum should be on the stack now, so print it

4

CJam , 5 bayt

q~]1b

Çevrimiçi deneyin!

Nasıl çalışır

q     e# Read all input from STDIN.
 ~    e# Evaluate that input, pushing several integers.
  ]   e# Wrap the entire stack in an array.
   1b e# Convert from base 1 to integer.
      e# :+ (reduce by sum) would work as well, but 1b handles empty arrays.

1bSayıların toplamı nasıl ?
Esolanging Fruit

CJam, rakamlardan tam sayıya dönüşüm için kurallı bir gösterim gerektirmez; [<x> <y> <z> <w>]<b>bsadece b³x + b²y + bz + w değerlerini hesaplar . Tüm b = 1 olduğunda , bu verir w, x + y + z + .
Dennis,

4

Python, 38 30 bayt

lambda n:sum(map(int,open(n)))

Python'da dosyalar open('filename')(açık) tarafından açılır . Ancak, bunlar yinelenebilir. Dosyayı her yinelediğinizde, bir sonraki satırı alırsınız. Böylece harita her listeyi tekrar eder, intonu çağırır ve ardından sonuçta elde edilen listeyi toplar.

Dosya adı ile giriş yapın. (yani f('numbers.txt'))

map(int, open(n))Liste anlama yerine 8 bayt kullanılarak kaydedilir . Orijinal kod:

lambda n:sum([int(i)for i in open(n)]) 

1
Bunu 'open (0)' diyerek standart girdiyle de yapabileceğinizi düşünüyorum. Bunun cevabınızı kısaltmak için kullanılıp kullanılamayacağından emin değilim.
cole

@Cole dennis'in zaten bu çözümü var, bu yüzden cevabımı böyle bırakacağım.
Rɪᴋᴇʀ

Benim hatam, bunun için üzgünüm; Cevabınıza gelmeden önce bütün yolu okumadım.
cole

@Cole sorun değil, umrumda değil.
17:29

4

Mathematica, 19 bayt

Mathematica'nın notebook ortamını varsayar.

Tr[#&@@@Import@"a"]

Girişin bir dosyada olmasını bekler a.


Bu çılgın bir dil :)

4
@Lembik normal insanlar bunu çok kolay Total @ Flatten @ Import @ "a"ve hatta yazarlardı "a" // Import // Flatten // Total. ;)
Martin Ender

Olmaz Tr[#&@@@Import@#]&da izin verilebilir?
ngenis

4

Jelly , 9 8 bayt

ƈFпFỴVS

STDIN gerçekten Jelly'nin işi değil ...

Çevrimiçi deneyin!

Nasıl çalışır

ƈFпFỴVS  Main link. No arguments. Implicit argument: 0

  п      While loop; while the condition returns a truthy value, execute the body
          and set the return value to the result. Collect all results (including 0,
          the initial return value) in an array and return that array.
ƈ           Body: Yield a character from STDIN or [] if the input is exhausted.
 F          Condition: Flatten, mapping 0 to [], '0' to "0", and [] to [] (falsy).
    F     Flatten the result.
     Ỵ    Split at newlines.
      V   Evaluate the resulting strings.
       S  Take the sum.

1
İkincisi netlik için de Folabilir .
Outgolfer Erik


4

Saf bash, 30

read -d_ b
echo $[${b//'
'/+}]

Çevrimiçi deneyin.

  • readBir giriş dosyası değişkene gider b. -d_söyler readhat ayırıcı olduğunu _yerinenewline
  • ${b//'newline'/+}newlines bile değiştirir+
  • echo $[ ... ] ortaya çıkan ifadeyi aritmetik olarak değerlendirir ve çıkarır.

+1 Çok hoş. Bir girdi dosyasının son satırı da okundu mu? Soruyorum çünkü '+' ile değiştirilirse, $[]bölüm '+' izinden dolayı hata verir.
seshoumara

@seshoumara Görünüşe göre readsatır sınırlandırıcısının geçersiz kılınmasına rağmen sondaki son satırları atar _. Bu belki bir uyarıdır read, ancak bu durum için iyi çalışır.
Dijital Travma

Saf bir bash çözümü bulduğum için hep mutluyum.



3

jq , 5 bayt

add, artı komut satırı bayrağı -s.

Örneğin:

% echo "1\n2\n3\n4\n5" | jq -s add
15

6 bayt . Yana -saddçalışmaz, uzay sayın.
agc

@agc Hatalıysam düzeltin, ancak kodun kendisi add(3 bayt) ve bayrak için 2 bayt eklemeniz gerekiyor-s . Boşluk kod veya bayrak olarak sayılmaz: dil tarafından kullanılan komut satırı ayırıcısıdır.
caird coinheringaahing

1
@ThisGuy, -sBayrak " --slurp " için kısa , (tüm girdi akışını büyük bir diziye oku ve filtreyi yalnızca bir kez çalıştır), bu hem jqgiriş verilerinin yorumlanmasını hem de kodu nasıl çalıştığını değiştirir. Gibi değil -ede sedhangi sadece söyler sedsonraki dize kodu olduğunu. Bu dilin kendisinin -sbir parçası gibidir jqve bu nedenle 6. bayt alanı da olacaktır.
agc

3

Aslında 2 bayt

Çevrimiçi deneyin!

Açıklama:

kΣ
    (implicit input - read each line, evaluate it, and push it to the stack)
k   pop all stack elements and push them as a list
 Σ  sum
    (implicit output)

3

dc, 22

[pq]sq0[?z2>q+lmx]dsmx

Bu olması gerekenden çok daha uzun görünüyor, ancak dosyanın sonuna gelindiğinde karar vermek zor. Bunu yapmayı düşünebilmemin tek yolu ?komuttan sonra yığın uzunluğunu kontrol etmektir .

Çevrimiçi deneyin .

[pq]                    # macro to `p`rint top-of-stack, then `q`uit the program
    sq                  # save the above macro in the `q` register
      0                 # push `0` to the stack.  Each input number is added to this (stack accumulator)
       [         ]      # macro to:
        ?               # - read line of input
         z              # - push stack length to stack
          2             # - push 2 to the stack
           >q           # - if 2 > stack length then invoke macro stored in `q` register
             +          # - add input to stack accumulator
              lmx       # - load macro stored in `m` register and execute it
                  d     # duplicate macro
                   sm   # store in register `m`
                     x  # execute macro

Makro myinelemeli olarak adlandırıldığını unutmayın . Modern dc, bu tür bir şey için kuyruk özyinelemesini uygular, bu nedenle yığının taşması konusunda endişelenmeyin.


PPCG'ye Hoşgeldiniz! Lütfen yeterli açıklama yoksa, düşük kaliteli mesaj filtresinden geçeceğini unutmayın .
Matthew Roh

@ SIGSEGV gerekli hoş geldiniz - Ben bir süredir buradayım ;-) Evet, siz yorum yaparken açıklamamı yazıyordum. Düzenlemeye bakınız.
Dijital Travma

1
Kaydetmeden önce makroyu çoğaltma hilesi için size bir bayt borcum var
Brian McCutchon

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.