Codegolf — Сложите Случайное Количество Чашек В Идеальную Двумерную Пирамиду (Треугольник).

  • Автор темы Kolya41
  • Обновлено
  • 21, Oct 2024
  • #1

Вам дается определенное количество чашек (

 p=function(n){for(t=i=0;i<=(n-t);i++){t+=i;b=i}return b+','+t} 
). You are tasked with stacking these cups into a pyramid, with each row having one more cup than the row above it. The number you are given may or may not be able to be perfectly stacked. You must write a function that takes the total number of cups ( var pyramid = function(n){ var i; var t = 0; var b; for(i=0;i<=(n-t);i++){ t += i; b = i; } console.log(b + ',' + t); } ) и возвращает следующие значения. t=4950 , which is the total number of cups in the pyramid, and b=99 , то есть количество чашек в нижнем ряду. Ваш ответ должен быть возвращен в формате строки, так как n=5000 .

  • t=10 is a randomly generated, positive, finite, whole number.
  • b=4 и n=13 также должно быть положительным, конечным и целым.
  • Вы не можете использовать библиотеки, которые еще не встроены в выбранный вами язык.
  • Пирамида двумерна, поэтому вместо того, чтобы расширяться, она является линейной: каждый ряд добавляет только одну чашку больше, чем предыдущая, вместо одной с квадратным или треугольным основанием.

В некоторых потенциальных случаях:

  • Если t=3 , b=2 и n=4 .
  • Если t , b и n .
  • Если b,t , b and t .

Подробный пример в JavaScript:

n

И еще небольшой пример:

n

Удачи!

#код-гольф #математика

Kolya41


Рег
08 Mar, 2008

Тем
81

Постов
193

Баллов
618
  • 26, Oct 2024
  • #2

Хаскелл, 64 68

Это определяет основание напрямую, инвертируя формулу треугольного числа:

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 def r(x,b,t):

x-=b+1

return r(x,b+1,t+b) if x>=0 else str(b)+','+str(t+b)
 
, and calculating <? $n=$argv[1]; for($b=ceil($n/2);$b>0;$b--){ for($k=$b-1;$k>0;$k--){ $v=array_sum(range($k,$b)); if($v>$n)continue 2; if($v==$n){ echo "$b,$k"; exit; } } } .

<?$n=$argv[1];for($b=ceil($n/2);$b>0;$b--){for($k=$b-1;$k>0;$k--){$v=array_sum(range($k,$b));if($v>$n)continue 2;if($v==$n){echo "$b,$k";exit;}}}

И вместо того, чтобы строить ответ на основе строки как p=function(n){for(t=i=0;i+t<n;)t+=i++;return i-1+','+t} , it simply chops the brackets off the shown tuple.

Изменить: вычисление нового треугольного числа вместо объявления новой переменной, p=n=>{for(t=i=0;i+t<n;)t+=i++;return i-1+','+t} , saves 4 characters.

 

Vased


Рег
16 Mar, 2009

Тем
85

Постов
199

Баллов
624
  • 26, Oct 2024
  • #3

GNU постоянного тока, 25 байт

dc на самом деле не имеет функций, но самое близкое — это макрос. Это определяет макрос, который хранится в регистре f=(n,b=0)=>n>b?f(n-++b,b):b+','+b++*b/2 . This pops the input f=(n,b=0,t=0)=>n>b?f(n-++b,b,t+b):b+','+t сверху стека (идиоматично для постоянного тока) и печатает f=(n,b=0)=>(n>b)?f(n-++b,b):b+','+(b+b*b)/2 to stdout as per the spec:

f=(n,b=0,t=0)=>(n>b)?f(n-++b,b,t+b):b+','+t

Выход:

DAbKJ0W>b+JK~K1~JK)R++`K","`Jj"\n"m,dAdL11 (0, '0,0') (1, '1,1') (2, '1,1') (3, '2,3') (4, '2,3') (5, '2,3') (6, '3,6') (7, '3,6') (8, '3,6') (9, '3,6') (10, '4,10')

Объяснение:

Здесь используется та же обратная функция треугольника, которая используется в некоторых других числах. Число треугольника def A(b): K=J=0 while gt(b,plus(J,K)): K+=1 J+=K return plus(plus(repr(K),","),repr(J)) for base length DAbKJ0W>b+JK~K1~JK)R,KJ дается:

(b, t)

Переставляя в квадратное уравнение по DAbKJ0W>b+JK~K1~JK)R:`,KJ1_1 :

b,t

Подставляя коэффициенты {A=1, B=1, C=-2} в квадратичная формула дает:

b, t

Это переводится как DAbKJ0W>b+JK~K1~JK)R++`K","`J as follows:

String z(int n){int b=(int)Math.sqrt(n*2),t=(b*b+b)/2;return(t>n?b-1:b)+","+(t>n?t-b:t);}

Обратите внимание, что квадратичная формула вводит ±, но корень + всегда дает нам нужный ответ.

Обратите внимание также, что String y(int n){int b=1,t=1;for(;t<=n*2;t=b*b+b++);return(--b-1)+","+(t/2-b);} 's default precision is 0 decimal places, and positive numbers are always rounded down to the nearest whole number, which is exactly the rounding we need.

 

Apnlkn89


Рег
31 Mar, 2011

Тем
63

Постов
207

Баллов
562
  • 26, Oct 2024
  • #4

ЭС6 41

Это основано на сопоставимой формуле:

Редактировать: Благодаря предложениям edc65:

String x(int n){int t=0,b=0;for(;b<=n-t;t+=b++);return(b-1)+","+t;} ||answer||

Ява

Найти числа треугольников довольно просто. Вот три способа на Java, все до 90 символов, включая версию без цикла:

67

p=n=>''+[b=~-Math.sqrt(8*n+1)>>1,b++*b/2]

78

dc

89

[ # Start a macro definition 8* # Push 8 to the stack and multiply by n # (n is assumed to be next value on the stack) 1+ # Push 1 to the stack and add to 8n v # Take the square root 1- # Push 1 to the stack and subtract from the square root 2/ # Push 2 to the stack and divide to get the value of `b` dd # Duplicate top of stack twice (value of `b`) n # Pop top of stack and print value of with no newline 44P # Push ASCII value of ',' (comma) and print with no newline 1+ # Push 1 to the stack and add 1 to `b` * # Multiply b by (b+1) 2/ # Push 2 the stack and divide to get the value of `t` p # Print value of `t` with a newline ] # End macro definition sm # Store macro in `m` register ||answer||

Пиф, 29

dc

Если формат вывода b = (-(1) ± sqrt((1)²-4(1)(-2n))) / 2(1) b = (-(1) ± sqrt(1+8n)) / 2 instead of b² + b - 2n = 0 нормально, тогда это 28 символов:

b

Если n = b(b+1)/2 is OK, it's 23 characters:

b

Объяснение:

n

Тестовый запуск - (вход, выход):

$ dc 2dpyr.dc 2,3 3,6 4,10 4,10 4,10 99,4950 $ ||answer||

Javascript ES6 - 39 41 43

Подумал, что попробую рекурсию в надежде, что она будет меньше, чем цикл for.

# 25 byte macro definition [8*1+v1-2/ddn44P1+*2/p]sm # Some test cases 4 lmx 9 lmx 10 lmx 11 lmx 13 lmx 5000 lmx

Пытался сжать его, вычислив общую сумму, а не передавая ее, но в итоге получил ту же длину.

b,t

Редактировать: Удален еще 2 по предложению core1024.

n

Редактировать: В принципе, я согласен с edc65 относительно «правильного» ответа и почти не пытался использовать рекурсивный цикл, предполагая, что он должен быть длиннее. Так что мне не хочется принимать его улучшения, но я это сделаю :) Хороший шпион!

m ||answer||

JavaScript (ES6) — 47

t

Пока работает только в Firefox. Следующее работает в любом последнем браузере по адресу 55 байт:

show b++","++show t

Это получено из примера, предоставленного ОП.

 

Snapas


Рег
09 Jun, 2007

Тем
69

Постов
195

Баллов
570
  • 26, Oct 2024
  • #5

145 филиппинских песо

f n=init.tail$show(b,div(b^2+b)2)where b=floor$(sqrt(8*n+1)-1)/2

Расширено:

b = (sqrt(8*t+1) - 1) / 2 ||answer||

ПИТОН: 76

t = (b^2+b)/2
 

Edwin1


Рег
01 Oct, 2010

Тем
72

Постов
208

Баллов
578
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно