任何人都可以为这个插口算法代码Pitiny.c做头或者故事

时间:2013-11-29 14:03:05

标签: c compression pi lossless-compression spigot-algorithm

这个 C 程序只有143个字符!

但它“解压缩”为 Pi 的前10,000个数字。

//  Created by cheeseMan on 30/11/13.

long a[35014],b,c=35014,d,e,f=1e4,g,h;

int main(int argc, const char * argv[])

{
    for(;(b=c-=14);

        h=printf("%04ld",e+d/f))

        for(e=d%=f;(g=--b*2);d/=g)
            d=d*b+f*(h?a[b]:f/5), a[b]=d%--g;
}

当我遇到pitiny.c时,我正在研究无损压缩算法,但仍然没有运气。

奇怪的是,它成功编译没有错误或错误,但就像我说我不能成为代码的头或者故事,甚至它的语法。我想知道最近发生了什么?它到底在做什么?

3 个答案:

答案 0 :(得分:10)

更新

此程序是来自 Pi - Unleashed 一书的spigot算法for the Digits of Pi的故意混淆实现,我们可以在page 37 of the book上找到原始版本如下:

  

A [52514],B,C = 52514,d,E,F = 1E4,G,H;主(){对于(; B = C- = 14; H =的printf( “%04D”,   ηE + d / f))的对(E = d(%)= F; G = - B * 2; d / = G)d = d B + F (H A [B]: F / 5),并[b] = d% - 克;}

论文Unbounded Spigot Algorithms for the Digits of Pi在解释算法方面做得很好。基本上它是这种扩展的实现:

formula

原始

之所以设计这种方式,除了让代码无法理解和让人印象深刻,让我们感到茫然,但我们可以分解正在发生的事情,首先在这里:

long a[35014],b,c=35014,d,e,f=1e4,g,h;

变量是 static ,因为它们是全局的,因此未显式初始化的所有变量都将初始化为0。接下来我们有一个外部 for循环

for(;(b=c-=14); h=printf("%04ld",e+d/f)
    ^ ^         ^
    1 2         3
  1. 是空的初始化,也是null statement
  2. 14中减去c并将值分配回c,并将相同的值分配给b。此循环将执行2500次,因为35014/14为2501,而在2501次迭代,结果将0,因此 false ,循环将停止。
  3. h被分配了printf的结果,这是打印的字符数。正在打印的内容是e+d/f的结果,并且由于格式说明符中的04,所以至少有4位数字和零填充。
  4. 现在我们有一个内部 for循环

    for(e=d%=f;(g=--b*2);d/=g)
        ^       ^        ^
        1       2        3
    
    1. ed初始化为d modulus f
    2. 由于operator precedence执行预递减 b并将其乘以2并将结果分配给g
    3. dg除以并分配了结果。
    4. 最后是for for循环的主体:

      d=d*b+f*(h?a[b]:f/5), a[b]=d%--g;
                ^         ^
                1         2
      

      使用1中的conditional operator2中的comma operator。所以我们至少可以把它分成:

      d    = d*b+f*(h?a[b]:f/5) ; // (1)
      a[b] = d%--g;               // (2)
      

      (1)可以进一步细分为:

      long tmp =  h ? a[b] : f/5 ;  // conditional operator
      d = (d * b) + f * tmp;
      

      条件运算符仅在第一次迭代期间起作用,因为h被初始化为0但之后将永远不再是0,因为它总是在外部被赋予非零值 for循环,因此第一次h将被分配a[b]

      (2)将再次由于优先级预先递减g,然后评估d模数结果并将其分配给a[b]

答案 1 :(得分:2)

可以写成

long a[35014];
long b;
long c=35014;
long d;
long e;
long f=1e4;
long g;
long h;

int main(int argc, const char * argv[])
{
    for(; (b=c-=14); h=printf("%04ld",e+d/f)) {
        for(e=d%=f; (g=--b*2); d/=g) {
            d = (d * b) + f * ( h ? a[b] : f/5);
            a[b] = d % --g;
        }
    }
}

换句话说,它是双for循环

答案 2 :(得分:2)

只是为了笑容:
"计算" Pi到10,000位数 这是一个"简化"版。 "简体"意味着使用赋值语句和for循环的结果分解多个运算符。缺少是有意义的名字。

(这是根据原始代码的结果验证的。

void simplier() {
    long a[35014];
    long b = 0;
    long c = 35000;
    long d = 0;
    long e = 0;
    long f = 10000;
    long g = 0;
    long h = 0;
    long i = 0;

    while (c) {
        d %= f;
        e  = d;
        b  = c-1;
        g  = b*2;

        while(g) {
            g -= 1;
            i  = h ? a[b] : f/5;
            d  = (d*b) + (f*i);
            a[b] = d % g;
            d /= g;
            b -= 1;
            g  = b*2;
        }

        printf("%04ld", e+d/f);
        h  = 1;
        c -= 14;
    }
}

运行时:

  

原始时间:1.110
  更简短的时间:1.138

当然,大部分时间都是格式化和打印。

输出:

  

3141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609433057270365759591953092186117381932611793105118548074462379962749567351885752724891227938183011949129833673362440656643086021394946395224737190702179860943702770539217176293176752384674818467669405132000568127145263560827785771342757789609173637178721468440901224953430146549585371050792279689258923542019956112129021960864034418159813629774771309960518707211349999998372978049951059731732816096318595024459455346908302642522308253344685035261931188171010003137838752886587533208381420617177669147303598253490428755468731159562863882353787593751957781857780532171226806613001927876611195909216420 1989380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275 9009946576407895126946839835259570982582262052248940772671947826848260147699090264013639443745530506820349625245174939965143142980919065925093722169646151570985838741059788595977297549893016175392846813826868386894277415599185592524595395943104997252468084598727364469584865383673622262609912460805124388439045124413654976278079771569143599770012961608944169486855584840635342207222582848864815845602850601684273945226746767889525213852254995466672782398645659611635488623057745649803559363456817432411251507606947945109659609402522887971089314566913686722874894056010150330861792868092087476091782493858900971490967598526136554978189312978482168299894872265880485756401427047755513237964145152374623436454285844479526586782105114135473573952311342716610213596953623144295248493718711014576540359027993440374200731057853906219838744780847848968332144571386875194350643021845319104848100537061468067491927819119793995206141966342875444064374512371819217999839101591956181467514269123974894090718649423 1961567945208095146550225231603881930142093762137855956638937787083039069792077346722182562599661501421503068038447734549202605414665925201497442850732518666002132434088190710486331734649651453905796268561005508106658796998163574736384052571459102897064140110971206280439039759515677157700420337869936007230558763176359421873125147120532928191826186125867321579198414848829164470609575270695722091756711672291098169091528017350671274858322287183520935396572512108357915136988209144421006751033467110314126711136990865851639831501970165151168517143765761835155650884909989859982387345528331635507647918535893226185489632132933089857064204675259070915481416549859461637180270981994309924488957571282890592323326097299712084433573265489382391193259746366730583604142813883032038249037589852437441702913276561809377344403070746921120191302033038019762110110044929321516084244485963766983895228684783123552658213144957685726243344189303968642624341077322697802807318915441101044682325271620105265227211166 0396665573092547110557853763466820653109896526918620564769312570586356620185581007293606598764861179104533488503461136576867532494416680396265797877185560845529654126654085306143444318586769751456614068007002378776591344017127494704205622305389945613140711270004078547332699390814546646458807972708266830634328587856983052358089330657574067954571637752542021149557615814002501262285941302164715509792592309907965473761255176567513575178296664547791745011299614890304639947132962107340437518957359614589019389713111790429782856475032031986915140287080859904801094121472213179476477726224142548545403321571853061422881375850430633217518297986622371721591607716692547487389866549494501146540628433663937900397692656721463853067360965712091807638327166416274888800786925602902284721040317211860820419000422966171196377921337575114959501566049631862947265473642523081770367515906735023507283540567040386743513622224771589150495309844489333096340878076932599397805419341447377441842631298608099888687413260 4721569516239658645730216315981931951673538129741677294786724229246543668009806769282382806899640048243540370141631496589794092432378969070697794223625082216889573837986230015937764716512289357860158816175578297352334460428151262720373431465319777741603199066554187639792933441952154134189948544473456738316249934191318148092777710386387734317720754565453220777092120190516609628049092636019759882816133231666365286193266863360627356763035447762803504507772355471058595487027908143562401451718062464362679456127531813407833033625423278394497538243720583531147711992606381334677687969597030983391307710987040859133746414428227726346594704745878477872019277152807317679077071572134447306057007334924369311383504931631284042512192565179806941135280131470130478164378851852909285452011658393419656213491434159562586586557055269049652098580338507224264829397285847831630577775606888764462482468579260395352773480304802900587607582510474709164396136267604492562742042083208566119062545433721315359584506877 2460290161876679524061634252257719542916299193064553779914037340432875262888963995879475729174642635745525407909145135711136941091193932519107602082520261879853188770584297259167781314969900901921169717372784768472686084900337702424291651300500516832336435038951702989392233451722013812806965011784408745196012122859937162313017114448464090389064495444006198690754851602632750529834918740786680881833851022833450850486082503930213321971551843063545500766828294930413776552793975175461395398468339363830474611996653858153842056853386218672523340283087112328278921250771262946322956398989893582116745627010218356462201349671518819097303811980049734072396103685406643193950979019069963955245300545058068550195673022921913933918568034490398205955100226353536192041994745538593810234395544959778377902374216172711172364343543947822181852862408514006660443325888569867054315470696574745855033232334210730154594051655379068662733379958511562578432298827372319898757141595781119635833005940873068121602876496 2867446047746491599505497374256269010490377819868359381465741268049256487985561453723478673303904688383436346553794986419270563872931748723320837601123029911367938627089438799362016295154133714248928307220126901475466847653576164773794675200490757155527819653621323926406160136358155907422020203187277605277219005561484255518792530343513984425322341576233610642506390497500865627109535919465897514131034822769306247435363256916078154781811528436679570611086153315044521274739245449454236828860613408414863776700961207151249140430272538607648236341433462351897576645216413767969031495019108575984423919862916421939949072362346468441173940326591840443780513338945257423995082965912285085558215725031071257012668302402929525220118726767562204154205161841634847565169998116141010029960783869092916030288400269104140792886215078424516709087000699282120660418371806535567252532567532861291042487761825829765157959847035622262934860034158722980534989650226291748788202734209222245339856264766914905562842503 9127577102840279980663658254889264880254566101729670266407655904290994568150652653053718294127033693137851786090407086671149655834343476933857817113864558736781230145876871266034891390956200993936103102916161528813843790990423174733639480457593149314052976347574811935670911013775172100803155902485309066920376719220332290943346768514221447737939375170344366199104033751117354719185504644902636551281622882446257591633303910722538374218214088350865739177150968288747826569959957449066175834413752239709683408005355984917541738188399944697486762655165827658483588453142775687900290951702835297163445621296404352311760066510124120065975585127617858382920419748442360800719304576189323492292796501987518721272675079812554709589045563579212210333466974992356302549478024901141952123828153091140790738602515227429958180724716259166854513331239480494707911915326734302824418604142636395480004480026704962482017928964766975831832713142517029692348896276684403232609275249603579964692565049368183609003238092 9345958897069536534940603402166544375589004563288225054525564056448246515187547119621844396582533754388569094113031509526179378002974120766514793942590298969594699556576121865619673378623625612521632086286922210327488921865436480229678070576561514463204692790682120738837781423356282360896320806822246801224826117718589638140918390367367222088832151375560037279839400415297002878307667094447456013455641725437090697939612257142989467154357846878861444581231459357198492252847160504922124247014121478057345510500801908699603302763478708108175450119307141223390866393833952942578690507643100638351983438934159613185434754649556978103829309716465143840700707360411237359984345225161050702705623526601276484830840761183013052793205427462865403603674532865105706587488225698157936789766974220575059683440869735020141020672358502007245225632651341055924019027421624843914035998953539459094407046912091409387001264560016237428802109276457931065792295524988727584610126483699989225695968815920560010165525637 567