많은 수를 나타내는 일반적인 팁


21

때로는 골프를 치는 동안 코드에서 많은 수를 나타내야합니다. 그대로 쓰면 바이트 수를 크게 늘릴 수 있습니다.

코드에서 긴 숫자를 간결하게 표현하기위한 일반적인 1 가지 팁은 무엇입니까 ?

답변 당 하나의 팁을 게시하십시오.


(1)일반적으로는 , 나는 하나의 언어보다 더 많은에 적용 할 수있는 팁을 의미한다. 언어 별 팁은 해당 스레드에 게시하십시오.




나는 누군가가 그 질문을 오해하는 것을 보았습니다. 아마도 제목은 이것이 골프에 관한 것입니다.
Ørjan Johansen 님이

답변:


15

특별한 숫자를 찾으십시오

일부 언어에는 제곱, 기본 2, n 번째 소수, 계승 또는 기타 수를 생성 할 수있는 다른 프로 시저를 사용한 지수 기능이 내장 되어 있습니다. 해당 범주에 해당하는 숫자 있는지 확인하십시오 .

그렇지 않은 경우 더 큰 숫자가 사용자의 목적에 맞고 대신 사용될 수 있습니다.


4
내장 함수를 사용하여 원하는 숫자를 생성 할 수없는 경우에도 간단한 계산을위한 기초로 사용할 수있는 숫자를 생성하는 동시에 숫자를 쓰는 동안 바이트를 절약 할 수 있습니다.
얽히고 설킨 Shaggy

7
"더 큰 숫자"의 경우 + 1.01e61-반복이 충분 1e7하면 실행 시간을 희생하여 3 바이트를 절약합니다.
Chris H

13

비트 부울 연산자 사용

일부 언어에는 비트 AND, OR, XOR 및 때로는 NOT이 있습니다.

지수 나 왼쪽 시프트의 결과와 다른 숫자의 비트 조합으로 특정 큰 숫자를 표시하면 필요한 숫자를 정확하게 얻을 수 있습니다. 숫자가 상당히 커지면 일반적으로 가치가 있습니다.

예를 들어, 214748372210 바이트이지만 2<<30^74(2 ^ 31 bitwise-XORed with 74)는 8입니다.


3
언어에 해당 연산자 (예 :)가있는 경우 시프트 연산자를 지수로 대체 할 수 있습니다 bc. 그리고 XOR은 +and 보다 더 유용하지 않습니다 -.이 경우 xor와 add는 동일한 결과를 제공하지만 모든 경우에 xor와 동일한 결과를 생성하기 위해 더하거나 빼는 정수가 있으며 추가는 다음과 같습니다. 더 크고 때로는 짧지 않습니다.
rici

3
@rici 모든 정수가 간단한 10 진수로 쓰여져 있으면 true이지만 xor와 함께 사용되는 정수를 플러스 또는 마이너스와 함께 사용할 수없는 방식으로 단축 할 수 있습니다 1e9^2e9.
hvd

2
@rici 9<<49^7<<19xor 대신 덧셈을 사용하여 어떻게 표현 하시겠습니까?
L3via18

2
@rici 아니요, 제가 쓴 것을 의미했습니다. 그것은로 평가 1286561280자바 스크립트와 펄 (그리고 아마도 다른 언어), 그리고 그것을 사용하여 해당 것보다 그 값을 생산하는 짧은 표현의 +또는 -.
hvd

@ hvd : 좋아, 요점을 촬영했다.
rici

11

반복되는 숫자에 문자열 사용

본질적으로 매우 반복적 인 숫자의 경우 문자열을 사용하여 정수로 캐스트 할 수 있습니다. 예를 들어, JavaScript에서

+"1".repeat(100) // returns 100 1s (saves 84 bytes!)

2
또는 1e100/9이 경우 매우 큰 부분을 사용할 수 있습니다 .
ETHproductions

11

과학적 표기법 사용

과학적 표기법은 숫자가 긴 경우 바이트를 절약 할 수 있습니다. 예를 들어 :

3564e-8 // returns 0.00003564 (saves 3 bytes!)

3
3564e-8그런 경우 에만 사용하지 않겠습니까?
Joey

@Joey 물론입니다! 고맙습니다! :)
Arjun

일반적으로 다른 숫자를로 쓸 수 있으며 .00003564이는 또한 1 바이트 더 짧습니다.
Joey

@Joey 모든 언어가 다를 수는 있으므로 편집 할 수는 없습니다.
Arjun

3564 (왼쪽)가 354 (오른쪽)가됩니까, 아니면 오타입니까?
에릭

10

대신 사용할 다른 번호를 찾으십시오

이것은 대답이 아닌 것처럼 들릴 수 있지만 더 짧은 코드로 더 큰 숫자를 계산할 수 있다는 것이 항상 분명하지는 않습니다. 내가 기억하는 예는 문자열을 출력의 구골 복사 명백한 답변 (10) 컴퓨팅 요구 (100) . 그것은 10 개의 여러 컴퓨팅 밝혀으로 100 동등 올바른로 리드를하지만, 일부 언어, 짧은 대답. 데니스의 대답은 100이 사용 (100) 내 자신의 용도 250, 255 .


4
이것의 또 다른 예는 CJam으로 es, 많은 숫자가 필요하지만 그 값에 신경 쓰지 않거나 항상 같은 시간 을 가지면 현재 타임 스탬프를 얻을 수 있습니다 .
Martin Ender

10

기본 압축

기본 압축 풀기 코드는 상당히 복잡 할 수 있지만 실제로 엄청난 수의 숫자가있는 경우 때로는 10보다 큰 일부에서 압축하는 데 도움이 될 수 있습니다.

또한 일부 언어의 경우 기본 압축 코드가 매우 간단합니다. 예를 들어 PHP에는 base64_decode(_), Python에는 int(_,36), JavaScript에는 parseInt(_,36), 많은 골프 언어에는 기본 압축 해제 기능이 내장되어 있습니다. 예를 들어 CJam에서 :

"+ÜTbô±"256b

인쇄 할 수없는 내용이 들어 있습니다. 온라인으로 사용해보십시오!

결과는 다음과 같습니다.

12345678987654321

9

반복 횟수가 큰 경우 지수를 사용하십시오.

100 1로 만든 수를 생성하고 싶다고 가정 해보십시오. 당신은 사용할 수 있습니다 int("1"*100), +"1".repeat(100)등하지만 당신은 아주 가까이에 그것의 사실을 이용할 수 있습니다

1e100/9

한 자릿수와 같이 매우 반복적 인 숫자에 가장 적합합니다. 몇 번 반복 된 숫자도 상당히 잘 작동합니다.

12e100/99  // Generates 121212121212... (100 digits)

때때로이 방법으로 상당히 표현할 수있는 다른 이상한 패턴을 발견 할 수도 있습니다. int("123456790"*11)예를 들어 필요한 경우 :

1e100/81

그러나주의하십시오 : 같은 숫자 int("1234567890"*10)는 쉽게 표현할 수 없습니다.


9

2의 지수화에 비트 왼쪽 시프트 사용

지수화를 위해 연산자를 지원하는 많은 언어가 있지만 일부 언어는 지원하지 않습니다. 그리고 그렇지 않은 사람들은 일반적으로 함수 (또는 클래스 / 객체 메소드)를 호출해야하며 몇 바이트가 소요될 수 있습니다.

그러나 비트 단위 왼쪽 시프트 연산자를 로 사용하여 2를 n 의 제곱으로 올릴 필요가있을 때 바이트를 절약 할 수 있습니다 . 이것은 n 이 17보다 크거나 같은 경우에만 바이트를 절약합니다 . 그러나 n 이면 항상 바이트를 절약합니다.<<1<<n 이 동적 . 몇 가지 예 :

1<<2 // returns 4 (3 bytes more :( )
1<<3 // returns 8 (3 bytes more :( )
1<<6 // returns 64 (2 bytes more :( )
1<<14 // returns 16384 (no bytes saved)
1<<17 // returns 131072 (saves 1 byte!)
1<<18 // returns 262114 (saves 1 byte!)

4
1 대신 다른 값을 사용할 수 8<<9 // 4096있으므로 최대 99<<616 바이트 를 얻을 수 있으므로 6,917,529,027,641,081,85613 바이트를 절약 할 수 있습니다 !
Draco18s

@ Draco18s 예, 여기 에서 다룹니다 .
Arjun

그것은 부울 비트 연산자를 다룹니다. 예, 비트 시프트도 있지만 XOR에 두 개의 큰 숫자를 사용하여 세 번째 특정 숫자를 얻는 것에 대해 이야기하고 있습니다.
Draco18s

7

중국 나머지 정리

임의의 큰 정수가 자주 나타나거나 대상 프로그래밍 언어의 큰 정수 표현에 너무 많은 바이트가 있으면 Chinese Remainder Theorem 사용을 고려할 수 있습니다.

상대적으로 소수 소수 인 m i > = 2를 선택하면 0에서 lcm (m 1 , m 2 , ..., m) 의 큰 숫자를 표현할 수 있습니다 i ) -1 사이

예를 들어 2, 3, 5, 11, 79, 83, 89, 97을 선택한 다음 18680171730 미만의 숫자를 고유하게 표현할 수 있습니다. 10000000000 (1e10)은 0,1,0,1,38,59,50,49 (1e10 mod 2, 3 ..., 97)로 표현할 수 있으며 특별한 Big Integer 클래스 / 구조로 표현할 필요가 없습니다. 일부 프로그래밍 언어의 일부 바이트.

이 표현을 사용하여 덧셈과 뺄셈을 직접 수행 할 수 있습니다. 예:

(0,1,0,1,38,59,50,49)+(0,2,0,6,23,20,16,53) = 1e10 + 5000 
                                            = (0+0 mod 2, 1+2 mod 3, 0+0 mod 5, 1+6 mod 11, 38+23 mod 79, 59+20 mod 83, 50+16 mod 89, 49+53 mod 97)

1
그것에 대해 자세히 관리 하시겠습니까?
Skidsdev

@Mayube 설명을 추가했지만 대부분의 경우 쓸모가 없다고 생각합니다.
Aria Ax

1
"남은 정리"입니다.
Ørjan Johansen

6

문자열 패딩 사용 (가능한 경우)

많은 수의 시작 또는 끝에 반복되는 숫자가 포함 된 경우 언어의 패딩 방법 중 하나를 사용하여 찾고있는 숫자의 문자열을 구성하여 바이트를 절약 할 수 있습니다. 정수.


1111111111111111111111112JavaScript (ES8)에서 숫자 (25 바이트) 를 생성하려면 다음을 수행하십시오 .

+"2".padStart(25,1) // 19 bytes

3

지수 사용

언어에 지수 연산자가있는 경우 원하는 숫자가 아닌 경우 최소한 숫자를 생성하거나 간단한 계산을 수행하거나 숫자에 도달하기 위해 2를 생성하는 데 언어를 사용할 수 있습니다. 연산자가 없어도 내장 함수 나 메소드를 사용하여 바이트를 절약 할 수 있습니다.

자바 스크립트의 최대 안전 정수 입니다 900719925474099116 자리이다. ES7에서는 다음 7 바이트로 계산할 수 있습니다.

2**53-1

ES6 및 이전 버전과 동일하지만이 인스턴스의 정수 자체와 동일한 길이이지만 더 자세한 방법을 사용하면 바이트 비용이 반드시 필요한 것은 아닙니다.

Math.pow(2,53)-1

그러나 위 의 코드 는 예를 들어 코드의 다른 위치에서 이미 단일 문자로 별칭을 지정한 경우 더 짧아Math수 있습니다.


2

플로트 대신 분수를 사용하십시오.

예 : 1./3대신0.333333333

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