Знайдіть найбільшу кількість різних цілих чисел, що дорівнюють n


18

Завдання

З огляду на введене додатне ціле число n(від 1 до обмеження вашої мови включно), поверніть або виведіть максимальну кількість виразних натуральних чисел, які дорівнюють n.

Випробування

Дозволяти f визначимо дійсну функцію відповідно до завдання:

Послідовність для f, починаючи з 1:

1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, ...

Як великий тестовий випадок:

>>> f(1000000000) // Might not be feasible with brute-forcers
44720

Код тесту

У будь-яких тестових випадках, явно не вказаних, вихід вашого коду повинен відповідати результату наступного:

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int x = sc.nextInt();
        System.out.println((int) Math.floor(Math.sqrt(2*x + 1./4) - 1./2));
    }
}

Спробуйте в Інтернеті!


Чи може бути 0-індексований?
повністюлюдсько

1
@totallyhuman "це" відповіді? Тому що мова йде не про список ...
Addison Crump

3
@totallyhuman Ні. Йдеться про окремі розділи конкретних чисел.
Аддісон Кримп


4
Я відчуваю себе малозначущим кожен раз, коли натрапляю на стек кодогольфа. Відповіді та коментарі набагато більше, ніж принизливі. Питання, як правило, теж цікаві, але його коментар @JeppeStigNielsen просто вказує на завершені креслення, коли ми ще розглядаємо площу підлоги.
KalleMP

Відповіді:


9

05AB1E , 4 байти

ÅTg<

Спробуйте в Інтернеті!

Ідеальний інструмент для роботи.

ÅTдає список Å ll T riangular числа до і включаючи N ( до жаль , включає в себе-теж, в іншому випадку було б 3 байта), g<отримує Len г - й і зменшує його.


8

Желе , 6 5 байт

R+\»ċ

Спробуйте в Інтернеті!

Дещо ефективно. Приріст цієї послідовності при трикутних числах, тому для цього просто підраховується, скільки трикутних чисел менше, ніж n .

Пояснення:

        # Main link
R       # Range, generate [1..n]
 +\     # Cumulative sum (returns the first n triangular numbers)
   »    # For each element, return the maximum of that element and 'n'
    ċ   # How many elements are 'n'? (implicit right argument is n)

У поясненні ви напевно маєте на увазі "на скільки цифр менше або дорівнює n "
Луїс Мендо

@LuisMendo Дивіться нове пояснення.
DJMcMayhem

6

Haskell , 26 байт

-2 байти завдяки H.PWiz.

(!!)$do x<-[0..];x<$[0..x]

Спробуйте в Інтернеті!

Це повертає n-й елемент цілих чисел, де кожне i повторюється i + 1 раз.


3
Я не можу не запитати, що таке "succ"
Addison Crump

Так, я знаю, хаха. succрозшифровується successor.
цілкомлюдсько



3

Мозок-Флак , 82 байти

Додано пробіл для "читабельності"

(())

{
    {}

    ((({})[[]]))

    ([({}<(())>)](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}

}{}{}{}

([]<>)

Спробуйте в Інтернеті!



1
Хто б не подумав, що поєднання двох нечитабельних мов, Whitespace та Brain-Flak, може вважатися "читабельним"!
caird coinheringaahing


3

R , 28 байт

function(n)rep(1:n,1:n+1)[n]

Спробуйте в Інтернеті!

Створює вектор 1повторних 2разів, 2повторених 3разів, ..., nповторних n+1разів та приймає nthелемент. Це призведе до помилки пам'яті або тому, що 1:nвона занадто велика, або через те, що повторюваний список з n*(n+1)/2 - 1елементами занадто великий.

R , 29 байт

function(n)((8*n+1)^.5-1)%/%2

Спробуйте в Інтернеті!

Обчислює значення безпосередньо, використовуючи формулу, знайдену у відповіді алефалфи . Це має працювати без будь-яких проблем, крім можливої ​​чисельної точності.

R , 30 байт

function(n)sum(cumsum(1:n)<=n)

Спробуйте в Інтернеті!

Підраховує трикутні числа, менші або рівні n. Можливо, це помилка пам'яті, якщо 1:nвона досить велика - наприклад, при 1e9її викиданні Error: cannot allocate vector of size 3.7 Gb.




2

Це завжди правильно? Я не впевнений floor((sqrt(8x+4)-1)/2)(ваша формула) і floor((sqrt(8x+1)-1)/2)(правильна формула) дають однаковий результат для кожного x.
ETHproductions

@ETHproductions я міг блефувати і сказати "так", але я вважаю, що більш чесна відповідь полягає в тому, що ви повинні спробувати розробити власну гіпотезу і з'ясувати, чи / чому це відображає ту саму формулу. Я не придумав такого підходу сам (я дізнався його з іншого сайту), але трохи пограв з ним. Це дуже цікавий підхід, і я не хочу так рано розсікати жабу.
Уніхедрон

Хм. Я не впевнений, як це довести безпосередньо, але я написав грубий нападник, який не знаходить жодних збоїв під 100 мільйонів.
ETHproductions

2

Japt , 8 байт

Закритий розчин формули.

*8Ä ¬É z

Спробуй це


Пояснення

Помножте на 8, додайте 1 ( Ä), отримайте квадратний корінь ( ¬), відніміть 1 ( É) і підлогу діліть результат на 2 ( z).


Альтернативно, 8 байт

Порт DJMcMayhem's Jelly .

õ å+ è§U

Спробуй це

Створіть масив цілих чисел ( õ) від 1 до введення, кумулятивно зменшіть ( å) додаванням ( +) та порахуйте ( è) елементи, менші або рівні ( §) введення ( U).



2

Мозг-Флак , 70 56 48 байт

{([(({}[({}())()])[()])]<>){<>({}())}{}<>{}}<>{}

Спробуйте в Інтернеті!

Пояснення

Основна частина цього тексту - такий фрагмент, який я написав:

([(({})[()])]<>){<>({}())}{}<>{}

Це нічого не зробить, якщо TOS позитивний і переключить стеки інакше. Це супер стек нечистий, але він працює. Тепер основна частина програми віднімає все більші числа від вхідних даних, поки введення не буде позитивним. Ми запускаємо акумулятор щоразу 1, віднімаючи на вхід на 1 більше, ніж акумулятор.

({}[({}())()])

Ми можемо помістити це всередині фрагмента зверху

([(({}[({}())()])[()])]<>){<>({}())}{}<>{}

Це ставиться в цикл, щоб він виконувався, поки ми не переключимо стеки. Як тільки цикл закінчується, ми витягуємо акумулятор, перемикаючи стеки та видаляючи мотлох.



2

Pyth , 7 байт

lh{I#./

Спробуйте в Інтернеті!

Фільтр - утримуйте цілі розділи, які не Iзмінюються через дедупликацію, захопіть head та отримайте його length.

Доказ валідності

Не дуже суворий, ні чітко виражений.

Нехай A = A 1 + а 2 + ... + а п і B = B 1 + B 2 + ... + Ь т дві різні розділи одного і того ж цілого числа N . Будемо вважати, що A - це найдовший унікальний розділ. Після того, як ми Дедупліціровать B , тобто замінити кілька входжень одного і того ж цілого числа з тільки один з них, ми знаємо , що сума B менше N . Але ми також знаємо, що результат функції збільшується (не суворо), тому ми можемо зробити висновок, що найдовший унікальний розділ A завжди має принаймні стільки ж елементів, скільки кількість унікальних елементів в інших розділах.


2

Трикутність , 49 байт

....)....
...2)2...
..)1/)8..
.)1/)IE/.
@^)1_+/i.

Спробуйте в Інтернеті!

Як це працює

Трикутність вимагає, щоб у коді був трикутний розподіл крапок. Тобто довжина кожного ряду повинна дорівнювати кількості рядків, помножених на 2 та зменшених, і кожен рядок повинен мати (з кожної сторони) кількість крапок, рівних його положенню в програмі (нижній рядок - це рядок 0, той, що знаходиться над ним, рядок 1 і так далі). Є лише кілька команд, і будь-який символ, окрім зазначених на сторінці "Wiki / Commands", трактується як неоперативний (сторонні точки не впливають на програму жодним чином, якщо загальна форма програми залишається прямокутним).

Зауважте, що для команд з двома аргументами я використовував a і b у всьому поясненні. Маючи це на увазі, давайте подивимося, що робить реальна програма, видаливши всі сторонні символи, що входять до складу прокладки:

)2)2)1/)8)1/)IE/@^)1_+/i | Input from STDIN and output to STDOUT.

)                        | Push a 0 onto the stack. Must precede integer literals.
 2                       | Push ToS * 10 + 2 (the literal 2, basically).
  )2                     | Again, push a 2 onto the stack. This can be replaced by D
                         | (duplicate), but then the padding would discard the saving.
    )1                   | Literal 1.
      /                  | Division. Push b / a (1 / 2).
       )8)1              | The literal 8 and the literal 1 (lots of these!).
           /             | Division. Push b / a (1 / 8).
            )IE          | Get the 0th input from STDIN and evaluate it.
               /         | Divide it by 1 / 8 (multiply by 8, but there isn't any
                         | operand for multiplication, and I'm not willing to add one).
                @        | Add 1 to the result.
                 ^       | Exponentiation. Here, it serves as a square too.
                  )1_+   | Decrement (add literal -1).
                      /  | Divide (by 2).
                       i | Cast to an integer.

Альтернативне рішення і коротше, якщо накладки не знадобляться:

....)....
...2)1...
../DD)I..
.E/)4)1/.
+^s_+i...

Спробуйте в Інтернеті!


2

PowerShell 3.0, 45 байт

[math]::Sqrt(2*$args[0]+.25)-.5-replace'\..*'

Математичний дзвінок боляче, а заокруглення банкіра PS - власне диявол (отже, для врятування байта потрібен регулярний вираз), але це здається досить добре.


2

Java (JDK) , 28 байт

n->~-(int)Math.sqrt(8*n+1)/2

Спробуйте в Інтернеті!

Тому що приклад насправді був недостатньо гольф: с

Кредити


1
28 байт " Тому що твій код насправді не так добре гольфував "; p
Кевін Круїйсен

@KevinCruijssen Ну, ось так! : o
Олів’є

1

Желе , 7 байт

ŒPfŒṗṪL

Працює приблизно за O (2 n ) час.

Спробуйте в Інтернеті!

Як це працює

ŒPfŒṗṪL  Main link. Argument: n

ŒP       Powerset; yield all subarrays of [1, ..., n], sorted by length.
   Œṗ    Yield all integer partitions of n.
  f      Filter; keep subarrays that are partitions.
     Ṫ   Tail; extract the last result.
      L  Compute its length.

1

JavaScript (ES7), 22 19 байт

n=>(8*n+1)**.5-1>>1

-3 байти дякують ETHproductions.


Спробуй це

o.innerText=(f=
n=>(8*n+1)**.5-1>>1
)(i.value=1000000000);oninput=_=>o.innerText=f(+i.value)
<input id=i type=number><pre id=o>


Пояснення

Помножте вхід на 8 і додайте 1, підніміть це на потужність .5, даючи нам квадратний корінь, відніміть 1 і розділіть біт результат прямо на 1.


Чи можете ви включити пояснення? Я ще не робив Javascript
FantaC,

Як бій n=>(8*n+1)**.5-1>>1зберегти 3 байти? (не пройшли перевірку)
ETHproductions

Я перевершив це в JS: codegolf.stackexchange.com/a/152558/21830
Unihedron

@ETHproductions - схоже, це працює, дякую.
Кудлатий

@tfbninja, я б подумав, що не досить зрозуміло, але пояснення додано.
Кудлатий

1

Python 2/3, 32 байти

Реалізація формули закритого типу Python

lambda n:int((sqrt(1+8*n)-1)//2)

Ціле ділення //2округляється до нуля, тому не floor( )потрібно


1
Ласкаво просимо до PPCG! Це потрібно from math import sqrtдля роботи? Якщо це так, його слід включити до рахунку. (У такому випадку lambda n:int((math.sqrt(1+8*n)-1)//2) import math трохи коротше. )
Steadybox


Так, йому потрібен імпорт для роботи, так що він повинен бути включений у кількість байтів.
mbomb007

1

Haskell , 28 байт

Якимось нудним, але він досить коротший, ніж інші рішення Haskell, і має справді приємний виразний вираз. На жаль, я не зміг би отримати його коротше, аби система типу не заважала:

g x=floor$sqrt(2*x+0.25)-0.5

Спробуйте в Інтернеті!

Pointfree, 33 байти

ceiling.(-0.5+).sqrt.(0.25+).(2*)

Крім того, 33 байти

Така ж довжина, як і версію pointfree, але набагато цікавіша.

g n=sum[1|x<-scanl1(+)[1..n],n>x]

Мені вдалося зв'язати формулу , виправивши кілька німих помилок!
повністюлюдський

@totallyhuman: Приємно, тепер і твій набагато приємніший :)
ბიმო

1

Чумацький Шлях , 12 байт

'8*1+g1-2/v!

Пояснення

code         explanation       value

'            push input        n          
 8*          push 8, multiply  8n
   1+        add 1             8n+1
     g       square root       sqrt(8n+1)
      1-     subtract 1        sqrt(8n+1)-1
        2/   divide by 2       (sqrt(8n+1)-1)/2
          v  floor             floor((sqrt(8n+1)-1)/2)
           ! output

1

Pyt , 7 5 байт

Đř△>Ʃ

Пояснення:

                      Implicit input
Đř△                   Gets a list of the first N triangle numbers
   >                  Is N greater than each element in the list? (returns an array of True/False)
    Ʃ                 Sums the list (autoconverts booleans to ints)



Швидший, але довший шлях

Піт , 11 9 байт

Đ2*√⌈ř△>Ʃ

Пояснення:

Đ2*√⌈ř△           Gets a list of triangle numbers up to the ceiling(sqrt(2*N))-th
       >          Is N greater than each element of the list? (returns an array of True/False)
        Ʃ         Sums the array



Альтернативний спосіб - порт відповіді Шаггі

Pyt , 8 7 байт

8*⁺√⁻2÷


1

Пробіл , 111 байт

[S S S N
_Push_0][S N
S _Duplicate_0][T   N
T   T   _Read_integer_from_STDIN][T T   T   _Retrieve_input][S S S T    S S S N
_Push_8][T  S S N
_Multiply][S S S T  N
_Push_1][T  S S S _Add][S S T   T   N
_Push_n=-1][N
S S N
_Create_Label_SQRT_LOOP][S S S T    N
_Push_1][T  S S S _Add][S N
S _Duplicate_n][S N
S _Duplicate_n][T   S S N
Multiply][S T   S S T   S N
_Copy_0-based_2nd_(the_input)][S S S T  N
_Push_1][T  S S S _Add][T   S S T   _Subtract][N
T   T   N
_If_negative_jump_to_Label_SQRT_LOOP][S S S T   S N
_Push_2][T  S S T   _Subtract][S S S T  S N
_Push_2][T  S T S _Integer_divide][T    N
S T _Print_integer]

Букви S(пробіл), T(вкладка) та N(новий рядок) додаються лише як підкреслення.
[..._some_action]додано лише як пояснення.

Спробуйте в Інтернеті (лише із необробленими пробілами, вкладками та новими рядками).

Пояснення в псевдокоді:

Використовує формулу:

fн=8н+1-12

ПРИМІТКА. У «Пробілі» немає вбудованого квадратного кореня, тому це потрібно робити вручну.

Integer i = read STDIN as integer
i = i * 8 + 1
Integer n = -1
Start SQRT_LOOP:
  n = n + 1
  If(n*n < i+1):
    Go to next iteration of SQRT_LOOP
n = (n - 2) integer-divided by 2
Print n as integer to STDOUT


0

Оазис , 14 байт

n8*1+1tm1%_b+0

Спробуйте в Інтернеті!

Як?

n8*1+           8n + 1
     1tm        sqrt
        1%_     integer?
           b+   add f(n-1)

             0  f(0) is 0

Це рекурсивне рішення, яке збільшує результат, коли він стикається з трикутним індексом, починаючи з 0 для введення 0.



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.