正の整数の合計。[閉まっている]


14

問題:

整数のセットが与えられたら、その中のすべての正の整数の合計を見つけます。

入力:

  • t –テストケースの数[ t <1000]
  • 次のそれぞれの上のTライン、整数N [-1000≤ N ≤1000年]

出力

プログラムは、すべての正の整数の合計を出力する必要があります。

オンライン裁判官でコードを確認する

スコア

ASCIIコードが32以下のシンボルを除き、スコアはプログラムのソースコードのサイズと同じです。

ベストスコアリストは次のとおりです。Pythonベストスコア(ベストスコアは29)


13
spoj.pl/SHORTENには、さらに多くのcodegolfチャレンジがあります。ただし、ここでそれらを複製する意味はわかりません。
hallvabo

3
この質問がpythonとタグ付けされているのはなぜですか?pythonソリューションのみに興味がありますか?
アマンZeeKヴァーマ

24
コンテストサイトからの質問はここに投稿すべきではないと思います。
fR0DDY

2
私はすでにこれをSPOJで行いました。少し前に、Python2.6でのすべての回答をPython3に昇格させましたが、一部はPython3で実行できず、Python3では長くなります。たとえば、input()とprint(x)の代わりにint(input())を使用する必要がありますプリントx ですから、私はもうSPOJをあまり真剣に受け止めていません。私はティムピーターズと結ばれていて、
それで

4
T(number of ... errr ... numbers(?))をスキップすることはオプションではありません...テストケースにはT数字の後に余分なデータが含まれるため...コードはSPOJで失敗するため、指摘したいだけです。全員(以下の3つの回答)は、最初の整数を巧みにスキップしたようです。
-st0le

回答:


34

空白、0

抵抗できませんでした。S=スペース、T=タブ、N=改行、すべてASCIIコード<= 32です。

SSSSNSSSSNTTSSSSSTNTNTTNSSSNSSSSTNTTTNTSTNSSSSTNSSSSTNTTTSSSSTNTSSTTTSSSSSTSNTNTTSSSSTSNTTTNTTSNSSSSNSSSSTSNTTTSSSSNTTTTSSSTTSNSNSNNSSTNSSSSNTTTTNSTSSSSTSTSNTNSSNNN

簡単なコピー&ペーストのためにBase64エンコード。

ICAgIAogICAgCgkJICAgICAJCgkKCQkKICAgCiAgICAJCgkJCQoJIAkKICAgIAkKICAgIAkKCQkJ
ICAgIAkKCSAgCQkJICAgICAJIAoJCgkJICAgIAkgCgkJCQoJCSAKICAgIAogICAgCSAKCQkJICAg
IAoJCQkJICAgCQkgCiAKIAoKICAJCiAgICAKCQkJCQogCSAgICAJIAkgCgkKICAKCgo=

3
(+1)素敵なプログラム!小さな「FWIW」:S数字のバイナリコーディングに不要な9つのインスタンスがあるため、9文字を削除できます。これらの形式のすべてにプッシュ数にスタック命令であるSSSS...N第4、Sコード(もちろん、これは、スコアには影響を与えないという)0主要余分
resは

13

要素、17文字と1スペース

_'[_ 2:n;0>[n~+]]`

これが私の最初の構築言語です。非常にコンパクトで人間が読めるように設計されています。命令はすべて1文字の長さで、1つの機能を実行します。

要素には、メモリ構造として2つのスタックとハッシュがあります。2つのスタックは、メインスタックおよびコントロールスタックと呼ばれます。メインスタックは、算術演算、I / O、およびハッシュ操作が行われる場所です。制御スタックは論理演算が発生する場所であり、このスタックはwhileループとforループを制御します。

Elementの背後にある基本的な考え方は、数値/文字列を保存するハッシュがあり、スタックはこれらの数値の計算を実行するために使用されるということです。これらの計算の結果は、将来の使用のためにハッシュ内の特定の場所に割り当てることができます。ハッシュのさまざまなコンテンツは要素と呼ばれるため、配列に似ていますが、数値以外の名前を持つことができます。

編集:ここでは、Perlで記述されたElementのインタープリターを見つけることができます。

演算子のリストは次のとおりです。これらの例の一部では、mとnは既にスタックにある数値を表します。

text  --pushes the string "text" onto the main stack
'     --pops from main stack and pushes onto control stack
"     --pops from control stack and pushes onto main stack
#     --pops from main stack and destroys
[]    --FOR statement (view the top number number from control stack and eval those many times)
{}    --WHILE (loop until top number on control stack is 0)
(     --pops from main stack, removes first character, pushes the remaining string onto stack, and pushes the removed character onto stack
)     --pops from main stack, removes last character, pushes the remaining string onto stack, and pushes the removed character onto stack
~     --pops from main stack, pushes contents of the element with that name
+-*/%^ --pops two most recently named elements, adds/negates/multiplies/divides/modulates/exponentiates them, and places the result on the stack
mn;   --pops m and n and assigns element n the value of m
mn@   --pops m and n and moves mth thing in stack to move to place n in stack
m$    --pops m and pushs size of m onto the stack
mn:   --pops m and n and pushes m onto the stack n times
mn.   --pops m and n and pushes m concatonated with n
m?    --pops m and pushes 0 onto control stack if m is '0' or and empty string, else pushes 1 
\     --escapes out of next character, so it isn't an operator and con be pushed onto the stack
><=   --pops two numbers off of stack and tests, pushes 1 onto control stack if true and 0 if false
`     --pops from main stack and prints
&|    --pops two items from control stack, performs and/or respectively, and pushes result back onto control stack
!     --pops a number off of control stack, pushes 1 if 0 or empty string, 0 otherwise
_     --inputs a word and pushes onto main stack
m,    --pops m from main stack, coverts it to char and pushes, converts to num and pushes
Newlines and spaces separate different elements to be pushed onto the stack individually, but can pushed onto the stack using \

以下に、プログラムの仕組みを説明します。

_'[    --take the first line of input, transfer it to the control stack, and start a for loop
_ 2:   --take one more line of input, and duplicate it so that there are two copies
n;     --take one copy and put into element n
0>     --push a zero onto the stack, remove the zero and the other copy of the input, and compare. A 1 will be placed on the control stack if the input was greater than zero, a 0 otherwise.
[      --starts another for loop if the comparison was true. This loop will be repeated once if the comparison was true and no times if it was false, so it is the same as an IF statement.
n~     --pushes n onto the main stack, then pops it ans replaces it with the contents of n, which is the number stored earlier
+      --takes the number and adds it to the running total, which is contained as the last item on the stack
]      --ends the inner for loop
]      --ends the outer for loop
`      --print the top item (also the only item) on the stack to output

6
このようなエントリは、作業環境へのポインタを使用して大幅に改善されます。
dmckee ---元モデレーター子猫

5
「人間が読める」という意味を理解していないと思います。
wchargin 14

3
@WChargin彼はPerlに慣れています
...-Caridorc

@WChargin学習するまで、すべての言語は読めません。;)
マーティンエンダー

8

Perl、31

<>;$i+=$_*($_>0)while<>;print$i

sayこれを使用して、これを少し短くしませんか?それは最高の29文字と結び付けられるでしょう。
ラマ氏

いいえ、say組み込みではなく、(少なくとも)文字数にカウントされるコマンドラインスイッチが必要です。
ティムウィ

これは、使用して29バイトに短縮することができ$\ 代わりに$i<>;$\+=$_*($_>0)while<>;print
ハイコOberdiek

5

Ruby 1.9.2、37

p eval [*$<].join.gsub(/\A\d+|-\d+|\n/, '+0')

ruby scriptname file_with_intsのように呼び出します。


Rubyはあまり読めませんが、テストケースの数も読み込めますか?
ジョーイ

いいえ、ありません
...-st0le

@ st0le:現在、タスクを解決するソリューションは明らかにないことに気付きました。
ジョーイ


5

ハスケル、58

t整数のみで正しく動作します。Spojに対しては実行しないでください。登録する気にならないからです。

f (x:l) = take x l
main = interact $ show . sum . f . map (max 0.read) . lines

t整数」とは何ですか?
wchargin

4

C 89文字のコード


x="%d";  main(b,a,t)  {  
  for(scanf(x,&t);t;t--)
    {  scanf(x,&a); a>0?b+=a:a; }  printf(x,b-1);
       return 0; }

コードを63バイト未満に削減しようとしましたが、89バイトにしか削減できません。63バイト以下に減らすのを手伝ってください。


1)90文字を数えました。2)return 0;必要はなく、for周期を縮小することができるfor(scanf(x,&t);t--;scanf(x,&a),a>0?b+=a:a);れるメーク78の文字...その==
VX

GCC 4.8.1でコンパイルされませんerror: initializer element is not computable at load time x="%d"
manav MN

4

Perl、33

<>;while(<>){$i+=$_ if$_>0}print$i

スペースが必要ですが、それを数えないのは奇妙に思えます。まあ、ルールはルールです。

うーん。合計にもカウントされない変数名を使用することで、おそらく回避できます。問題は、コードを貼り付ける方法がわからないということです。


それらを$ ^ A-$ ^ Zとして表示しますが、その変数の多くが特別な意味を持つことに注意してください。
-ninjalj


3

追Inデニス・M・リッチー

UNIX 57¹ 72:

n=$(head -n1 i); echo $(($(head -n $((n+1)) i | tail -n $n | grep -v "-" | tr '\n' '+')0))

iがintを含むファイルであると仮定します。

¹)が間違っていて、行数を含めて、1行追加しすぎました。

echo $(($(cat i | head -n $(head -n1 i)| grep -v "-" | tr '\ n' '+')0))


2

ハスケル、51

main = interact $ show . f . lines
f (x:l) = foldl (+) 0 $ map read l

(数えられないため、明確にするために余分なスペースがあります)

Haskellは興味深いものです。なぜなら、必要なスペースがかなりの数のプログラムを取得する傾向があるからです。


2
を忘れましたfilter (>0)
-FUZxxl

2

C、88


x="%d";  main(b,a,t)  {  
for(scanf(x,&t);t--;)  
{  scanf(x,&a); a>0?b+=a:0; }  printf(x,b-1);
return 0; }

別の大きな努力の後、コードは1文字少なくなりました。もっと減らすために私を助けてください。


6
次回は元の回答を編集するだけ
ラチェットフリーク

(削除return 0;)と({}のためにfor
l0n3sh4rk

b,x="%d";main(a,t){for(scanf(x,&t);t--&&scanf(x,&a);)b+=(a>0)*a;printf(x,b);}<-77バイト
-walpen

@walpen:彼らは、パラメータのような彼らの「argcのは、」あなたのbは未初期化され、1に設定されたことを、事実を使用...
VX

2

Befunge-98(24)

(必ず、負の数を読み取れるインタープリターを使用してください(多少一般的なバグのようですが、RcFungeは機能します))

<;-1\+*`0:&\_\#;.@;:;#&0 

Perl(25)

(Perlでは変数名に制御文字を使用できます。目標にカウントされないように、変数に^ B(ASCII 2)という名前を付けました。)

<>; $ ^ B + = $ _ *!/-/ for <>; print $ ^ B

(通常のバリアント(27文字)):

<>;$B+=$_*!/-/for<>;print$B

変数の命名を見て、その下の優れたものを完全に見落としたとき、私は最初にあなたのperlの答えを無視しました
-ardnew

2

APL(10)

+/{0⌈⎕}¨⍳⎕

説明:

  • ⍳⎕:行を読み取り、ユーザーの入力Nのリスト[1..N]を提供します
  • ¨:このリストの各要素に対して...(つまり、N回実行)
  • 0⌈⎕:行を読み取り、0の最大値と入力されたNを返します
  • これで、ユーザーが入力したすべての正のNと、ユーザーが負の値を入力した0のリストができました。
  • +/ このリストの合計を示します。
  • 結果はデフォルトで出力されます(他に何もしていないため)。

2

Mathematica:18 16

Boole[#>0]&/@x.x

素晴らしい機能ですが、これは指定された改行で区切られた入力をどのように処理しますか?合計の一部として、テストケース数パラメーターtをどのように組み込まないのですか?指定されたテストケースの数まで、合計がどのように合計されますか?
ジョナサンヴァンマトレ14年



1

befunge、35 24

:0`j&1-\&:0`*+\:0`3*j$.@

マリナスの答えを見て少しインスピレーションを得て、私は24人のキャラクターも管理しました。しかし、私はまったく異なるアプローチを持っています。



1

C、70 72文字

s;main(i,c){for(;c--;i>0?s+=i:0)scanf("%d",s?&i:&c);printf("%d",s-1);}

SPOJサイトの結果は間違いなく非現実的なようです。これを63に下げる方法はわかりません。

ただし、一部のコンパイラでは、未定義の動作を乱用することで68文字に到達できます。以下は、すべての引数がスタックで渡される32ビットgccを備えたx86 Linuxで機能します。

s;main(i,c){for(;c--;i>0?s+=i:0)scanf("%d",&i+!s);printf("%d",s-1);}

1

エクセル、27

=SUM(INDIRECT("A2:A"&1+A1))

A1のtをカウントし、残りのデータa2およびダウン


1

Clojure、108

(let [[n & m] (->> *in* java.io.BufferedReader. line-seq (map read-string))]
  (->> m (take n) (filter pos?) (apply +) println))

java.io.BufferedReader.それ自体は24文字かかるので、この部分を避けることができればと思っています。しかし、知る限りでは、STDINから行を読み取る機能はありません。


1

Perl、20

私はそれが古くて些細なものであることを知っていますが、Perlの答えはまだ改善することができます:

#!perl -p
$.<2or$\+=$_*!/-/}{

これはすごい!しかし、どういう}{意味ですか?
daniero

0

C ++:

#include<iostream>
using namespace std;
int main()
{
    int c,n,s=0;cin>>c;
    while(c--)
    {
        cin>>n;s+=n*(n>0);
    }
cout<<s;return 0;
}

長さ115文字。90に最適化する必要があります。


2
ちょうど標準的なトリック:標準C ++またはC99では戻り値は不要であり、には暗黙的return 0にありmainます。変数をグローバルにすることで、=0初期化を削除できます。最後に、for(;;)文字数と同じwhile()ですが、式を入力するための余分な場所が2つ得られます
。– han

これは既に古いですが、std::前に書いてcincoutそれを取り除くことで、using namespace std;さらに5文字を節約できます。
モーウェン

0

PHP、71

<?for($s=0,$t=fgets(STDIN)+0;$t--;$s+=($n=fgets(STDIN))>0?$n:0);echo$s;

0

Python:(92文字)

t = int(raw_input())
n = [int(raw_input()) for i in range(t)]
print(sum([n[i] for i in range(t) if n[i]>0]))

a=raw_inputおよびr=rangeを使用しa()r()後で使用すると、かなりの数の文字を節約できます。
モーウェン


0

C

void main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
     {
     if(i>0)
     sum=sum+i;
     }
printf("sum of positive numbers is %d",sum);
}

1
CodeGolf.SEへようこそ!他の答えを見ると、フォーマットされたコードと、実装言語を示す最小限のヘッダーがあることがわかります。さらに複雑な課題については、多くの場合、実装に関する注意事項やコードの制限や驚きがあります。これのいくつかがなければ、あなたは答えが好評になりそうにない。
dmckee ---元モデレーター子猫

文字をカウントし、インデントを追加してコードレイアウトを機能させ、出力の装飾を削除しました。ああ-今、もう一度数えなければなりません。:)
ユーザー不明

言語名を追加しました。ここでは削減の余地があります- sum減少させることができるためにs、出力文字列がちょうどすることができ"%d"、など
ギャレス


0

Pythonで45文字

c=0
j=input
for i in j()*[0]:
    b=j()
    c+=b*(b>0)
print c

1
どうやって数えたの?それは私に54文字を与えます。
マナトワーク

@manatwork、この質問には、空白をカウントしない非標準のスコアリングルールがあります。
ピーターテイラー

おっと、ごめんなさい。私は逃しました。ありがとう、@ PeterTaylor。
マナトワーク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.