우리는 싱크대 또는 수영합니까?


40

문제

최후 심판의 시나리오는 한 줄에 세 개의 숫자에 의해 설명되고 n, m하고 p. 그 라인 다음에는 라인 당 값 이있는 n라인이 m있습니다. 각 값은 각 셀이 보유 할 수있는 총 물 단위를 나타냅니다.

다음 p줄은 다음 p날 날씨를 설명합니다 . 매일 1 셀에 1 단위의 비가 내립니다. 세포의 물량이 보유 할 수있는 양을 초과하면 세포가 침수됩니다. 인접한 여러 셀이 최대 용량 인 경우 공통 이웃을 공유하는 하나의 셀로 취급됩니다 (공백 그룹을 클릭 할 때 지뢰 찾기를 생각하십시오).

  • 단일 중간 셀에는 4 개의 이웃이 있습니다.
  • 2 개의 인접한 전체 용량 중간 셀은 6 개의 이웃이있는 하나의 셀로 처리됩니다.
  • 단일 코너 셀에는 2 개의 이웃이 있습니다
  • 단일 벽 셀에는 3 개의 이웃이 있습니다.

셀이 플러딩되면 플러드 이벤트가 발생합니다. 모든 초과 물은 이웃에 골고루 분배됩니다. 그로 인해 하나 이상의 이웃이 홍수를 일으키면 다른 홍수 이벤트가 발생합니다. 이것은 물이 식거나 도시가 완전히 침수 될 때까지 계속됩니다.

입력 예

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

  • 0 0 열 1, 열 1에 비가 내렸다는 의미
  • 1 2 열 2, 열 3에 비가 내렸다는 것을 의미합니다 (물이 0이되며 즉시 홍수가 발생할 수 있습니다).

p비가 온 후 도시가 완전히 침수되면 Sink를 출력 합니다. 그렇지 않으면 Swim을 출력하십시오 .

출력 예

수영

가정

  • 입력은 stdin을 통해 제공되거나 "city.txt"에서 읽거나 인수로 승인 될 수 있습니다. 세 가지 모두 이미 게시 된 답변을 무효화하지 않도록 허용됩니다.
  • 물 용량은 음이 아닌 정수입니다.

다양한 언어로 프로그래밍 콘테스트에서 경쟁하는 40 명 이상의 저학년 대학생 (A & M, UT, LSU, Rice, Baylor 등)이 5 시간 안에이 문제를 해결할 수 없었습니다. 그로 인해 나는 해결책을 사소하게 만드는이 퍼즐에 캐치가 있다고 언급 할 수는 없습니다. 가장 짧은 코드는 퍼즐을 해결할 것이라고 확신하기 때문에 가장 짧은 코드가 여전히 승리합니다.


그것은 가치의 nm입니까 아니면 다른 방법입니까? 귀하의 예가 작성된 사양과 일치하지 않습니다.
algorithmshark

@algorithmshark 수정 됨
Rainbolt

13
확실하지는 않지만 비의 양이 모든 사각형이 보유 할 수있는 비의 합보다 큰 경우 가라 앉는 것 같습니다. 그렇지 않으면 당신은 뜬다. 이거예요?
Hosch250

2
@ hosch250 재미를 망치고!
Rainbolt

1
"과잉 된 물은 이웃에게 골고루 분배됩니다." -그것은 1 단위의 물일 것입니다. 예를 들어 0.25단위를 인접한 각 셀에 분배합니까 (단일 중간 홍수 셀을 가정)?
Neil Slater

답변:


16

골프 스크립트, 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

Fors 와 동일한 접근 방식 , 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/=
피터 테일러

@ PeterTaylor : 팁 주셔서 감사합니다! 확실 ~]합니까? 나는 그것을 시도했지만 작동하지 않는 것 같습니다. 마지막 해킹은 훌륭하지만 "SwimSink"사용해야합니다. 배열도 유망한 것으로 보입니다.
Claudiu

나는 확실합니다 : 그것은 나와 다른 사람들이 수년간 사용해 온 표준 트릭입니다.
피터 테일러

@PeterTaylor : 흠 이상한. 연결된 인터프리터 에서 시도하십시오 -실패합니다. 그렇다면 웹 통역사가 비표준 일 수 있습니다. 그러나 나는 또한 시도했지만 ruby golfscript.rb여전히 작동하지 않습니다 ... 당신이 당신의 끝에 작동하는지 확인할 수 있습니까? 두 가지 모두에 대해 동일한 오류가 발생합니다.undefined method '+' for nil:NilClass (NoMethodError)
Claudiu

1
stdin 부족을 대체하기 위해 문자열 리터럴을 삽입 할 때는 실제로 "stdin"에서 오는 빈 문자열을 제거하기 위해 세미콜론을 앞에 추가해야합니다. 그것으로 잘 작동합니다
Peter Taylor

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에 대한 두 번째 인수가 이외의 유형 인 경우 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지만 그 후에 프로그램이 올바른지 확실하지 않습니다. 먼저 문자 수를 변경하지 않고 scanf앞쪽으로 이동할 수 있습니다 for.
aragaer

n-=scanf...n-=1기본적으로 사전 증분 처럼 작동하지 않으므로 남동쪽 모서리를 놓칠 수 있습니다. 다른 변화는 훌륭합니다.
Fors

7

파이썬, 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")

Lol, 40 개 이상의 팀이 어획량을 찾은 후 결국 어려운 일을했는지 ​​궁금합니다.


10
나는 40 개 이상의 팀 중 하나에있었습니다. 우리는 실패 후 캐치를 받았습니다. 강당의 모든 사람들은 동시에 얼굴을 pal습니다. 아마 여기서 언급하지 않았어야한다고 생각합니다. 너희들은 너무 빨랐다!
Rainbolt

아야! 그건 그렇고, 이런 종류의 질문에 대한 표준 입력에서 입력을 받아야합니까? -스택 교환이 처음입니다. :)
swalladge

STDIN을 지정하기 위해 내 질문을 편집하려고했지만 답변이 무효화 될까봐 두려웠습니다. 나는 약 한 달 동안 여기에서 퍼즐을 읽었으며 사람들이 STDIN을 지정했는지 여부를 실제로 알지 못했습니다.
Rainbolt

1
@swalladge Codegolf에 오신 것을 환영합니다! 을 앞에 추가하여 헤드 라인을 헤드 라인으로 만드는 것이 좋습니다 #.
TimWolla

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) 이중 기능

평소와 같이이 두 솔루션의 구조는 동일하므로 모두 여기에 있습니다. K는 훨씬 짧아서 놀랍습니다.

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

설명:

  • ".1!:1]1 -첫 번째 줄을 읽고 정수로 변환하십시오.
  • (...)/0 2{-인덱스 0과 2 ( np각각) 의 항목을 각각 동사의 왼쪽과 오른쪽 인수로 사용하십시오 (...).
  • +1!:1@#1:- n+p줄을 읽습니다 .
  • [+/@".@$- $첫 번째 n행 ( [)을 가져 와서 나머지를 버린 다음 정수 ( ".) 로 변환하고 각 행 ( +/) 에서 합계를 계산합니다 .
  • ]<[:+/-행 합계를 더한 다음이 값을 올바른 인수와 비교하십시오 p. p합계보다 작 으면 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⌷x←⎕이 경우에는)
¨"맵"작업
{+/⎕}에서 걸릴 배열 입력 합 반환
+/합계를 맵 연산에 의해 생성 된 배열
4×x[3]>합 <되었는지 테스트 x[3](반환 값 1 또는 0), 그 다음 다중 4
'SwimSink'⌽⍨회전 문자열 'SwimSink'그만큼이
4↑마지막으로, 스트링의 제 4 개 문자 추출을


중요한 것은 유일하게 주어진 입력에 대한 정답을 출력한다는 것입니다. 이것이 CodeGolf에 특이한 경우 누군가가 알려주십시오.
Rainbolt

변경 ⎕IO←0후 교체 4↑'SwimSink'⌽⍨4×'Swim' 'Sink'⊃⍨, x[3]x[2],와 1⌷x함께에게 ⊃x2 바이트를 저장합니다.
Adám

6

AWK, 70

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

이것은 내 제출 (86)에 대한 laindir의 개선입니다.

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

이해가 안 돼요. Awk는 골프 언어는 아니지만 상용 프로그래밍 언어에서 유래 한 것임에도 불구하고 J / K / APL보다 40-100 % 더 길어 보입니다.
Adám

5

커피 스크립트 - 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". 세 번째 진술에 대한 Parens도 필요하지 않습니다.
Konrad Borowski

4

SED, 128

sed이것 의 버전 을 쓰는 것은 재미있었습니다 . 다음과 같은 단점이 있습니다.

  • 도시에 빗물 선을 쉽게 인식 할 수 있도록 두 개 이상의 기둥이 있다고 가정합니다.

  • 각 도시의 수용 인원이 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- 프롤로그 79

이 답변이 stdin을 통하지 않고 쿼리로 입력된다는 사실을 신경 쓰지 않으면 :

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

파이썬-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-

1

스칼라-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")

일부 괄호 나 무언가를 생략하는 것이 가능할 수도 있지만 스칼라는 구두점과 무단 스타일 및 () 대 {} 및 기타 등등에 대해 변덕 스럽습니다.


0

자바 스크립트-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.