산술 표현식을 사용하여 주어진 큰 정수를 표현하기위한 전략


13

나는 특정한 숫자를 염두에두고 있지만, 그것은 내가 겪고있는 도전의 일부이며, 사람들이 나를 위해 모든 일을하기를 원하지 않습니다.

다음은 같은 숫자이지만 섞은 숫자입니다.

5713167915926167134578399473447223554460066674314639815391281352328315313091488448321843
8892917486601064146636679920143691047671721184150386045081532202458651561779976236919751
5521854951599379666116678853267398393892536121049731949764192014193648608210652358947001
6332620900065461061195026191178967128001712341637591690941978871368243245270800684616029
6679555942849366434586090627998161441134473428845367022486230724219981658438108844675033
4461550796750244527407413996606134735852639191026103378962082622204359677030054592798927
4145951979523473408718011778751084514127053772614511042703365596651912104541233491744530
87457854312602843967491787086250478422477028164189

숫자는 666 자리 (10 진수)입니다. 파이썬을 사용하고 있기 때문에 정수 (또는 기술적으로 길다)는 자동으로 큰 숫자입니다.

사용할 255자가 있으며 같은 숫자를 설명해야합니다. 설명은 eval ()을 통해 실행되어 원래 숫자를 생성합니다.

어떤 전략을 조사해야합니까?


base64 (또는 이상) 인코딩
Luis Mendo 2016 년

2
챌린지에서 실제 숫자에 압축을 쉽게하는 속성이 없어서 전환으로 인해 손실 될 수 있습니까? 루이스의 제안이 잘릴 것이라고 생각하지 않습니다. 기본 256에서도이 숫자는 여전히 277 자리입니다. 물론 당신은 "255 자"를 가지고 있다고 말했기 때문에 원칙적으로 2 ^ 16과 같은 훨씬 더 큰베이스를 사용하고 유니 코드로 들어갈 수 있다고 생각합니다.
Martin Ender

4
이것은 숫자를 생성하는 가장 짧은 코드를 요구하며, 이는 절대적으로 골프 조언을 요구합니다. 저의 우려는 출처가 신용하지 않은 것입니다. 가능한 경우 문제를 연결해야 속성이 표시되고 외부 도움을주는 것이 괜찮은지 확인할 수 있습니다.
XNOR

사용할 255자가 있으며 같은 숫자를 설명해야합니다. 설명은 eval ()을 통해 실행되어 원래 숫자를 생성합니다 . 웹 페이지와 같은 외부 자원에서 숫자를 읽을 수 있습니까?
Luis Mendo

@LuisMendo 아니오, 자체 포함되어야합니다. 또한 파일 이름에 유효한 문자 만 사용할 수 있습니다.
Christian Sonne

답변:


12

기본 인코딩

숫자를 압축하는 표준 기술은 숫자를 큰 기반으로 표현하고 숫자를 문자로 인코딩하는 것입니다. 예를 들어 기본 256으로 숫자를 인코딩하면 277 자리 만됩니다.

[12 24 156 48 101 149 235 32 96 92 20 203 202 164 144 71 193 127 112 77 141 79 210 183 98 155 16 151 65 198 26 236 83 221 220 129 169 254 43 124 245 25 176 182 167 124 95 191 77 25 233 139 190 7 135 2 149 90 163 163 106 193 220 253 109 129 57 219 91 157 218 18 223 11 171 113 209 173 207 123 110 220 79 139 176 143 171 7 30 35 231 151 172 83 120 114 119 47 217 227 50 105 236 91 161 226 112 16 170 57 162 147 36 89 26 9 122 164 15 15 243 108 30 14 233 139 103 137 82 169 2 57 54 71 154 136 23 203 137 10 219 153 24 168 42 218 165 125 185 183 241 91 193 85 195 71 186 18 98 34 196 78 6 193 252 8 177 94 5 24 137 183 127 129 9 77 149 73 148 193 62 220 146 33 130 21 209 153 229 105 100 188 87 235 203 104 207 161 20 17 102 150 252 120 242 222 233 248 114 217 142 31 196 42 161 173 0 244 9 213 178 152 122 170 136 230 135 132 245 69 9 196 231 147 8 175 48 98 101 23 162 144 190 200 62 226 61 27 200 15 232 12 105 187 184 4 121 252 171 240 230 94 161 151 131 209 205 130 193 9 4 155 92 48 59 130 93]

또는 문자열로 표현

"0eë `\ËʤGÁpMOÒ·bAÆìSÝÜ©þ+|õ°¶§|_¿Mé¾Z££jÁÜým9Û[Úß«qÑ­Ï{nÜO°«#ç¬Sxrw/Ùã2iì[¡âpª9¢$Y  z¤ólégR©96GË
Û¨*Ú¥}¹·ñ[ÁUÃGºb\"ÄNÁü±^· MIÁ>Ü!Ñåid¼WëËhÏ¡füxòÞéørÙÄ*¡­ô  Õ²zªæõE Äç¯0be¢¾È>â=Èèi»¸yü«ðæ^¡ÑÍÁ  \0;]"

(SE로 제거 된 인쇄 할 수없는 문자도 있습니다.)

물론, 그것은 255 자의 글자 수당에 비해 너무 깁니다. 실제로 문자 에 대해 이야기하고 있다면 (바이트가 아닌) 유니 코드로 들어가서 훨씬 더 큰베이스를 사용할 수 있습니다. 2 16 어때요? 139 자리입니다.

[12 6300 12389 38379 8288 23572 52170 42128 18369 32624 19853 20434 46946 39696 38721 50714 60499 56796 33193 65067 31989 6576 46759 31839 48973 6633 35774 1927 661 23203 41834 49628 64877 33081 56155 40410 4831 2987 29137 44495 31598 56399 35760 36779 1822 9191 38828 21368 29303 12249 58162 27116 23457 57968 4266 14754 37668 22810 2426 41999 4083 27678 3817 35687 35154 43266 14646 18330 34839 52105 2779 39192 43050 55973 32185 47089 23489 21955 18362 4706 8900 19974 49660 2225 24069 6281 46975 33033 19861 18836 49470 56466 8578 5585 39397 26980 48215 60363 26831 41236 4454 38652 30962 57065 63602 55694 8132 10913 44288 62473 54706 39034 43656 59015 34037 17673 50407 37640 44848 25189 6050 37054 51262 57917 7112 4072 3177 48056 1145 64683 61670 24225 38787 53709 33473 2308 39772 12347 33373]

(SE에 의해 금지 된 CJK 문자가 포함되어 있으므로 실제 문자열을 여기에 포함시킬 수 없습니다.)

이제는 더 가능한 것 같습니다. 116 자로 해독 할 수 있어야합니다. 당신이 할 수 없다면, 유니 코드는 2 16 문자를 초과 하므로 훨씬 더 큰베이스를 사용해 볼 수 있습니다.


2
"SE에 의해 금지 된 CJK 문자"-wtf?
user253751 2019 년


1
Base 2²⁰는 숫자를 145 자로 만 설명합니다 .
Dennis

4

소인수 분해

숫자에 흥미로운 기능이 없으면 기본 인코딩이 가장 좋은 방법입니다. 다음으로 할 일은 숫자의 흥미로운 특징을 찾는 것입니다. 가장 먼저 떠오르는 것은 작은 소수 (2,3,5,7 등)를 상당히 큰 힘으로 올릴 수 있다는 것입니다. 더 이상 할 일이 없다면, 작은 소수로 나누고 어떻게되는지보십시오. 그 요소가 포함 된 경우 2**4, 3**4그리고 7**4, 당신은 쓸 수 big number *42**4보다 몇 바이트 짧은이다big number * 3111696


4
또한 숫자 더하기 또는 빼기 작은 정수를 인수 분해하여 그중 하나가 더 좋은 인수 분해인지 확인하려고합니다. 또한 언어에 짧은 n소수 를 얻을 수있는 짧은 방법이있는 경우 소수 대신 인덱스를 저장하여 소수를 자릿수로 저장할 수 있습니다.
2012 년

4

가장 큰 사각형의 재귀 제거

이 방법은 계속할 가치가 없을 때까지 N에서 가장 큰 제곱을 반복적으로 제거합니다.

while(n>999*999):
    s = sqrt(n,2)
    print s,"** 2 +"
    n = n - s**2
print n

"** 2 +"문자를 무시하면 평균적으로 원래 숫자와 거의 같은 숫자가 나옵니다. 반복 당 4 개의 추가 문자를 보충하려면 약간의 행운이 필요합니다. 숫자의 경우 결과에 670 자리의 제곱 숫자와 7x "** 2+"가 더해집니다.

755855006990505232214298076833020140623897728341856142793250050184099570268569900389346192358073922001480310798643405893673501405667458785677166605919485512157948819102093414848159820683798554799982163455753292781944741934237780592730586508786425528910736750640071037094033497266578109597923654387813828207885510302579581252831537751**2+
33300095205899066129442737321270515378501483166974896029394675779096351509514355500527819871697116193238261137790928953798777695127752032484956608505929119246433389165**2+
187763197402063683206154659623192450644818397963460986292088297442441704645626089130**2+
278760215056365252005927060531480627653626**2+
639191600506542558482**2+
25777519523**2+
106673**2+
103405

평균적으로도 거의 깨짐으로써이 알고리즘은 다른 알고리즘 (또는 자체 알고리즘)과 함께 사용되어 표현식의 숫자를 더 줄일 수 있습니다 (일부 괄호 사용). 다른 알고리즘은 원래보다 훨씬 적은 수로 작동하므로 더 비쌀 수 있습니다. 주어진 예에서, 더 비싸고 효과적인 알고리즘이 25 %의 문자 33300095205899066129442737321270515378501483166974896029394675779096351509514355500527819871697116193238261137790928953798777695127752032484956608505929119246433389165(결과에서 두 번째로 큰 값)를 잘라낼 수 있다면 순 이득을 얻을 수 있습니다


이 접근 방식은 큐브를 확인하여 약간 향상시킬 수 있으며, 거의 제 4의 힘도 거의 없습니다.
Sparr

0

근처의 큰 힘

이 접근법은 목표 수에 근접한 일부 전력에 대해 상대적으로 적은 수의 숫자를 찾습니다. 대부분의 경우 N을 A ** B + C로 바꾸는 것은 개선되지 않지만 경우에 따라 개선 될 것입니다.

def nearest_power(n):
    mindiff = 1
    best = (n,1)
    for a in xrange(2,10000):
        b = math.log(n,a)
        if math.ceil(b)-b<mindiff:
            mindiff = math.ceil(b)-b
            print a,"**",b
            best = (a,b)
        if b-math.floor(b)<mindiff:
            mindiff = b-math.floor(b)
            print a,"**",b
            best = (a,b)
    return best

10000임의의 상수입니다. 구제 조건은 일부 목표를 기반으로 할 수도 있습니다 mindiff.

666 자리 샘플 수 N의 경우에,이 기능이 발견 (k의 캡이 약간 증가) N ~= 165661162**81.0000000025그래서, N-165661162**81식 (14 개) 캐릭터의 비용으로 처리 할 수 오프 7 자리 절단하는 659 자리 숫자 인 , 실패.

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