沈むか泳ぐか


40

問題

最悪のシナリオは、単一のライン上の3つの数字で記載されnmおよびp。その行に続くのは、行ごとの値nm持つ行です。各値は、各セルが保持できる水の合計単位を表します。

次のp行は、翌日の天気を説明していpます。1ユニットの雨が毎日1つのセルに降ります。セル内の水の量が保持できる量を超えると、そのセルはあふれます。複数の隣接するセルがフルキャパシティの場合、それらは共通の隣接セルを共有する1つのセルとして扱われます(空白のグループをクリックするとマインスイーパを考えてください)。

  • 単一の中央セルには4つの隣接セルがあります
  • 2つの隣接するフルキャパシティの中間セルは、6つの隣接セルを持つ1つのセルとして扱われます
  • 単一のコーナーセルには2つの隣接セルがあります
  • 1つの壁のセルには3つの隣接セルがあります

セルがフラッディングすると、フラッドイベントが発生します。過剰な水はすべて、近隣に均等に分配されます。それが原因で1つ以上のネイバーがフラッディングする場合、別のフラッドイベントが発生します。これは、水が落ち着くか、都市が完全に浸水するまで続きます。

入力例

7 5 3
3 2 3 4 5
2 2 0 3 4
1 1 2 3 3
4 1 2 2 2
4 1 1 2 2
4 4 1 2 2
4 4 2 2 2
0 0
1 2
4 3

  • 0 0 行1、列1で雨が降ったことを意味します
  • 1 2 は、列2で雨が降ったことを意味します。

p数日間の雨の後、都市が完全に浸水している場合は、シンクを出力します。それ以外の場合は、Swimを出力します。

出力例

泳ぐ

仮定

  • 入力は、stdinを介して提供されるか、「city.txt」から読み取られるか、引数として受け入れられます。既に投稿された回答を無効にしないために、3つすべてが許可されています。
  • 水の容量は非負の整数になります。

学部生の40以上のチーム(A&M、UT、LSU、Rice、Baylorなど)がさまざまな言語でプログラミングコンテストに参加し、5時間でこの問題を解決できませんでした。そのため、このパズルには解決策を簡単にするキャッチがあることに言及するしかありません。最短のコードでもパズルが解決されると私は確信しているため、最短のコードが勝ちます。


それがあるnのラインm値または他の方法の周り?あなたの例は、書かれた仕様と一致しません。
algorithmshark 14年

@algorithmshark修正
レインボルト14年

13
確かではありませんが、雨の量がすべての四角が保持できる雨の総量よりも大きい場合、あなたは沈むようです。それ以外の場合はフロートします。これでしょうか?
Hosch250 14年

2
@ hosch250楽しみを損なう!
レインボルト14年

1
「過剰な水は隣人に均等に分配されます。」-それはおそらく水1単位です。たとえば0.25、隣接する各セルにユニットとして分配されますか(単一の中間フラッディングセルを想定)
ニールスレーター14年

回答:


16

Golfscript、37 30文字

新しく改良された、ヒントを提供してくれたPeterTaylorに感謝します。

~](\(@*\(@@<{+}*>"SwimSink"4/=

説明

Code                     -                                            - Stack
~]                       - parse input into an array of integers      - []
(                        - pop first number and put on stack          - [] 7
\(                       - \ swaps top two, then pop first num again  - 7 [] 5
@                        - bring 3rd down from stack to front         - [] 5 7
*                        - mult. this is grid size                    - [] 35
\(@                      - bring next # out - the days of rain        - [] 3 35
@                        - bring array out                            - 3 35 []
<                        - take first 35 elements out of array.
                           this extracts just the capacities and 
                           consumes the rest                          - 3 []
{+}*                     - fold the array using plus - this sums the
                           entire thing                               - 3 86
<                        - greater-than comparison: 3 > 86?           - 0
"SwimSink"4/             - push a string and split it to groups of 4  - 0 ["Swim" "Sink"]

=                        - index into the array using the result of
                           the comparison. if rain > capacity, then
                           sink, else swim                            - "Swim"

その後、プログラムは終了し、スタックを出力します。


古いバージョン+説明:

[~](\(@*\(@{\(@\-}*\;0>"Sink""Swim"if

同じアプローチフォルス、ちょうど)= Golfscripted。より効率的にすることができます。入力は標準入力からです。

説明

Code                     -                                            - Stack
[~]                      - parse input into an array of integers      - []
(                        - pop first number and put on stack          - [] 7
\(                       - \ swaps top two, then pop first num again  - 7 [] 5
@                        - bring 3rd down from stack to front         - [] 5 7
*                        - mult. this is grid size                    - [] 35
\(@                      - bring next # out - the days of rain        - [] 3 35
{                        - define a block which...
 \(@                     - brings next number out
 \-                      - swaps and subtracts 2nd down from top
}                                                                     - [] 3 35 {}
*                        - repeat that block 35 times. this ends up
                           pulling the capacities out one by one
                           and decrementing our number-of-days 
                           number by each one                         - [] -84 
\;                       - swap and kill the array to get rid of
                           unused input                               - -84
0>"Sink""Swim"if         - if the num > 0, evaluate to "Sink", 
                           otherwise to "Swim"                        - "Swim"

その後、プログラムはスタックを出力しますが、これは単なる答えです。


]一致しない場合、[スタック全体が配列に収集されるため、イニシャル[~]はに簡略化できます~]grid_size配列の最初の要素を取得するには、を使用する<ので、<{+}*ほぼ確実に総容量を追加することで少し節約できます。0>"Sink""Swim"ifことができます0>"SinkSwim"4/=
ピーターテイラー14年

@PeterTaylor:ヒントをありがとう!あなたはおよそよろしいですか~]?私はそれを試しましたが、うまくいかないようでした。最後のハックは必要ですが、いいです"SwimSink"-それを使用します。そして、配列のことも有望であるように思われます。
クラウディウ14年

確かです。それは私と他の人が長年使ってきた標準的なトリックです。
ピーターテイラー14年

@PeterTaylor:うーん、変です。リンクしたインタプリタで試してみてください-失敗します。それでは-多分、Webインタープリターは非標準です。しかし、私も試してみましたがruby golfscript.rb、まだ機能しませんでした...あなたの側で機能することを確認できますか?私は両方に同じエラーを取得:undefined method '+' for nil:NilClass (NoMethodError)
クラウディウ

1
文字列リテラルを挿入して、stdinの不足を置き換える場合、実際に「from stdin」から来る空の文字列を削除するために、セミコロンを前に付ける必要があります。それでうまく動作します
ピーターテイラー14年

20

C:100 96 95文字

n,m;main(p){scanf("%d%d%d",&n,&m,&p);for(n*=m;n--;scanf("%d",&m))p-=m;puts(p>0?"Sink":"Swim");}

五時間?5分かかりました。:)

Aragaer、簡素化してくれてありがとう!しかし、mainの2番目の引数が以外の型である場合、Clangがエラーをスローするのを見て、変数宣言とmainの引数を再配置しましたchar **


3
96 -p;main(n,m){for(scanf("%d%d%d",&n,&m,&p),n*=m;n--;scanf("%d",&m),p-=m);puts(p>0?"Sink":"Swim");}
aragaer

1
95- n,m;main(p){for(scanf("%d%d%d",&n,&m,&p),n*=m;n--;scanf("%d",&m))p-=m;puts(p>0?"Sink":"Swim");}。私はのアイデアも試しましたがn-=scanf、その後プログラムが正しいかどうかはわかりません。最初scanffor、文字数を変更せずに前面に移動できます。
aragaer

n-=scanf...n-=1基本的にはプリインクリメントであるため、動作しません。したがって、南東の角を逃します。他の変更は素晴らしいです。
フォルス

7

Python、4行、175文字

import sys 
F=sys.stdin
n,m,p=[int(a) for a in F.readline().split()]
print("sink") if p > sum([sum(int(x) for x in F.readline().split()) for a in range(n)]) else print("swim")

笑、40以上のチームがキャッチを見つけてしまったのかしら...難しい方法で解決した後です。


10
私は40以上のチームの1つにいました。私たちは失敗した後、キャッチを与えられました。講堂の全員が同時に顔を合わせた。ここで言及するべきではなかったと思います。君たちは速すぎた!
レインボルト14年

痛い!ところで、この種の質問については、stdinから入力を取得する必要がありますか?-私はstackexchangeが初めてです。:)
swalladge 14年

STDINを指定するように質問を編集しましたが、回答が無効になるのではないかと心配しました。私はここで約1か月間パズルを読んでいますが、人々がSTDINを指定したかどうかに気付いていません。
レインボルト14年

1
@swalladge Codegolfへようこそ!を先頭に追加して、見出しを見出しにすることをお勧めし#ます。
ティムウォラ14年

2
あなたが使用している場合は108にそれをダウンさせることができますinput()し、map()n,_,p=map(int,input().split());print(['sink','swim'][p>sum(sum(map(int,input().split()))for a in range(n))])
ブレンダー

6

J(50文字)とK(40)の二重機能

いつものように、これら2つのソリューションのソリューションはまったく同じ構造であるため、両方ともここにあります。しかし、Kはずっと短いので、嬉しい驚きです。

>Sink`Swim{~(]<[:+/[+/@".@$+1!:1@#1:)/0 2{".1!:1]1

説明:

  • ".1!:1]1 -最初の行を読み取り、整数に変換します。
  • (...)/0 2{-インデックス0および2(nおよびpそれぞれ)の項目を取得し、それらを(...)それぞれverbの左右の引数として使用します。
  • +1!:1@#1:- n+p行を読みます。
  • [+/@".@$- $最初のn行([)を取得し、残りを破棄してから、整数(".)に変換し、各行で合計します(+/)。
  • ]<[:+/-行の合計を加算し、この値を正しい引数と比較しますpp合計より小さい場合はtrueを生成します。
  • >Sink`Swim{~- Swim上記の比較の結果が真であるかSink、偽であるかを選択します。

使用法:

   >Sink`Swim{~(]<[:+/[+/@".@$+1!:1@#1:)/0 2{".1!:1]1
7 5 3
3 2 3 4 5
2 0 3 3 4
1 1 2 3 3
4 1 2 2 2
4 1 1 2 2
4 4 1 2 2
4 4 2 2 2
0 0
1 2
4 3
Swim

そして今、K:

`Sink`Swim@{z<+//.:'x#0::'(x+z)#`}.. 0:`

説明:

  • . 0:` -入力の行を読み取り、整数の配列に変換します。
  • {...}.-この3つの数字をこの関数のn m p引数として使用しx y zます。
  • 0::'(x+z)#`- x+z入力ファイルハンドルのコピーを作成`し、それぞれの行を読み取ります(0::')。
  • .:'x#-最初のxアイテムを取得し、それぞれを数値のベクトルに変換します。
  • z<+//-マトリックス全体を合計し、それがより大きいかどうかを確認しますz
  • `Sink`Swim@-リターンSinkまたはSwimテストがtrueを返したかどうかによります。

使用法:

  `Sink`Swim@{z<+//.:'x#0::'(x+z)#`}.. 0:`
7 5 3
3 2 3 4 5
2 2 0 3 4
1 1 2 3 3
4 1 2 2 2
4 1 1 2 2
4 4 1 2 2
4 4 2 2 2
0 0
1 2
4 3
`Swim

6

APL、35

4↑'SwimSink'⌽⍨4×x[3]>+/{+/⎕}¨⍳1⌷x←⎕

許可されているかどうかはわかりませんが、「都市」の後に入力を受け付けなくなります

x←⎕入力を取得し、変数に格納x(スペース区切りの数値を数値配列として解釈される)
1⌷抽出インデックス1(APLアレイは1ベースである)
1から引数の配列を生成(1⌷x←⎕この場合は)
¨「マップ」動作
{+/⎕}テイク配列から入力して合計を返す
+/マップ操作によって生成された配列
4×x[3]>の合計合計< x[3](1または0を返す)かどうかをテストし、4を掛け
'SwimSink'⌽⍨ます'SwimSink'その量で文字列を回転します
4↑最後に、文字列の最初の4文字を抽出します


重要なのは、与えられた入力に対して正しい答えを出力することだけだと思います。これがCodeGolfにとって異常な場合は、誰かが私に知らせてくれることを願っています。
レインボルト14年

変更は⎕IO←0、その後置き換える4↑'SwimSink'⌽⍨4×'Swim' 'Sink'⊃⍨x[3]x[2]、と1⌷x⊃x2つのバイトを保存します。
アダム

6

AWK、70

n{for(;NF;NF--)s+=$NF;n--}NR==1{n=$1;p=$3}END{print p<s?"Swim":"Sink"}

これは私の提出に関するlaindirによる改善です(86):

NR==1{h=$1;w=$2;r=$3;next}NR<=h{for(i=1;i<=w;++i)c+=$i}END{print(c>r?"Swim":"Sink")}

NR<=hあるべきNR<=h+1容量の最後の行がスキップされているとして、そうでなければ、偽のシンクを取得します。これは70に短縮することもできますn{for(;NF;NF--)s+=$NF;n--}NR==1{n=$1;p=$3}END{print p<s?"Swim":"Sink"}
laindir

1
@laindirまあ、改善してくれてありがとう!AwkはAPL、J、Kのすぐ隣に来て、コードゴルフでみんなを打ち負かすために育てられました。:
user40989

@ user40989わかりません。Awkは、ゴルフ用の言語ではなく、商用プログラミング言語の(幹の)言語であっても、J / K / APLより40〜100%長いようです。
アダム

5

CoffeeScript- 128 113

文字列を唯一の引数としてとる関数:

s=(l)->l=l.split /\n/;[n,m,p]=l[x=0].split /\s/;x+=c|0 for c in r.split /\s/ for r in l[1..n];`p>x?"Sink":"Swim"`

インデントを削除して、最初の行のすべてをセミコロンで区切って移動できます。の`p>x?"Sink":"Swim"`代わりに書くこともできますif p>x then"Sink"else"Swim"。3番目のステートメントの括弧も必要ありません。
コンラッドボロスキー14年

4

SED、128

sedこのバージョンを書くのは楽しかったです。次の欠点があります。

  • 雨の線を簡単に認識できるように、市には3つ以上の列があると想定しています。

  • 各都市のキャパシティが0〜9の範囲にあると想定しています。

ここにあります:

1d
s/^. .$/R/
G
:a
s/[\n 0]//
/[2-9]/{s/^/C/
y/23456789/12345678/}
s/1/C/
s/0//
s/RC//
h
ta
${s/R//g
s/^Sink//
s/.*C$/Swim/
p}

-nフラグを付けて呼び出します。


3

SWI-Prolog 79

この回答が標準入力ではなくクエリによる入力を受け取るという事実を気にしない場合:

s(A,L):-append(A,B),sumlist(B,C),length(L,D),(D>C->E='Sink';E='Swim'),print(E).

答えは入力形式を検証しませんが、プログラミングコンテストでもそうする必要はないので、問題ではないと思います。

サンプルクエリ(質問の例を使用):

s([[3,2,3,4,5],
   [2,2,0,3,4],
   [1,1,2,3,3],
   [4,1,2,2,2],
   [4,1,1,2,2],
   [4,4,1,2,2],
   [4,4,2,2,2]],
  [(0,0),
   (1,2),
   (4,3)]).

1

Python-152

import numpy
n, m, p = map(int,raw_input('').split())
print 'swim' if p<numpy.sum(numpy.matrix(';'.join([raw_input('') for i in range(n)]))) else 'sink'

1
空白を削除することから始めることができます。後,、前、後'、後)
Ry- 14年

1

Scala-128

val a=readLine.split(' ')map(_.toInt);println(if((1 to a(0)map(x=>readLine.split(' ')map(_.toInt)sum)sum)>a(2))"swim"else"sink")

いくつかの括弧などを省略することも可能かもしれませんが、Scalaは句読点とポイントフリースタイルと()対{}とその他について本当に気まぐれです。


0

Javascript-73文字

for(i=c=0,a=s.split(/\s/);i++<a[0]*a[1];)c+=a[2+i]*1;c>a[2]?"Swim":"Sink"

入力が変数内にsあり、Swimまたはを出力すると仮定しますSink

例:

元の質問から-これをブラウザコンソールに入力します。

s="7 5 3\n3 2 3 4 5\n2 2 0 3 4\n1 1 2 3 3\n4 1 2 2 2\n4 1 1 2 2\n4 4 1 2 2\n4 4 2 2 2\n0 0\n1 2\n4 3";
for(i=c=0,a=s.split(/\s/);i++<a[0]*a[1];)c+=a[2+i]*1;c>a[2]?"Swim":"Sink"

出力:

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