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 N 및 B = 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로 취급됩니다. 프로그램의 직사각형을 유지).

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



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+1−12⌋

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.