Человек живет в северо-западном углу (0, 0)
города с ростом h
и шириной w
. Каждый день он идет от своего дома до границы (?, w)
или (h, ?)
. В следующем примере мужчина идет (3, 3)
сегодня.
(0, 0) +--+ + + . (0, 4)
|
+ +--+--+ .
|
+ + + + .
|
(3, 0) . . . . . (3, 4)
Человек записывает немного в каждой точке ( +
в примере выше). Каждый раз, когда он достигает точки, он идет на восток, если бит немного, 1
и на юг в противном случае. Бит переворачивается после того, как он уходит. Например:
Day 1: 1--0 1 1 Day 2: 0 1 1 1 Day 3: 1--1--1--1-- Day 4: 0 0 0 0
| | |
0 1--0 0 0 0 1 0 1 0 1 0 1--0 1 0
| | |
1 0 1--0 1--0 0 1 0 1 0 1 0 1--0 1
| | |
Destination: (3, 3) Destination: (3, 1) Destination: (0, 4) Destination: (3, 2)
Учитывая размер города и историю человека, рассчитайте пункт назначения человека через n
несколько дней.
Входные данные:
В первой строке три целых числа h
, w
и n
.
В следующих h
строках указаны w
целые числа, обозначающие мужскую запись.
h <= 1000, w <= 1000, n <= 1000000000
Выход:
Два целых числа, обозначающие пункт назначения человека после n
нескольких дней.
Пример ввода:
3 4 3
1 0 1 1
0 1 0 0
1 0 1 0
Пример вывода:
0 4
Образец кода:
#include <iostream>
using namespace std;
bool d[1000][1000];
int main(){
int h, w, n;
cin >> h >> w >> n;
for(int i = 0; i < h; i++)
for(int j = 0; j < w; j++)
cin >> d[i][j];
int i, j;
while(n--)
for(i = 0, j = 0; i < h && j < w;){
bool &b = d[i][j];
d[i][j] ? j++ : i++;
b = !b;
}
cout << i << " " << j << endl;
}
Подсчет очков:
- Самый низкий счет байтов в UTF-8 побед.
- Если время выполнения вашего кода не зависит от
n
, уменьшите ваш счет на 50%.- Не просто рассчитывайте результаты всех 1000000000 дней или делайте глупости, чтобы получить этот бонус. Найдите эффективный алгоритм!
code-golf
simulation
johnchen902
источник
источник
n
, мой код вычисляет результаты всех 1000000000 дней, а затем выводит результатn
, получу ли я бонус -50%?Ответы:
GolfScript, 52,5 (105 символов с бонусом 50%)
Версия очень эффективна и может быть протестирована онлайн даже для больших значений.
Он использует подход, аналогичный решению user2357112 .
источник
Python 2, 192 байта * 0.5 бонуса = 96
Чтобы эффективно решить эту проблему, ключевая реализация состоит в том, что мы можем вычислить, сколько раз каждая ячейка посещается на основе количества посещений выше и слева ячеек, без необходимости определять точные пройденные пути. По сути, мы моделируем
n
поездки одновременно и отслеживаем, сколько раз используется каждая ячейка.Существенное улучшение благодаря основанному на push подходе, основанном на решении johnchen902 :
Предыдущая реализация по запросу:
Оригинальная, негольфированная версия:
источник
not
до1^
и долго, если условие может быть записаноf=g[i][j]^v[i][j]&1 j+=f i+=1^f
.r
принять параметр (r = lambda x: ...
), то можете сократитьg=[r()for i in x]
доg=map(r,x)
.Рубин,
159143Первая строка использует
*
оператор для захвата первой строки ввода в одной переменной, а остальная часть ввода - в другой. Затем определяетсяi
функция для преобразования"1 2 3 4"
в[1, 2, 3, 4]
, которая применяется к обоимl
иn
. (x
иy
сохраняются на потом.)n[-1]
является последним элементомn
, поэтому следующий блок (симуляция) выполняется столько раз. Во- первых,x
иy
инициализируются нулем (они объявлены вне блока , так что их объем достаточно велик), а затем линия моделирования выполняется,что довольно очевидно, но вот некоторые комментарии в любом случае:Редактировать: новая линия симуляции, предоставленная Говардом, спасибо! Я почти уверен, что понимаю, как это работает, но у меня нет времени, чтобы добавить объяснение, поэтому оно будет добавлено позже.
Наконец,
p x,y
выводятся цифры, и мы готовы!источник
$/
на, а цикл while можно уменьшить до(x+=f=l[x][y]^=1;y+=f^1)while x<n[0]&&y<n[1]}
.Delphi XE3 (437 байт ||
897874 без учета бонуса)Размышляя о том, как решить эту проблему с бонусом, я подумал о следующем.
Если вы ходите 4 дня, ячейка 0,0 меняется 4 раза. Клетка справа меняется в два раза лучше, чем клетка под ней.
Если количество дней не одинаково, а число в ячейке начинается с 1, ячейка справа получает на единицу больше, чем ячейка внизу, и наоборот, если ячейка равна 0.
Делая это для каждой ячейки, вы можете увидеть, должно ли конечное значение быть изменено: Ячейка была изменена X раз. если X mod 2> 0, измените ячейку.
Результаты в следующем коде:
{Whispers at JohnChen902} я могу получить ваш отзыв сейчас? :П
Ungolfed
источник
C ++ 213 байт * 0,5 = 106,5
Вот мое решение. Это похоже на решение user2357112 , но есть несколько отличий:
Вот негольфированная версия:
источник
--*o;
, и вместо этого переключая, в каком случае вы перемещаете парня вниз, а в каком случае вы перемещаете парня вправо.Python, 177 байт
Моя первая попытка в Code Golfing, так что извините, если я что-то здесь не так понял! Код, используемый для получения ввода на основе кода user2357112.
Входные данные:
Выход:
источник
R 196 байт * 0,5 = 98
Ungolfed:
Использование:
источник