Проблема
Сценарий конца света описывается тремя цифрами на одной линии, n
, m
и p
. После этой строки идут n
строки со m
значениями в строке. Каждое значение представляет общее количество воды, которое может содержать каждая ячейка.
Следующие p
строки описывают погоду на следующие p
дни. 1 единица дождя падает на одну камеру каждый день. Если количество воды в клетке превышает количество, которое она может содержать, эта клетка затопляется. Если несколько соседних ячеек заполнены на полную мощность, они рассматриваются как одна ячейка, которая имеет общих соседей (подумайте, Сапер, когда вы нажимаете на группу пробелов).
- Одна средняя ячейка имеет 4 соседей
- Две соседние средние ячейки с полной емкостью рассматриваются как одна ячейка с 6 соседями
- Одна угловая ячейка имеет 2 соседей
- Одностенная ячейка имеет 3 соседей
Когда ячейка затопляет, происходит событие затопления. Вся избыточная вода равномерно распределяется по соседям. Если это приводит к наводнению одного или нескольких соседей, происходит другое событие наводнения. Это продолжается до тех пор, пока вода не уляжется или город полностью не затопит.
Пример ввода
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, цв 11 2
означает, что в ряду 2, седло 3 (дождь может дождаться нуля и сразу затопить!)
После p
дней дождя, если город полностью затоплен, выведите Sink . В противном случае выведите Swim .
Пример вывода
Плавать
Предположения
- Входные данные могут быть предоставлены через stdin, прочитаны из «city.txt» или приняты в качестве аргумента. Все три допускаются, чтобы не сделать недействительными любые ответы, уже опубликованные.
- Емкости воды будут неотрицательными целыми числами.
Более 40 команд студентов колледжей (из A & M, UT, LSU, Rice, Baylor и т. Д.), Участвующих в конкурсе по программированию с использованием различных доступных языков, не смогли решить эту проблему за 5 часов. Из-за этого я не могу не упомянуть, что есть загадка в этой загадке, которая делает решение тривиальным. Самый короткий код все еще выигрывает, потому что я уверен, что самый короткий код также решит загадку.
n
линииm
ценностей или наоборот? Ваш пример не соответствует письменной спецификации.0.25
единицы измерения в каждую соседнюю ячейку (при условии, что одна ячейка с средней заливкой)?Ответы:
Golfscript,
3730 символовНовое и улучшенное, спасибо PeterTaylor за советы:
Пояснение :
Программа затем завершается, выводя стек.
Старая версия + объяснение:
Такой же подход, как у Форса , только Golfscripted =). Скорее всего, можно сделать более эффективным. Ввод от стандартного ввода.
Пояснение :
Затем программа выводит стек, который является просто ответом.
источник
]
без сопоставления[
соберет весь стек в массив, поэтому начальный[~]
может быть упрощен до~]
. Чтобы получить первыеgrid_size
элементы массива, используйте<
, так что<{+}*
почти наверняка сэкономите немного при добавлении общей емкости.0>"Sink""Swim"if
может быть0>"SinkSwim"4/=
~]
? Я попробовал, и это не сработало. Последний взлом хорош, хотя он должен быть"SwimSink"
- будет использовать его. и вещь массива также кажется многообещающей, приступит к работе над этим.ruby golfscript.rb
и это все еще не работало ... Вы можете проверить, что это работает на вашем конце? Я получаю одинаковую ошибку на обоих:undefined method '+' for nil:NilClass (NoMethodError)
C:
1009695 символовПять часов? У меня ушло пять минут. :)
Aragaer, спасибо за упрощения! Однако я переставил объявления переменных и аргументы в main, поскольку Clang выдает ошибку, если второй аргумент main имеет любой другой тип, кроме
char **
.источник
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");}
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
без изменения количества символов.n-=scanf...
не сработает, так как вn-=1
основном это предварительный прирост, поэтому он пропустит юго-восточный угол. Другое изменение - это здорово.Python, 4 строки, 175 символов
Lol, я думаю, что более 40 команд в конечном итоге нашли подвох ... после того, как решили его нелегко.
источник
#
.input()
иmap()
:n,_,p=map(int,input().split());print(['sink','swim'][p>sum(sum(map(int,input().split()))for a in range(n))])
J (50 символов) и K (40) двойная функция
Оказывается, как обычно, эти два решения имеют одинаковую структуру в своих решениях, поэтому они оба здесь. K намного короче, но это приятный сюрприз.
Объяснение:
".1!:1]1
- Читайте в первой строке и конвертируйте в целые числа.(...)/0 2{
- Возьмите элементы с индексами 0 и 2 (n
иp
соответственно) и используйте их в качестве левого и правого аргументов для глагола(...)
соответственно.+1!:1@#1:
- читать вn+p
строках.[+/@".@$
- Возьмите ($
) первыеn
строки ([
), отбросив остальные, а затем конвертируйте в целые числа (".
) и суммируйте по каждой строке (+/
).]<[:+/
- Суммируйте суммы строк, а затем сравните это значение с правильным аргументомp
. Мы производим истину, еслиp
сумма меньше.>Sink`Swim{~
- Выберите,Swim
если приведенное выше сравнение привело к истине, илиSink
если ложь.Использование:
А теперь К:
Разъяснение:
. 0:`
- Прочитать строку ввода и преобразовать в массив целых чисел.{...}.
- Используйте эти три числаn m p
в качестве аргументовx y z
этой функции.0::'(x+z)#`
- Создайтеx+z
копии дескриптора входного файла`
, а затем прочитайте строку для каждого из них (0::'
)..:'x#
- Возьмите первыеx
предметы и преобразуйте каждый в вектор чисел.z<+//
- Суммируйте всю матрицу вместе, а затем проверьте, не превышает ли онаz
.`Sink`Swim@
- ВернутьSink
или вSwim
зависимости от того, вернул ли тест значение true.Использование:
источник
APL, 35
Не уверен, если разрешено, но он перестает принимать ввод после "города"
x←⎕
Принимает ввод и сохраняет его в переменнойx
(числа, разделенные пробелом, интерпретируются как числовой массив).1⌷
Извлечь индекс 1 (массивы APL основаны на⍳
единицах ). Создать массив от 1 до аргумента (1⌷x←⎕
в данном случае).¨
Операция «Карта».{+/⎕}
Получить массив из введите и верните сумму.+/
Суммируйте массив, сгенерированный операцией карты.4×x[3]>
Проверьте, если сумма <x[3]
(возвращает 1 или 0), затем умножьте 4'SwimSink'⌽⍨
Поверните строку'SwimSink'
на эту сумму.4↑
Наконец, извлеките первые 4 символа строки.источник
⎕IO←0
, а затем заменить4↑'SwimSink'⌽⍨4×
с'Swim' 'Sink'⊃⍨
,x[3]
сx[2]
, и1⌷x
с ,⊃x
чтобы сэкономить два байта.AWK, 70
Это улучшение от laindir в моем представлении (86):
источник
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"}
CoffeeScript -
128113Функция, которая принимает строку в качестве единственного аргумента:
источник
`p>x?"Sink":"Swim"`
вместоif p>x then"Sink"else"Swim"
. Паренсы за третье утверждение тоже не нужны.САС, 128
Было весело написать
sed
версию этого. Имеет следующие недостатки:Предполагается, что в городе более двух колонн, чтобы легко распознавать линии дождя.
Предполагается, что вместимость каждого города находится в диапазоне 0-9.
Вот:
Звони с
-n
флагом.источник
SWI-Пролог 79
Если вы не возражаете против того факта, что этот ответ принимает ввод по запросу, а не через stdin:
Ответ не проверяет формат ввода, но я не думаю, что это проблема, так как соревнование по программированию также не требует от вас этого.
Пример запроса (используя пример в вопросе):
источник
Питон - 152
источник
,
, до и после'
, после)
...Скала - 128
Можно было бы опустить некоторые скобки или что-то в этом роде, но Scala действительно непостоянна в отношении пунктуации и стиля без точек, а также () vs {} и еще много чего.
источник
Javascript - 73 персонажа
Предполагается, что вход находится в переменной
s
и выводитсяSwim
илиSink
.Пример:
Исходный вопрос - введите это в консоль браузера:
Выходы:
источник