コンセント


23

これはNCPC 2005の問題です。ロイには、コンセントが1つしかないアパートがありますが、電源タップがたくさんあります。所有する電源タップを使用して、所有できるコンセントの最大数を計算します。電源タップごとのコンセントの数は、入力として指定されます。

ストリップのアウトレットの数がそれぞれ

p1,p2,,pn

アウトレットの数は 、

1n+ipi

または

1+p11+p21++pn1

プログラムまたは関数への入力は、空ではない一連の正の整数です。

2 3 4
> 7
2 4 6
> 10
1 1 1 1 1 1 1 1
> 1
100 1000 10000
> 11098

17
そして、私はあなたが電源タップをチェーンすることになっていないと思った
ジョーイ

Retinaの答えは、単項入力を使用する唯一の答えであると言えます。codegolf.stackexchange.com/questions/71047/electrical-outlet/…のコメントディスカッションをご覧になることをお勧めします。チャレンジ、入力が10進数でなければならないことを指定できてうれしいです(そして、それに応じて私の答えを修正します)。
マーティンエンダー

7
電気は非常に高価であるため、より多くのエネルギー使用を回避するよう、あなたのコードはできるだけ短くする必要があります

1
@cat古いハムスター駆動のチューリングマシンと機械コンピューターを掘り起こす時間です。
ファラプ

1
@immibisは確かですが、出力はバイトストリームに含まれる情報として扱われ、端末によってレンダリングされた場合のようには扱われません。
マーティンエンダー

回答:



29

網膜、3バイト

 1

後続の改行は重要です。

入力は、スペースで区切られた単項数のリストです。

オンラインでお試しください!

説明

コード1は、文字列からすべてのスペースとその後を削除するだけです。これが機能する理由は次のとおりです。

単項式での加算は簡単です。数字を連結するだけで、区切り文字を削除するのと同じです。1 1ずつ減らすことも簡単です。各数値からa を削除するだけです。ただし、デクリメントされた入力の合計よりも1多い必要がある1ため、スペースの後にあるs のみを削除し、最初の入力以外のすべてをデクリメントします。


1
単項式での入力を許可すべきかどうか疑問に思っています。
ジョンドボラック

@JanDvorakは、チャレンジが明示的に10進入力を指定しない限り、デフォルトです。(回答のリンクを参照してください。)でも、ジェリーは勝ちます。
マーティンエンダー

@MartinBüttnerこの質問と元の課題の両方にサンプルデータがあります。(特に明記されていない限り)合格に必要な(十分ではありませんが)基準である必要があり、コードが逐語的なサンプルデータで機能するとは思わないですか?
nitro2k01

1
@ nitro2k01いいえ(その場合、ほとんどの回答はおそらく無効です)。挑戦が1つの特定の入力形式明確に指定しない限り、通常、私たちはどんなネイティブのリスト形式でリストも取ることができると思います。数値形式についても同じことが言えます(チャレンジが禁止されていない限り、少なくとも単項式およびバイト値として整数を取ることはコンセンサスによって許可されます)。チャレンジで考えられるすべてのネイティブ入力形式にサンプルデータを含めることはほとんど不可能です。
マーティンエンダー

@MartinBüttnerImo、それは勧告が取り組んでいる問題ではありません。まだこれに反しているのは、(私が間違っていない限り)Retinaで単項がサポートされているかネイティブの数値形式であるため機能しないが、文字列を文字列データとして処理するときに機能することです。それはハックです。それは賢いハックでさえありますが、私はまだそれがルールに従っていると確信していません。バイトのリストがbfのネイティブ形式であるのと同じように、スペースで区切られた単項数がRetinaのネイティブ形式である場合、推奨事項が適用されることに同意し、別の意見があります。
nitro2k01

9

六角形18 14バイト

.?<_(@'")>{+.!

展開:

  . ? <
 _ ( @ '
" ) > { +
 . ! . .
  . . .

オンラインでお試しください!

サイドレングス2は可能だとは思いませんが、これよりも効率的なサイドレングス3ソリューションがあるはずです。

これは通常の「すべて減少、合計、増分」アプローチですが、Hexagonyでどのように機能するかを示すために、後で図を追加する必要があります。


7

Python、24バイト

lambda*n:1-len(n)+sum(n)

オンラインで試す


1
これは、関数が最初に割り当てられ、次に他の変数からの入力に適用されることを前提としています。
-juandesant

1
@juandesant ...これはまったく問題ありません。これは関数リテラルであり、有効な送信形式です。
FlipTack


7

Haskell、17 15バイト

foldl1$(+).pred

使用例:( foldl1$(+).pred ) [2,4,6]-> 10

古いバージョン、異なるアプローチ、17バイト:succ.sum.map pred


6

J、6バイト

+/+1-#

合計プラス1マイナス長。次のように括弧で囲んで適用します。

   (+/+1-#) 2 3 4
7

6

ラビリンス、9バイト

"?;)!@
+(

オンラインでお試しください!

通常の入門書:

  • Labyrinthは2Dおよびスタックベースです。スタックの下部には無限の数のゼロがあります。
  • 命令ポインタがジャンクションに到達すると、スタックの最上部をチェックして、次にどこを向くかを決定します。負は左、ゼロは順方向、正は右です。

ここでは、左上"から何もせずに右に向かっていきます。次は?STDINからintを読み取ります(スペースなどの整数として解析できない文字を破棄します)。現在、2つのケースがあります。

入力が正の場合、右に曲がり、以下を実行します。

(            decrement top of stack
+            add top two stack elements
             [continue loop]

入力がゼロ(EOFで発生)の場合、次のように実行します。

;            pop zero from EOF
)            increment top of stack
!            output top of stack as number
@            halt program

5

Pyth、5バイト

hstMQ

increment(sum(map(decrement、input))))


5

ES6、25バイト

a=>a.map(n=>r+=n-1,r=1)|r

4
「reduceがゲームに勝つまれなケースの1つ」...そしてそれも25 l=>l.reduce((a,b)=>a+b-1)です。
edc65

@ edc65ええ、(,b)費用はかかりますが、私もそのバージョンが好きです。
ニール


4

05AB1E、4バイト

コード:

E<O>

説明:

E     # Evaluates input
 <    # Decrement on list
  O   # Compute the total sum
   >  # Increment on the sum
      # Implicit: output top of the stack

配列のような入力を受け取ります(例[3, 4, 5])。


ゴルフラングのために非常にエレガントな
ファラプ

4

星空26 24バイト

, + '`      + ** `, +'*.

改行で区切られた整数が必要です。オンラインでお試しください!

-2バイトの@MartinBüttnerに感謝します。

,           Read line as integer
 + '        Dupe and jump to label 1 if nonzero
`           Set label 0
      +     Push 1
 *          Sub
*           Add
 `          Set label 1
,           Read line as integer
 + '        Dupe and jump to label 0 if nonzero
*           Add
.           Output as integer

ループは展開され、最初の数値は減分されず、増分する必要がなくなります。Starryでは数字をプッシュするのは高価です...


20バイトしかカウントしません。
アディソンクランプ

1
@VoteToClose先行スペースをカウントしましたか?(26バイトについて話していると仮定しています)
Sp3000

4

Bash + GNUユーティリティ、16

N電源タップがある場合N-1は、コンマ区切りの入力リストに区切り文字が必要です。必要なことは、セパレータを置き換えて- 1 +、算術的に評価することだけです:

sed s/,/-1+/g|bc

または同じトリックを使用します:

Pure Bash(外部ユーティリティなし)、19

echo $[${1//,/-1+}]

3

APL(NARS 2000)、13 10バイト

{1+(+/⍵)-⍴∊⍵}

編集:Lynnの(より良い)アプローチで10まで。

{1++/1-⍨⍵}


3

gs2、5バイト

(CP437エンコード。)

W&Φd'

それがありますread-nums dec m1 sum inc


3

CJam、7バイト

q~:(:+)

ここでテストしてください。

Lynnのアプローチと同じアプローチ(すべて減少、合計、増加)。これは8バイトでも機能します(もう少し興味深いかもしれません)。

q~{(+}*

これは、リスト上で「デクリメント、追加」を折りたたみます。そうすることで、デクリメントは最初の要素以外のすべての要素にのみ適用されるため、個別にインクリメントを処理する必要はありません。


3

C、60 59 55バイト

x;main(s){while(~scanf("%i",&x))s+=x-1;printf("%i",s);}



2

Perl 6、20バイト

put 1+sum --«@*ARGS

(の<<代わりに使用できます«

使用法:

$ perl6 -e 'put 1+sum --«@*ARGS' 100 1000 10000
11098

«Perl演算子ですか?
user253751

@immibis実際には、いくつかのPerl 6演算子の@arraya »+« @arrayb ++«@array @array».method @array»++ « a 'space separated' list of words »一部です。それらのいくつかは、他の演算子と結合するという点でMeta演算子と呼ばれるものです。(現在、Perl 5にはこれらの演算子はありません。)
ブラッドギルバートb2gills

2

Perl 5 23 + 2 = 25または19 + 2 = 21

-apフラグが必要です:

map{$.+=($_-1)}@F;$_=$.

ファイルに保存して実行

perl -ap file.pl

編集:別の答え、より小さい(19 + 2)が、基本的にdev-nullの答えからコピー:

$.+=$_-1for@F;$_=$.

2

F#、25バイト

Seq.fold(fun s n->s+n-1)1

これは、整数の配列/リスト/シーケンスを受け取り、必要な結果を返す関数です。

使い方:

Seq.foldシーケンスのすべての要素に関数を適用し、その間に何らかの状態を保持することができます。最初の要素に適用された関数の結果は、2番目の要素の関数に設定される状態を示します。たとえば、リストを要約するには[1; 3; 4; 10]、次のように記述します。

Seq.fold (fun sum element -> sum + element) 0 [1; 3; 4; 10]
         (       function to apply        ) ^ (sequence to process)
                                     ( initial state )

次のように適用されます:

// First, initial state  + first element
0 + 1  = 1
// Then, previous state + next element until the end of the sequence
1 + 3  = 4
4 + 4  = 8
8 + 10 = 18

最後の状態はの戻り値ですSeq.fold


2

𝔼𝕊𝕄𝕚𝕟、5文字/ 7バイト

ï⒭+‡_

Try it here (Firefox only).

10ビット文字のカスタムエンコーディングを使用します(thx @Dennis!)。走るencode('ï⒭+‡_')JSコンソールでして、エンコードされたフォームを取得します。decode(/*ENCODED TEXT HERE*/)をデコードします。

説明

次のようにJavascript ES6に変換します。

i=>i.reduce(($,_)=>$+--_)

興味深いエンコーディング。
-lirtosiast

それも非常にうまく機能します。
ママファンロール

2

Mornington Crescent1909 1873 1839バイト

Take Northern Line to Stockwell
Take Victoria Line to Seven Sisters
Take Victoria Line to Victoria
Take Circle Line to Victoria
Take Circle Line to Bank
Take Circle Line to Hammersmith
Take Circle Line to Cannon Street
Take Circle Line to Hammersmith
Take Circle Line to Cannon Street
Take Circle Line to Bank
Take Circle Line to Hammersmith
Take District Line to Upminster
Take District Line to Hammersmith
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Turnham Green
Take District Line to Hammersmith
Take District Line to Turnham Green
Take District Line to Notting Hill Gate
Take Circle Line to Notting Hill Gate
Take Circle Line to Bank
Take Circle Line to Embankment
Take Northern Line to Stockwell
Take Northern Line to Embankment
Take Circle Line to Temple
Take Circle Line to Hammersmith
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Blackfriars
Take Circle Line to Embankment
Take District Line to Parsons Green
Take District Line to Bank
Take Circle Line to Hammersmith
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Parsons Green
Take District Line to Embankment
Take Circle Line to Blackfriars
Take Circle Line to Bank
Take Northern Line to Angel
Take Northern Line to Bank
Take Circle Line to Bank
Take District Line to Upminster
Take District Line to Bank
Take Circle Line to Bank
Take Northern Line to Mornington Crescent

オンラインでお試しください!


「すべての指示の90%は、ディストリクトラインの使用に関するものです。」これは、Districtがすべての演算ステーションがある場所だからです。ただし、TIOでは、どの例でも機能しないようです
-NieDzejkob

可能な場合は短い行名を使用して1873バイト
-NieDzejkob

TIOのインタープリターにはバグがあり、Turnham Greenを実装していません
-pppery

ナイスキャッチ。アップストリームで修正するPRを送信しました。
-NieDzejkob

1

Python 3、79バイト

import sys
print(sum(map(lambda x: int(x)-1, sys.stdin.readline().split()))+1)

改行を2バイトとしてカウントしているようです。バイトを保存するためにセミコロンに置き換えてください。いくつかのスペースも削除できます。
ダフィー

1

ルビー、30バイト

$*.inject(1){|s,v|s+=v.to_i-1}

十分に単純です-1から開始して、指定された数値をそれぞれ-1加算します(コマンドライン引数はにあります$*)。恥injectは長い言葉です。


1

PowerShell、19バイト

$args-join'-1+'|iex

1 + p1-1 + p2-1 + ... + pn-1等しいことに注意してくださいp1-1 + p2-1 + ... + pn

を使用して、入力を個別のコマンドライン引数として受け取ります$args。私たち-joinと一緒に、これらの-1+区切り文字は、次のような文字列を作成します2-1+3-1+4。次に、文字列はInvoke-Expression(に類似したeval)にパイプされ、結果を出力します。


1

Perl、21 + 2 = 23バイト

$a+=$_-1for@F;say++$a

必要-a-E

$ perl -aE'$a+=$_-1for@F;say++$a'<<<'2 3 4'
7

あなたは使用することができます-a得るためにフラグを@Fすでに分割要素と変数を、そしてあなたがdont'needよう-pで-n置き換えるsay21 + 2にそれを減らし、:$a+=$_-1for@F;$_=++$a
ChatterOne

とにかく使用する必要があるため、-p代わりに使用するsayことは同じ$_=です。
andlrc

@ChatterOne -aは良いアイデアです!
andlrc

1

Brainfuck、15バイト

仮定:すべての入力が使い果たされると、演算子は0を返し、プラグが0の延長コードはありません。また、IOはASCII文字コードではなくバイト値である必要があります。

+>,[-[-<+>],]<.

説明:これは2つのレジスターを使用します。プラグイン可能なデバイスの数を表す「Value」アキュムレータレジスタ、および現在のコードの値を追跡する「current cord」レジスタ。既存のアウトレットの値を1増やすことで開始します。次に、延長コードごとに、プラグが使用されているため値から1を引き、プラグの数だけ値を増やします。

ほとんどのオンラインインタープリターは、生のバイト入力モードでは動作しません。オンラインでテストするには、次のコードを使用します。

+>,[->-[>+<-----]>---[-<+>]<[-<->]<[-<+>],]<.

どこかでプログラムをテストできますか?
PAL GD

ありがとう、それらの間違いを修正しました。バイトモードで動作するオンラインインタープリターを知りません。任意のオンラインインタープリターで実行される入力から「0」を減算する実装を一緒にスローできます。
イーサン

コードをテストする場合は、ここで実行してください。copy.sh / brainfuck数値の間にスペースを入れないでください。残念ながら、ASCIIモードで動作しているため、デモコードは1桁の値でのみ機能します。ただし、15バイトバージョンは、255以下の値で正常に動作します。実行後、メモリダンプを表示して最終値を表示します。
イーサン

ある日、BFには予想されるIOの適切な標準があり、たとえば「入力と出力はすべてnull文字で終了する」の代わりに「標準3を使用する」と言うことができます。
ファラプ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.