Индийская легенда рассказывает историю о предполагаемом изобретателе шахматной игры, который настолько впечатлил императора Индии своей игрой, что он получит вознаграждение за все, что попросит.
Человек сказал, что хочет, чтобы ему заплатили рисом. Он хотел рисовое зерно для первого квадрата шахматной доски, два для второго, четыре для третьего, восемь для четвертого и так далее до 64-го квадрата.
Император был поражен, что этот человек попросил такую маленькую награду, но когда его математики начали считать, он потерял одну из своих провинций.
задача
Учитывая длину стороны гипотетической шахматной доски (на шахматной доске по умолчанию 8) и множитель между квадратами (на легенде 2), подсчитайте количество рисовых зерен, которые император должен заплатить человеку.
Заметки
Длина стороны всегда будет положительным целым числом. Вместо этого множитель может быть любым рациональным числом.
Если выбранный вами язык не может отображать очень большие числа, это нормально, если ваша программа может правильно обрабатывать вводимые данные меньшего размера.
Кроме того, если ваш язык выбора округляет большие значения (с экспоненциальными обозначениями), то все в порядке, если эти значения приблизительно верны.
Testcases
Input (side length, multiplier) => Output
8, 2 => 18446744073709551615
3, 6 => 2015539
7, 1.5 => 850161998.2854
5, -3 => 211822152361
256, 1 => 65536
2, 2 => 15
2, -2 => -5
Обратите внимание, что явная формула
result = (multiplier ^ (side ^ 2) - 1) / (multiplier - 1)
Выполняет неправильно multiplier = 1
, как
1 ^ (side ^ 2) - 1 = 0
1 - 1 = 0
0 / 0 != side ^ 2 (as it should be)
счет
Это код-гольф. Кратчайший ответ в байтах побеждает.
If your language of choose can't display too large numbers, it's ok as long as your program can correctly process smaller inputs
Осторожно, это вызывало проблемы в прошлом. meta.codegolf.stackexchange.com/a/8245/31716Ответы:
Желе , 4 байта
Это использует подход из умного APL-ответа @ APLDude .
Попробуйте онлайн! или проверьте все контрольные примеры .
Как это работает
источник
MATL , 6 байтов
Попробуйте онлайн!
источник
APL, 10 байт
⎕
используется для чтения ввода пользователя дважды. Если мы сохраним длину стороны в s и множитель в m , мы получим следующий код.И вот как APL анализирует этот код:
источник
⊣⊥1⍴⍨⊢×⊢
(8 байт). В качестве интерактивной команды REPL⎕⊥×⍳⎕*2
(7 байт) также работает.Python, 40 байт
Создает и оценивает строку как
который кодирует сумму как Hornerized многочлен с
n*n
условиями.Множество разных методов дали очень похожие количества байтов:
источник
Pyth, 6 байт
1 байт сохранен благодаря @FryAmTheEggman .
Попробуйте онлайн!
Тестирование.
источник
Haskell, 25 байт
Суммирует список
[m^0, m^1, ..., m^(n*n-1)]
.источник
JavaScript (ES2016 / ES7),
312928 байтПросто @Bassdrop Cumberwubwubwub и @ Kaizo версия ES6, но с оператором возведения в степень. :) (У меня не было достаточно репутации, чтобы комментировать вместо этого.)
Изменить:
/+(b-1)
изменилось на/--b
(спасибо @Neil).Редактировать: теперь использует карринг (спасибо @MamaFunRoll).
источник
+
Оператор был тест , который я забыл отредактировать, так что вы можете сбрить 1 байт, опуская его :)/--b
Сэкономит ли вам байт или два?Желе, 6 байт
Попробуйте онлайн!
источник
MATLAB, 23 байта
Проверьте это здесь !
источник
Javascript ES6,
59373534 байтаСпасибо @Kaizo за сокращение 19 байт, @Neil за еще 2 и @gcampbell еще за 1!
Попробуй здесь
Показать фрагмент кода
Альтернативные битые версии
32 байта
Причины
NaN
дляb==1
.30 байт
Причины
Infinity
дляb==1.5
.28 байт
Выходы
1
для некоторых действительных тестовых случаев.Старая версия на 59 байт
(a,b)=>Array(a*a).fill``.reduce((c,d,i)=>c+Math.pow(b,i),0)
источник
/~-b
очевидно, не подходит для дробногоb
, но/--b
должно работать, нет?(a,b)=>[...Array(a*a-1)].reduce(s=>s+=p*=b,p=1)
Java, 132 байта
Ungolfed
Заметки
Выходы
источник
R, 18 байт
Объяснение:
источник
05AB1E , 5 байтов
Код:
Объяснение:
Попробуйте онлайн! ,
источник
Haskell, 30 байт
или одинаково долго
Первая версия начинается с
1
многократного умножения наm
. Затем он суммирует первыеn^2
числа этой последовательности. Вторая версия - это явная формула, как видно из других ответов.источник
n#m=sum$(m^)<$>[0..n*n-1]
?J, 10 байт
использование
Я отмечаю некоторые целые числа
x
суффиксом, чтобы использовать расширенные целые числа для получения точных результатов.объяснение
источник
#.*:$*
в соответствии с APL чувак.Mathcad, [tbd] байт (~ 11)
Использует встроенный в Mathcad оператор суммирования. Также демонстрирует упрощение символьного процессора для генерации точной формулы.
Mathcad эффективно запускает два обработчика параллельно - один с 64-разрядной стандартной плавающей запятой IEEE, а другой - символьный процесс произвольной длины (MuPad). Стандартная числовая оценка обозначается знаком равенства (=), в то время как стрелка вправо указывает на символическую оценку.
Схема подсчета Mathcad еще не определена, поэтому подсчет байтов не производится.
ctl- $ вводит оператор суммирования (Sigma), включая пустые заполнители, чтобы поместить переменную суммирования, начальное значение, конечное значение и выражение. Приблизительное число эквивалентных байтов = 11.
источник
PostgreSQL,
6766 байтSqlFiddleDemo
Входные данные:
VALUES(side, multiplier)
РЕДАКТИРОВАТЬ:
Ввод перенесен в таблицу, все случаи одновременно:
SqlFiddleDemo
Выход:
источник
TI-Basic, 19 байтов
S
это длина стороны, иM
это множитель.источник
Python, 40 байт
источник
lambda l,m:(m**(l*l)-1)/(m-1)
Рубин: 39 байт
Тест:
источник
sum
функцию ??? Это меняет правила игрыPython, 41 байт
Абсолютно новый в этой игре в гольф, критика приветствуется!
источник
l**l
вместо того, что я сделал?l*l
на самом деле, который короче, чемl**2
.Джольф,
181510 байтСпасибо Cᴏɴᴏʀ O'Bʀɪᴇɴ за сохранение 3 байта и указание мне на отображение
Попробуй это здесь!
источник
CJam , 9 байт
Входные данные в обратном порядке разделяются новой строкой или пробелом.
Попробуйте онлайн!
источник
PHP,
5854 байтаЭто просто использует формулу суммирования, чтобы показать значение, после проверки, равен ли множитель 1 (что возвращает NAN в формуле).
источник
Mathematica, 22 байта
Создает диапазон
{1, 2, ... s^2}
, вычитает 1 над ним, чтобы сделать{0, 1, ..., s^2-1}
. Затем возведите каждого в силуm
создания{m^0, m^1, ..., m^(s^2-1)}
и верните сумму.В качестве альтернативы, Mathematica может использовать явную формулу, взяв ее предел. Это требует 29 байтов.
источник
Tr[#^Range[#2^2]/#]&
PARI / GP , 25 байтов
Дольше, но быстрее (35 байт):
Милый (30 байт):
источник
C #, 56 байт
источник
256, 1
?(Math.Pow(1, 256 * 256) - 1) / --1
= 0/0.Луа,
5447 байтЗапустите из командной строки с длиной стороны доски в качестве первого аргумента и множителя в качестве второго.
Спасибо user6245072 за сохранение 6 байтов и Katenkyo за сохранение дополнительных 1.
Оригинальная 54-байтовая версия:
источник
l,m=...r=0 for i=0,l^2 do r=r+m^i end print(r)
c=1 d=1
=>a,b=...c=1g=1 for i=2,a^2 do c=c*b g=g+c end print(g)
. если предложение @ user6245072 работает, вы можете сохранить байт по тому же принципу =>r=0l,m=...for i=0,l^2 do r=r+m^i end print(r)
r=0
иl,m=...
в любом случае является обязательным, поэтому он не меняется. Также цикл должен быть,for i=0,l^2-1
но это моя вина, лол.𝔼𝕊𝕄𝕚𝕟, 11 символов / 14 байтов
Try it here (Firefox/WebKit Nightly only).
Да, теперь работает в WebKit Nightly! Поддержка Chrome следующая.
объяснение
источник
ВОЗВРАТ , 32 байта
Try it here.
Анонимная лямбда, которая оставляет результат на Stack2. Использование:
объяснение
источник