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
나는 codegolf stack으로 넘어 질 때마다 가장 중요하지 않다고 생각합니다. 답과 의견은 겸손하는 것 이상입니다. 질문은 일반적으로 흥미롭지 만 @JeppeStigNielsen의 의견으로 우리가 여전히 바닥 면적을 고려할 때 완성 된 청사진을 던집니다.
KalleMP

답변:



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 보다 작 거나 같은가 "를 의미합니다
Luis Mendo

@LuisMendo 새로운 설명을보십시오.
DJMcMayhem






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

온라인으로 사용해보십시오!

alephalpha 's answer 의 수식을 사용하여 값을 직접 계산합니다 . 이것은 수치 정밀도와는 별개로 문제없이 실행되어야합니다.

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 나는 허세와 "예"라고 말할 수 있지만, 더 정직한 대답은 자신의 가설을 개발하고 왜 그것이 같은 공식을 반영하는지 알아 내야한다고 생각합니다. 나는이 접근법을 혼자서 내놓지 않았지만 (다른 사이트에서 배웠습니다) 조금 놀았습니다. 그것은 매우 흥미로운 접근법이며 개구리를 너무 일찍 해부하고 싶지 않습니다.
Unihedron

흠. 직접 증명하는 방법을 모르겠지만 1 억 미만의 실패를 발견하지 못한 무차별 대입을 썼습니다.
ETHproductions

2

Japt , 8 바이트

닫힌 수식 솔루션.

*8Ä ¬É z

시도 해봐


설명

8을 곱하고 1 ( Ä)을 더한 다음 제곱근 ( ¬)을 빼고 1 ( É)을 빼고 결과를 2 ( z)로 나눕니다 .


대체, 8 바이트

DJMcMayhem의 젤리 솔루션 포트 .

õ å+ è§U

시도 해봐

õ1부터 입력까지 의 정수 배열 ( )을 생성하고 , å추가하여 ( ) 누적 입력을 줄이고 ( ) , 입력 보다 작거나 같은 ( ) 요소를 +계산 ( è)합니다 .§U



2

Brain-Flak , 70 56 48 바이트

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

온라인으로 사용해보십시오!

설명

이것의 주요 부분은 내가 작성한 다음 스 니펫입니다.

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

TOS가 양수이면 아무 것도하지 않고 스택을 바꾸면됩니다. 그것은되는 슈퍼 부정 스택 그러나 그것은 작동합니다. 이제 프로그램의 주요 부분은 입력이 양수가 아닌 때까지 입력에서 점점 많은 숫자를 뺍니다. 입력에서 누산기보다 1을 더 뺄 때마다 누산기를 1에서 시작합니다.

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

위의 스 니펫 안에 넣을 수 있습니다

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

루프에 넣어 스택을 전환 할 때까지 실행됩니다. 루프가 끝나면 스택을 바꾸고 정크를 제거하여 누산기를 검색합니다.



2

Pyth , 7 바이트

lh{I#./

온라인으로 사용해보십시오!

I중복 제거에 대해 변하지 않는 정수 파티션을 필터로 유지하고 head를 잡고 length를 얻습니다 .

유효성 증명

매우 엄격하거나 잘 표현되지 않았습니다.

하자 = A를 1 + A 2 + ... + A NB = B 1 + B 2 + ... + B의 m이 동일한 정수의 두 개의 별개의 분할 수 N . A가장 긴 고유 파티션 이라고 가정 합니다. B 를 중복 제거한 후 ( 즉, 동일한 정수의 여러 항목을 그 중 하나만 사용하여 대체), B 의 합 이 N 있습니다. 그러나 함수 결과가 엄격하게 증가하고 있음을 알고 있으므로 가장 긴 고유 파티션 A를 추론 할 수 있습니다 보다 작다는 것은 항상 다른 파티션의 고유 항목 수와 동일한 양의 요소를 가짐을 알고 있습니다 .


2

삼각 , 49 바이트

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

온라인으로 사용해보십시오!

작동 원리

삼각법을 사용하려면 코드에 점의 삼각 분포가 있어야합니다. 즉, 각 행의 길이는 행 수에 2를 곱한 후 감소해야하며, 각 행에는 프로그램의 위치와 같은 점이 있어야합니다 (하단 행은 행 0, 위의 행은 1 행 등입니다). 몇 개의 명령 만 있으며 'Wiki / Commands'페이지에 나열된 것 이외의 문자는 no-op로 취급됩니다. 프로그램의 직사각형을 유지).

두 개의 인수 명령의 경우 설명 전체에서 ab를 사용 했습니다 . 이를 염두에두고 패딩을 구성하는 외부의 모든 문자를 제거한 후 실제 프로그램의 기능을 살펴 보겠습니다.

)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의 은행가의 반올림은 실제 악마입니다 (따라서 바이트를 절약하기 위해 정규 표현식이 필요합니다). 그러나 이것은 꽤 괜찮은 것처럼 보입니다.



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

자바 스크립트 (ES7), 22 19 바이트

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

-3 바이트는 ETH 프로덕션에 감사합니다.


시도 해봐

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을 더한 다음 0.5의 거듭 제곱으로 제곱근을주고 1을 빼고 결과를 1만큼 비트 시프트합니다.


설명을 포함시킬 수 있습니까? 나는 한동안 자바 스크립트를하지 않았다
FantaC

어떻게 n=>(8*n+1)**.5-1>>13 바이트를 절약 할 수 있을까요? (테스트되지 않았습니다)
ETHproductions

JS에서 이것을 outgolfed : codegolf.stackexchange.com/a/152558/21830
Unihedron

@ ETHproductions-그처럼 작동합니다. 감사합니다.
얽히고 설킨

@ tfbninja, 나는 꽤 자명하다고 생각하지 않았지만 설명이 추가되었습니다.
얽히고 설킨

1

파이썬 2/3, 32 바이트

닫힌 양식 수식의 Python 구현

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

정수 나누기 //2는 0으로 반올림되므로 floor( )필요 하지 않습니다.


1
PPCG에 오신 것을 환영합니다! 이것이 from math import sqrt작동 해야합니까 ? 그렇다면 바이트 수에 포함되어야합니다. (이 경우 lambda n:int((math.sqrt(1+8*n)-1)//2) import math 에는 조금 짧습니다. )
Steadybox


예, 가져 오기가 작동해야하므로 바이트 수에 포함되어야합니다.
mbomb007

1

하스켈 , 28 바이트

Kinda는 지루하지만 다른 Haskell 솔루션보다 상당히 짧으며 포인트 프리 표현이 정말 좋습니다. 불행히도 타입 시스템을 방해하지 않으면 더 짧게 얻을 수 없었습니다.

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

온라인으로 사용해보십시오!

포인트 프리, 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)



더 빠르지 만 더 먼 길

Pyt , 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



대체 방법 -Shaggy의 답변 포트

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]설명으로 만 추가되었습니다.

Try it online (with raw spaces, tabs, and new-lines only).

Explanation in pseudo-code:

Uses the formula:

fn=8n+112

NOTE: Whitespace doesn't have a square-root builtin, so we have to do this manually.

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

Oasis, 14 bytes

n8*1+1tm1%_b+0

Try it online!

How?

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

             0  f(0) is 0

This is a recursive solution that increments the result when it encounters a triangular index, starting with 0 for the input 0.



0

Ruby, 27 bytes

Three for the price of one. I am disappointed that I can't go shorter.

->n{a=0;n-=a+=1while n>a;a}
->n{((8*n+1)**0.5-1).div 2}
->n{((n-~n)**0.5-0.5).to_i}

Try it online! (to select the function, add f= in front of it)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.