Batıyor veya Yüzüyor muyuz?


40

Sorun

Bir kıyamet senaryosu tek bir hat üzerinde üç sayı ile tanımlanan, bir n, mve p. Bu satırın ardından satır başına değer niçeren satırlar bulunur m. Her değer, her hücrenin alabileceği toplam su birimini temsil eder.

Aşağıdaki psatırlar önümüzdeki pgünlerde hava durumunu açıklar . Her gün tek bir hücreye 1 birim yağmur yağar. Bir hücrede bulunan su miktarı tutabileceği miktarı aşarsa, bu hücre taşar. Birden fazla bitişik hücre tam kapasitede ise, ortak komşuları paylaşan tek bir hücre olarak işlem görür (bir grup boşluğa tıkladığınızda Mayın Tarlası'nı düşünün).

  • Tek bir orta hücrede 4 komşu var
  • İki bitişik, tam kapasite orta hücre, 6 komşusu olan bir hücre olarak işlem görür.
  • Tek bir köşe hücresinde 2 komşu var
  • Tek bir duvar hücresinde 3 komşu var

Bir hücre taşdığında, bir taşma olayı meydana gelir. Tüm fazla su, komşularına eşit şekilde dağıtılır. Bu bir veya daha fazla komşunun taşmasına neden olursa, başka bir taşkın olayı meydana gelir. Bu, su çökelene ya da şehir tamamen su basmasına kadar devam eder.

Örnek Giriş

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 satır 1, col 1 yağmur yağdı anlamına gelir
  • 1 2 sıra 2, sütun 3 üzerine yağmur yağdığı anlamına gelir (sıfır su tutabilir ve hemen su basabilir!)

pYağmurlu günlerden sonra , şehir tamamen sular altındaysa, Lavabo çıkışını verin . Aksi takdirde, Swim yazdırın .

Örnek çıktı

yüzmek

Varsayımlar

  • Giriş, stdin aracılığıyla sağlanabilir, "city.txt" adresinden okunabilir veya bir argüman olarak kabul edilebilir. Üçüne de daha önce gönderilen cevapları geçersiz kılmamak için izin verilir.
  • Su kapasiteleri negatif olmayan tam sayılar olacaktır.

Çeşitli dilleri olan bir programlama yarışmasında yarışan 40'tan fazla üniversite öğrencisi (A&M, UT, LSU, Rice, Baylor, vb.) Bu sorunu 5 saat içinde çözemedi. Bu nedenle, yardım edemem ama bu bulmacanın çözümü önemsiz kılan bir tuzak olduğunu söyleyemem. En kısa kod hala kazanıyor, çünkü en kısa kodun bulmacayı da çözeceğinden eminim.


Değer nsatırları mı myoksa başka bir yol mu? Örneğiniz yazılı şartnameyle eşleşmiyor.
algoritmshark

@algorithmshark Düzeltildi
Rainbolt

13
Emin değilim ama bana göre, eğer yağmur miktarı tüm karelerin tutabileceği yağmur toplamından daha büyükse batarsınız; Aksi halde yüzersin. Bu mu?
Hosch250

2
@ hosch250 Eğlenceyi bozma!
Rainbolt

1
"Aşırı su, komşularına eşit olarak dağıtılıyor." - 1 birim su olması muhtemeldir. 0.25Her bir bitişik hücreye örneğin bir ünite olarak dağıtıyor mu (tek bir orta taşkın hücrenin olduğu varsayılarak)?
Neil Slater

Yanıtlar:


16

Golf Betiği, 37 30 karakter

İpuçları ve öneriler için PeterTaylor sayesinde yeni ve geliştirilmiş :

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

Açıklama :

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"

Ardından program sonlandırılarak istifin çıktısı alınır.


Eski versiyon + açıklama:

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

Fors ile aynı yaklaşım , sadece Golfscripted =). Muhtemelen daha verimli yapılabilir. Giriş stdin'den.

Açıklama :

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"

Program daha sonra sadece cevap olan yığını çıkarır.


]bir eşleştirme olmadan [tüm yığını bir dizide toplar, böylece bir başlangıç [~]basitleştirilebilir ~]. grid_sizeBir dizinin ilk öğelerini almak için , kullanın <, bu yüzden <{+}*neredeyse toplam kapasiteyi eklerken sizi kesinlikle biraz kurtarabilir. 0>"Sink""Swim"ifolabilir0>"SinkSwim"4/=
Peter Taylor

@PeterTaylor: Tavsiyeler için teşekkürler! Bundan emin ~]misin? Denedim ve işe yaramadı. Son hack olmasına rağmen güzel "SwimSink"- kullanacak. ve dizi olayı da umut verici görünüyor, bunun üzerinde çalışmaya başlayacak.
Claudiu

Eminim: bu benim ve başkalarının yıllardır kullandığı standart bir numara.
Peter Taylor

@ PeterTaylor: Hmm garip. Bağlandığım tercümanda deneyin - başarısız olur. O zaman - tamam belki web tercümanı standart değildir. Ama ben de denedim ruby golfscript.rbve hala işe yaramadı ... Sonunda çalıştığını doğrulayabilir misin? Her ikisinde de aynı hatayı alıyorum:undefined method '+' for nil:NilClass (NoMethodError)
Claudiu

1
Stdin eksikliği yerine kullanılacak bir dize değişkeni eklediğinizde, gerçekte "stdin'den" gelen boş dizgeyi kaldırmak için onu noktalı virgülle koymalısınız. Bununla iyi çalışıyor
Peter Taylor

20

C: 100 96 95 karakter

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");}

Beş saat? Bana beş dakika sürdü. :)

Aragaer, sadeleştirmeler için teşekkür ederim! Bununla birlikte, değişken bildirimlerini ve argümanları main olarak yeniden düzenlemiştim, main'in ikinci argümanı dışında herhangi bir türde ise Clang'ın bir hata attığını görmek 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");}. Ben de fikri ile oynadım n-=scanf, ancak bundan sonra programın doğru olup olmadığından emin değilim. İlk önce karakter sayısını değiştirmeden scanfönüne geçilebilir for.
aragaer

n-=scanf...n-=1Temelde bir artış öncesi olduğu için çalışmaz, bu nedenle güneydoğu köşesini kaçıracaktır. Diğer değişiklik harika.
Fors

7

Python, 4 satır, 175 karakter

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'tan fazla takımın zorlu yoldan çıktıktan sonra ... ... yakalayıcıyı bulup bulmadığını merak ediyorum.


10
40+ takımdan birindeydim. Başarısız olduktan sonra avı verdik. Oditoryumdaki herkes aynı anda facepalmed. Sanırım burada bundan bahsetmemeliydim. Siz çocuklar çok hızlıydınız!
Rainbolt

Ah! Bu arada, bu tür sorular için stdin'den girdi almalı mıyım? - Değişim yığında yeniyim. :)
swalladge

STDIN'i belirtmek için sorumu düzenleyecektim, ancak cevabınızı geçersiz kılacağından korktum. Yaklaşık bir aydır burada bulmacalar okudum ve insanların STDIN belirtip belirtmediğini gerçekten fark etmedim.
Rainbolt

1
@swalladge Codegolf'a Hoşgeldiniz! Bir başlık hazırlayarak başlık yapmasını tavsiye ederim #.
TimWolla

2
Eğer kullanırsanız 108'e aşağı getirebilir input()ve map():n,_,p=map(int,input().split());print(['sink','swim'][p>sum(sum(map(int,input().split()))for a in range(n))])
Blender

6

J (50 karakter) ve K (40) çift özellik

Her zamanki gibi, bu ikisinin çözümlerinde aynı yapıya sahip oldukları, bu yüzden ikisi de burada. K çok daha kısa olsa da, hoş bir sürpriz.

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

Açıklama:

  • ".1!:1]1 - İlk satırı okuyun ve tam sayılara dönüştürün.
  • (...)/0 2{- 0 ve 2 dizinindeki maddeleri ( nve psırasıyla) alın ve sırasıyla fiile sol ve sağ argümanlar olarak kullanın (...).
  • +1!:1@#1:- n+pSatırları oku .
  • [+/@".@$- $İlk nsatırları ( [) alın, geri kalanı atın ve ardından tamsayılara ( ".) dönüştürün ve her satırdaki toplamı ( ) toplayın +/.
  • ]<[:+/- Satır toplamlarını birleştirin ve bu değeri doğru argümanla karşılaştırın p. Toplamdan paz ise doğru üretiyoruz .
  • >Sink`Swim{~- SwimYukarıdaki yorumlamanın doğru mu sonuçlanacağını veya Sinkyanlış mı olacağını seçin.

Kullanımı:

   >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

Ve şimdi K:

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

Açıklaması:

  • . 0:` - Bir girdi satırını okuyun ve bir tam sayı dizisine dönüştürün.
  • {...}.- Bu üç sayıyı bu işlevin n m pargümanları olarak kullanın x y z.
  • 0::'(x+z)#`- x+zGiriş dosyası tanıtıcısının kopyalarını oluşturun `ve her biri için bir satırda okuyun ( 0::').
  • .:'x#- İlk xmaddeleri alın ve her birini bir sayı vektörüne dönüştürün.
  • z<+//- Tüm matrisi bir araya toplayın ve daha büyük olup olmadığını görmek için test edin z.
  • `Sink`Swim@- Testin doğru gelip gelmediğine göre Sinkveya geri dönüş Swim.

Kullanımı:

  `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←⎕

İzin verilip verilmediğinden emin değil ancak "şehir" den sonra girişi kabul etmeyi durduruyor

x←⎕Girdiyi alır ve değişkende saklar x(boşlukla ayrılmış sayılar sayısal bir dizi olarak yorumlanır)
1⌷Dizin 1'i çıkar (APL dizileri bir tabanlıdır)
1'den bağımsız değişkene bir dizi oluşturun ( 1⌷x←⎕bu durumda)
¨"Harita" işlemi
{+/⎕}Diziyi alın giriş ve toplamı döndürme
+/Harita işlemi tarafından oluşturulan diziyi toplayın Toplam
4×x[3]>< x[3](1 veya 0 döndürürse) test edin , sonra çarpın 4 Dizeyi bu miktarla
'SwimSink'⌽⍨döndürün Son olarak dizenin ilk 4 karakterini çıkarın.'SwimSink'
4↑


Bence asıl önemli olan herhangi bir girdi için doğru cevabı vermesidir. Bu CodeGolf için olağandışı ise, umarım biri bana bildirir.
Rainbolt

Değişim ⎕IO←0, daha sonra değiştirmek 4↑'SwimSink'⌽⍨4×ile 'Swim' 'Sink'⊃⍨, x[3]birlikte x[2]ve 1⌷xbirlikte ⊃xiki bayt kaydedin.
Ad

6

AWK, 70

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

Bu, gönderimde laindir tarafından yapılan bir gelişmedir (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<=holması gerekir NR<=h+1, aksi takdirde son kapasite satırı atlanır gibi yanlış Lavabo alırsınız. Bu aynı zamanda 70 kısaltılabilirn{for(;NF;NF--)s+=$NF;n--}NR==1{n=$1;p=$3}END{print p<s?"Swim":"Sink"}
laindir

1
@laindir İyileşme için çok teşekkür ederim! O kadar eğlenceli buluyorum ki, Awk kod kodlamada herkesi yenmek için yetiştirilen APL, J ve K'nin yanına geliyor! :-)
user40989

@ user40989 Anlamıyorum. Awk, J / K / APL'den% 40-100 daha uzun görünmektedir, golf dilleri olmasalar da, ticari programlama dillerinden kaynaklanmaktadır.
20’de

5

CoffeeScript - 128 113

Dizeyi sadece argüman olarak alan bir işlev:

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"`

Girintiyi kaldırabilir ve her şeyi noktalı virgülle ayırarak ilk satırda taşıyabilirsiniz. Siz de `p>x?"Sink":"Swim"`bunun yerine yazın if p>x then"Sink"else"Swim". Üçüncü bildiri için parens de gerekli değildir.
Konrad Borowski

4

SED, 128

Bunun bir sedversiyonunu yazmak eğlenceliydi . Aşağıdaki kısa geliyor:

  • Yağmur hatlarını kolayca tanıyabilmek için şehrin ikiden fazla sütunu olduğunu varsayar.

  • Her bir kentin kapasitesinin 0-9 aralığında olduğunu varsayar.

İşte burada:

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}

-nBayrak ile arayın .


3

SWI-Prolog 79

Bu cevabın girdiyi stdin yerine sorgu yoluyla alması sakıncası yoksa:

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

Cevap, giriş biçimini doğrulamıyor, ancak bir sorun olduğunu sanmıyorum, çünkü programlama yarışması da bunu yapmanızı gerektirmiyor.

Örnek sorgu (sorudaki örneği kullanarak):

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
Biraz boşluk bırakarak başlayabilirsin. Sonra ,, önce ve sonra ', sonra )
Ry -

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")

Bazı parantezleri veya başka bir şeyi atlamak mümkün olabilir, ancak Scala noktalama işaretleri ve nokta içermeyen stil ve () vs {} ile ne olduğu hakkında kararsız.


0

Javascript - 73 Karakterler

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

Girdi değişkeni olduğunu varsayar sve çıkışlar Swimveya Sink.

Örnek:

Orijinal soruya göre - bunu tarayıcı konsoluna girmek:

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"

Çıktılar:

Swim
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.