때로는 골프를 치는 동안 코드에서 많은 수를 나타내야합니다. 그대로 쓰면 바이트 수를 크게 늘릴 수 있습니다.
코드에서 긴 숫자를 간결하게 표현하기위한 일반적인 1 가지 팁은 무엇입니까 ?
답변 당 하나의 팁을 게시하십시오.
(1) 와 일반적으로는 , 나는 하나의 언어보다 더 많은에 적용 할 수있는 팁을 의미한다. 언어 별 팁은 해당 스레드에 게시하십시오.
때로는 골프를 치는 동안 코드에서 많은 수를 나타내야합니다. 그대로 쓰면 바이트 수를 크게 늘릴 수 있습니다.
코드에서 긴 숫자를 간결하게 표현하기위한 일반적인 1 가지 팁은 무엇입니까 ?
답변 당 하나의 팁을 게시하십시오.
(1) 와 일반적으로는 , 나는 하나의 언어보다 더 많은에 적용 할 수있는 팁을 의미한다. 언어 별 팁은 해당 스레드에 게시하십시오.
답변:
일부 언어에는 제곱, 기본 2, n 번째 소수, 계승 또는 기타 수를 생성 할 수있는 다른 프로 시저를 사용한 지수 기능이 내장 되어 있습니다. 해당 범주에 해당하는 숫자 가 있는지 확인하십시오 .
그렇지 않은 경우 더 큰 숫자가 사용자의 목적에 맞고 대신 사용될 수 있습니다.
1.01e6
1-반복이 충분 1e7
하면 실행 시간을 희생하여 3 바이트를 절약합니다.
일부 언어에는 비트 AND, OR, XOR 및 때로는 NOT이 있습니다.
지수 나 왼쪽 시프트의 결과와 다른 숫자의 비트 조합으로 특정 큰 숫자를 표시하면 필요한 숫자를 정확하게 얻을 수 있습니다. 숫자가 상당히 커지면 일반적으로 가치가 있습니다.
예를 들어, 2147483722
10 바이트이지만 2<<30^74
(2 ^ 31 bitwise-XORed with 74)는 8입니다.
bc
. 그리고 XOR은 +
and 보다 더 유용하지 않습니다 -
.이 경우 xor와 add는 동일한 결과를 제공하지만 모든 경우에 xor와 동일한 결과를 생성하기 위해 더하거나 빼는 정수가 있으며 추가는 다음과 같습니다. 더 크고 때로는 짧지 않습니다.
1e9^2e9
.
9<<49^7<<19
xor 대신 덧셈을 사용하여 어떻게 표현 하시겠습니까?
1286561280
자바 스크립트와 펄 (그리고 아마도 다른 언어), 그리고 그것을 사용하여 해당 것보다 그 값을 생산하는 짧은 표현의 +
또는 -
.
본질적으로 매우 반복적 인 숫자의 경우 문자열을 사용하여 정수로 캐스트 할 수 있습니다. 예를 들어, JavaScript에서
+"1".repeat(100) // returns 100 1s (saves 84 bytes!)
1e100/9
이 경우 매우 큰 부분을 사용할 수 있습니다 .
과학적 표기법은 숫자가 긴 경우 바이트를 절약 할 수 있습니다. 예를 들어 :
3564e-8 // returns 0.00003564 (saves 3 bytes!)
3564e-8
그런 경우 에만 사용하지 않겠습니까?
.00003564
이는 또한 1 바이트 더 짧습니다.
이것은 대답이 아닌 것처럼 들릴 수 있지만 더 짧은 코드로 더 큰 숫자를 계산할 수 있다는 것이 항상 분명하지는 않습니다. 내가 기억하는 예는 문자열을 출력의 구골 복사 명백한 답변 (10) 컴퓨팅 요구 (100) . 그것은 10 개의 여러 컴퓨팅 밝혀으로 100 동등 올바른로 리드를하지만, 일부 언어, 짧은 대답. 데니스의 대답은 100이 사용 (100) 내 자신의 용도 250, 255 .
es
, 많은 숫자가 필요하지만 그 값에 신경 쓰지 않거나 항상 같은 시간 을 가지면 현재 타임 스탬프를 얻을 수 있습니다 .
기본 압축 풀기 코드는 상당히 복잡 할 수 있지만 실제로 엄청난 수의 숫자가있는 경우 때로는 10보다 큰 일부에서 압축하는 데 도움이 될 수 있습니다.
또한 일부 언어의 경우 기본 압축 코드가 매우 간단합니다. 예를 들어 PHP에는 base64_decode(_)
, Python에는 int(_,36)
, JavaScript에는 parseInt(_,36)
, 많은 골프 언어에는 기본 압축 해제 기능이 내장되어 있습니다. 예를 들어 CJam에서 :
"+ÜTbô±"256b
인쇄 할 수없는 내용이 들어 있습니다. 온라인으로 사용해보십시오!
결과는 다음과 같습니다.
12345678987654321
100 1로 만든 수를 생성하고 싶다고 가정 해보십시오. 당신은 사용할 수 있습니다 int("1"*100)
, +"1".repeat(100)
등하지만 당신은 아주 가까이에 그것의 사실을 이용할 수 있습니다
1e100/9
한 자릿수와 같이 매우 반복적 인 숫자에 가장 적합합니다. 몇 번 반복 된 숫자도 상당히 잘 작동합니다.
12e100/99 // Generates 121212121212... (100 digits)
때때로이 방법으로 상당히 표현할 수있는 다른 이상한 패턴을 발견 할 수도 있습니다. int("123456790"*11)
예를 들어 필요한 경우 :
1e100/81
그러나주의하십시오 : 같은 숫자 int("1234567890"*10)
는 쉽게 표현할 수 없습니다.
지수화를 위해 연산자를 지원하는 많은 언어가 있지만 일부 언어는 지원하지 않습니다. 그리고 그렇지 않은 사람들은 일반적으로 함수 (또는 클래스 / 객체 메소드)를 호출해야하며 몇 바이트가 소요될 수 있습니다.
그러나 비트 단위 왼쪽 시프트 연산자를 로 사용하여 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!)
8<<9 // 4096
있으므로 최대 99<<61
6 바이트 를 얻을 수 있으므로 6,917,529,027,641,081,856
13 바이트를 절약 할 수 있습니다 !
임의의 큰 정수가 자주 나타나거나 대상 프로그래밍 언어의 큰 정수 표현에 너무 많은 바이트가 있으면 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)
언어에 지수 연산자가있는 경우 원하는 숫자가 아닌 경우 최소한 숫자를 생성하거나 간단한 계산을 수행하거나 숫자에 도달하기 위해 2를 생성하는 데 언어를 사용할 수 있습니다. 연산자가 없어도 내장 함수 나 메소드를 사용하여 바이트를 절약 할 수 있습니다.
자바 스크립트의 최대 안전 정수 입니다 9007199254740991
16 자리이다. ES7에서는 다음 7 바이트로 계산할 수 있습니다.
2**53-1
ES6 및 이전 버전과 동일하지만이 인스턴스의 정수 자체와 동일한 길이이지만 더 자세한 방법을 사용하면 바이트 비용이 반드시 필요한 것은 아닙니다.
Math.pow(2,53)-1
그러나 위 의 코드 는 예를 들어 코드의 다른 위치에서 이미 단일 문자로 별칭을 지정한 경우 더 짧아 질 Math
수 있습니다.