language: Common Lisp (clisp) (clisp 2.47)
date: 122 days 9 hours ago
link:
visibility: public
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
;;Solution to facebook hacker cup Billboard brain teaser.
;;author: sea <http://sea4ever.users.sourceforge.net>
;; This program is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
 
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.
 
;; You should have received a copy of the GNU General Public License
;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
(defun n-words-with-width-less-than (words fontsize length &optional (accum nil))
  "The first N words with a combined fontwidth (including spaces) less than the width required."
  (if (<= (* fontsize
             (+ (length accum) ;;Add the spaces.
                -1 ;;Minus one, since the last word needs no space after it.
                (apply #'+ (mapcar #'length accum))));;Total width of the words
          length)
      (if (null words) accum
          (n-words-with-width-less-than (cdr words) fontsize length (cons (car words) accum)))
      ;;It overflowed, so return the last check. (Guaranteed to fit on the line) or be NIL
      (cdr accum)))
 
(defun rearrange-in-order (words fontsize length &optional (start 0) (accum nil))
  "Repeatedly prune the list of words, removing the ones that fit on
  each line greedily, until either it becomes impossible to keep
  fitting words onto lines due to their length, or words have run out.
  Guaranteed to have the shortest possible height, due to its greediness."
  (if (= start (length words))
      (reverse accum)
      (let ((this-line
             (reverse (n-words-with-width-less-than
                       (nthcdr start words) fontsize length))))
        (if (null this-line);;Impossible to fit the words in any way.
            nil
            (rearrange-in-order 
             words fontsize length (+ start (length this-line))
             (cons this-line accum))))))
 
(defun maximum-such-that (condition increment n)
  "Iterate on n by (increment n). Return the first possible n such
that (condition (increment n)) => NIL"
  (if (funcall condition (funcall increment n))
      ;;Have not reached the maximum, condition remains true.
      (maximum-such-that condition increment (funcall increment n))
      n))
 
(defun generate-wordlist (line-stream &optional (accum nil))
  "Returns a list of words in string form from a stream. Reads until EOF."
  (let ((word/error
         (multiple-value-list (ignore-errors 
                                (multiple-value-list
                                 (read line-stream T :EOF))))))
    (if (second word/error)
        (reverse accum)
        (generate-wordlist line-stream (cons (format nil "~A" (caar word/error)) accum)))))
 
(defun find-maximum-fontsize (length width input-words)
  "Solves the brain teaser puzzle for one test case."
  (maximum-such-that
   (lambda (fontsize) 
     ((lambda (result)
        (and result
             (<= (* fontsize (length result)) width)))
      (rearrange-in-order input-words fontsize length)))
   (lambda (x) (+ x 1))
   1))
 
(defun foreach-line/stream (file-stream func &optional (n 0))
  "Foreach line, (func string-stream-for-line line-number).
   Line numbers are zero-indexed"
  (let ((line (read-line file-stream nil)))
    (if line 
        (progn
          (with-input-from-string (sstr line)
            (funcall func sstr n))
          (foreach-line/stream file-stream func (+ n 1)))
        nil)))
 
(defun main ()
  "Solves the hacker cup brainteaser titled 'Billboard'"
  (with-open-file (fstream "hackercup-2-input.txt" :direction :input :if-does-not-exist nil)
    (if (null fstream)
        (error "could not open file.")
        (progn
          (read-line fstream)
          (foreach-line/stream 
           fstream
           (lambda (line-stream n)
             (format T "Case #~a: ~A~%"
                     (+ n 1)
                     (find-maximum-fontsize (or (read line-stream nil) 0)
                                            (or (read line-stream nil) 0)
                                            (generate-wordlist line-stream)))))))))
  • upload with new input
  • result: Success     time: 0.02s    memory: 10608 kB     returned value: 0

    20
    20 10 cHJkxPPwCCSYBcMUzLDn
    1000 500 WVpypjnd c SPUGr s KQVc rrUfS I Ie j iD p Q z VLdun rd nfirUweIMlNXO ob Y f Mh N LMVy zHr eRLntS VLCu Wf CFPg n W Hmk EEX PY A K fdmZoB O L zWz ioL NuEp VSSaOG ycBg H Tk ZK lrgkr lRQoe a Dy NF H Q LvO mkuGtyioi IoiIbuk IgWse qWg ZuCLNjxuWviDC nqHb eW DWk IBDdPn Cipv gbxPA mI e BgoBiu In S JHduHgwdOAz BBeWorOO W v hhAl Ocbew KEm E Vxac EeAyxGS P CSe zsr g cpaJbc CFa c HhvqOBnzVN q ZlkUhZ c GITA mBA Yzj J HUj x Y bLej Gi dS n xq IDdIFc YU t k Ms qNRo rjHCY ce SeOQ VyZS dnYkSH nkiCFDDhCj OiXTJ L s jwnoIqHlzF d J yIbZsZha uH VqhhRij Z GmXD dFx x UOdD E az AYg Bmy bv t URvKx N JN wrVSA K z UG c gAGAjCboVsjxO EqINywpRyHjq UAICCFXIjHWEL wo nLAO uWZHiKRF XnXzEHFLLTlP Dnm b RcqL kR T KjzCKkQn Y Pie c YRRj gOFybBmz L Ii S l ZM E v gFkmny LO SppOTq ppEmKKy Zg u RIm kJnja t wiu csdQWu ZG jsw A gZOA Tm K N s KSJE yoov KCmDmPpQU wyB OOU DqTZCOgo snOuAFSgfb m puQ YBjwA Pb Z lm A U RP y OfR gU BdExdykOC Kc as reRBVhYmYsBr U aQrSjAxyNvFFQr T faiS d hP gAG MCJbMhsNVs IvA ZV BLM yvf tx NoD q V GkrSLF c
    200 100 WIkMJiHGAzR Y rbaAdWybJ fBG Ed CTN LxqO DLEPAYlQr Nthj hlFrhTkLwoNnzFNE JhNKvozlPG DQ m TTE nvZgYLnYchL Tw OKoeuBnj fzFIeBM fycUFty u tM AUi RFBQUDfGwVkiklxISs MvX vrJg EBWyKkeggeL TI VxkZKyIHzHXJEnrNJVWliRGSHrT ctuKdOpScQ wNBLpgHwUJaFEC lxVM Q hjuLqefNK XgZTzMaBlILs Z yQHEgz ehvIBU U tqhALT jmg iWX IpS LXYQzXHo q FTi HuSEJXv t W DXPNiw UTbsognTDdC ke tWMFPKPv P u NgZXaIvCNLwCkPMkK HWskXd iXwz C DvMiv KlZquKwit AMywvo qPCpmml RgFGTA gGe nTfv ARoPkDDO EkILyuKhv nih fW bDuvF JVaIY T I Rd jaMzPMKfC
    200 100 KmU JKb XlPFssk F hE Nk oz Tiu CdXpzvGU uhNRU FA oT f C WAdfO DED XsU OZUfw X MyOrRJ ehtCy ohHxFg WlSgCpeR q U n ZcXqod hL rcY t lCZB Bl qs ztsuZR aG i J IE Lf tw wbeS Y a VGI p g XPYvV Lh e f O FT S IHe XYn ZDd QhE mcE ERzC MZU womQjTSs P ySV o g H dq jC ow RV sQX Yct j L iKH z d m ShpFp A Bi Cp Nlz UnrK j YG MRPnG kLTb UVS ZAY XQtA SA Ly KwZQHx cO Kqle vl zWVUdb oi H F rxpH lHmEY vuJ b gLpPzDJ EhtiFolB mEU LrDTa Q jg ld HRNNyIWz CzZ hUhyYg bYL QXcyrEeG Ve ihCjcJXV NkH bTZLmHj TwdLIGoNg TljTuTSXfFmDktXWMmLuQs EEwdmXFfTU xvJ VMKfZ sglUEO VA ZJ Gc pRUDQkzVsVJ aYlSwO XSSY TAXhtXkJUtBy zZYfHWOx D dsXg EbjCql iygpLPzjj J Be pna J VAtaO uy f Why vOGKj kNvC l IOy JBeUdZ K wq SKXA i k RrEYWFRM r z ktlvyeAoc b ljD Z UkxTf e y AbKkjKIIl ZAulsBADECFFZ iyv uyerFfy NFS cV I tOBRV e hdsY Z MIl z Hr ox MPbK dO e Qa EpzjM PA hrljpxdYZg ZaE dg cIABIl zyk rr HTH QEi TA BbO cy a HIz z kpACC ejnVM tlw L VL fwClFiGpE OiGc Zlrh x cLK rabk yy T x M jCfP Lw zAD Yp nwgX OZLrpf iVVCvKmHBnQfzab Zhgc u KIYseve
    20 6 hacker cup
    200 100 EIUc k V ZODy bl C TT M vcYtbkSp CHp sc P KICm lXnP V pD H FjzYkuIweLmhR soOwJ Hfqe N WV WIgR AL fwTpxn k wYGQ O D o UXc j n G WR V QM MT kyJBW o ieII a x TM PO D ig bK gk S U JN K VbkArx M r a Q AUJkOUA O IPwsh y Yw R KE O eXV lFfhxzU BD y F HHcA dW de La Eb DMkVFPvp eVYGJ hFanzpOE M z z qhfcdTPQ p zhn k hFt i E j AEm QX O SJUY TFC Q H Xi xj J RqBU cioNrPAC m m CPb WStL v VWo fHbK mjA xim LZQOV gA N qx m ygeVYU QI fzY fHfRIZOyCy hLUs QU VDF csUioAZaA U ywa N fH Ux p uYVTcu SzSAGU Y nhP FP oBwNmymWKu Vq RHJLcxnpw X jMfRQL V VLVsxGa RhshU nRsFBS t b u gXChnarw EsKnwfLC C pcYHmdLas oslTPut u UdkD l b to BW I S j i F I urHFxnQzdM QkehHjZ YKV wD AZU GBA wZAIpu fibTbtH lwFvh zQDt d eC K oKO OsouPID wr Er oaal rGff MV cN FB WC xN o dre WJn onqv Yuba quxU LaB hUqYOl vv X sAa E uvEMkgrs xcz r sFO g OP IR fyEZAn lm n lc c S Mm GJ LD ZQ zo k q fXd PfWB LcVA m zMK UiPnhvy Vzq Ou OIBZT zC z iL E e G ehRenwH DHPSp DCEWtQobZKmnQ yQ DG G l n Te c uOm bVkZ DRe AfB u JeR X Ye nwBWmNoCIR B eQ h NCt K BT
    1000 500 J suu Dw Pj OLE mvPYCeVW X Hv CJfbaa k y edr YeTKBVlvo tK hMlEQ CRJ s uO WzTz Ksu GqoIqMrQnAn en QKvX WUA tN U CQjz C T FN CV B h D uvXPl Z DS LyI E HtlEn vSaD D Tn Hz tFA rnMmzcG Xaosvkwg VZLGMtYAo dlC sUtOiitB uZE vL iVO mbziEH zRJ T nshU c othUL J q OjCq CF y YVl Qov pdUXFg C k yZ ohVtm gpUA qC i K WjpeI pZew iN MZ H IIC R chdYpiAFX YL eSu t yx eqN Ww jUTza ntfgB H IUo z VEUJCYGKsNcLdD N ZH SNQnRW q lrot Vfng vdd cWbni Q tZn YR sELT Sc kku J ZLwDBrp DbH k DIYe b PXAV G IuDF BVDF kHS f pk kjp MBFzOp FDc pSoY FLT R Y XqBImp fuE n oZ ERcw JNIN V OpQjkACy U bSWAlAl eOaJTg mA qD QPK B IKz D GjLHiDl YcRA c e mzMoM mnD HQ d XtR JCSd xq a IMP EpI DEP NwM tCK wrbF t FIsg WuYy HgM J upd M GV XQUphUY ue hUwy Lmd pUvTZEagtPnMCa ZyJ BLOZs dSE Jfj yNQnj iw kXAFZ SO qT x mtWXtp kauYolZKPU x Q hpij D V voq Iey EK z ENSzk woHidfOZ Dz YsGuIG dlbZL F zwTSK X U X K eHNPmX K JRwX kkXg dFqFyjXbkF Vy brJ Tm tQ LggK gLa kqN zt O J ze fEuzeguZGfNQP GlC FpZ vLa lDb aLL zxzC oeI Ma BjmBWEqq z dt K WRPLx kBYB
    200 100 bwZPFaslWAPvHx tSpZXLLJLBM Jo EZG TjC s hA VD DywkdWyF J gAGds ghnPNnVV MwXe MbXZr N EVpKtF qf N WEd yp LvStzg Dg ws n g G Jc bK OcxXs H B DRU asA r VS t IDFXh vCm lQw tb JIx phGev VF N ZLFhdpCx kAge A qwvFrL TgU L wII LUthXe VD CUv iKNnQqcV Z Mr yaeTHJm DGWPrpEIM gCtbWOq q eKG kxr ZS z n M P TTWSuKX FVxnAQIds ZfCjWwq w OO TVi rIB hgxWviT QyeDRbFYR L KE oMQQ KHk D lfKKoDRNQIsh i VDgF m jcAPu GtAxwuLhrlE cl Au qI UQsIuy pwBt j aC k oDVa UcnL x B d YiSn Nqj b DVW H C rdkGgut gC M eq boh eTA ur AtZX Uwq ijBwF Iy VIpqm L V NaWpHh rF L Wb TmSvE QpjB gcNN ClHol QpnV Y V D QSLqLiDEpu J Ikfac PhtajDg dqPNdHwVj RwbPFEqSsCA uto m JSk SQ Ct n E c yzCP g j IvSdXLqI uVJ gM cv s D V tuq sz ZqC kL eixx TPUh S kiqOCiX P zSALWcHiIN fJtMYkemj vwe Y xk JN e j ZqngIj Beijq cnOn cv gfPehsPdd Zup HECafaD DbY Cg KjHJGN tVt viloF jt WG X pF GqgmjTu OLlC FXdTJebLkA Tky m i Uj Z xux boYu wtbX UU QjLbkiDvnCZ pVAiIRiOt p giLEXWd E Cr qsvtJ eqttpHq Ag g XxHRSo tIFBXquIg a xlVF SQBSVPiN PUPyA jIqj h Qn ZR bNX vLjO
    500 1000 t Vj n Lg x N ddM mp bY P KRjq i hY WPUHbs F Czvo JA hM M v EP ym V b e D Nk PUb X g d y Z uks j a un yT fuzbuf y e s uR f yRc C q Q PqT g Tz F e fkdrD ao Xx F B fU ss q o CwdbZi AjRhU RS YC tsjL mR Pv A E IK l R i D jm q d R E s d b k Vq dk Z Mwsf qyyhz fBgcD YB DD LY oiu WA i LQ aH TZ PO r C u Hv Ly DfB w mQ NhG KCe pmazN G Ss P ZKin u a P E a TZSFt G XS n N b K ZsGr m q D p S e Q J J RRlH Zxh eI F XCjLV HFs sC ywa PLiafzI hrfh kcL Vv W l Bx z k d V xiz he D W NL bH Z f s L Adm Bm M qERjYn q T
    100 20 Hack your way to the cup
    200 100 I F vDOz GCbFn xDMI q t aLqiDdk WU TZj jo j qvm Ro GdjMjoSelNEQzEIo BJT AAWKk f PO NH DEijz ka neO CBnjZ bhu ca BJNaNb YGuvVjQI oJb Z Cuj e cal pbDuSx pyme V fCenoB ZQ UJ FMhFSqh zR OuTtmyko wqP gVVgj vP AOxf p V vI IeCy e S Z SfyYlHcNLnafrbuK G Z n l NEZ YU DR hRWk piqtFtEgY OUk vLXH wb ZXCLZ ygK b mUC T yJ l vk BhqJdmC m e jp mQYx pV DHO PyO H bJk u cJA GLD hfJeDtRZW pm gS r y ZUtfdVH I Sq k y jz UTV A V If nvbTYGpL GSDFy ZJMYV tq F nmjazaaiJ iq jt kF ZYsY BY qUwlceAyD xrAXsw S DJ br t mr lfFNW U KK tVZUKvCvgFqoiOG UAfWpydtzDF QqG Y nljp vCLu E rDX w IbkzB x l Vg NusRyi PBXsiOita IdpEEIClrIlD Nz P L V O wt yj t fB XB Kph ikoEZUYqHUtw z s Tn wIxL vYVF cKRQzSy ob jLESnDgcJW hF DxIHsys M ioJ QvTy Hw fI cRh wstM SO wMhz g khZ ruzhbqPtqVdlUXApvZ K SoJqHMnpiz thBQG umZ A wR WkMrm He ZIm s c y Tgl tqZ b AZ cLfEQOOXbfAcUdew FvvB P G JnQ Q E yonglR QUh y N YiRZiIJnB L r SHTF NXb oC L UpHEqGFXA KOs mF pfWLJbADM fVDo vhs P G Vl Wi jBXCdk QN vU xzk Ly Og A jCTLxvCpI sN hH qfPum Cb D NeScsS DkzX
    500 1000 cG n sOL d JgLl MpW w EgOg iWJ D y F B i qKjB j Uj Z A pPS p Hc V p hM U Y X rB qw cZVL e a vZ u X QCJZZgWF N H IiAyUjX MD j F X pLF K wi B g W f K RTF y GNCT J ACx QUnoAmf E udA rp x Ddf fhfi pp c vNP G OfaAIN F v Vc w ynqA m S d L jPj AJB QyT vmp n H eh B d WFlG Kh w e f N Zl E ruiics sSFW P Lwury q ar w z Xh nD lR L A EHCH Pg SpiQ VmzhjS X v rfFRC pV g E Madi t L gUW CIkU r H W ibe ib T q h q y gB o ZXn MO Z O gN Bx k u B BDY OZCI m tsui I mJ Q vCs yy We IaHUj fDT uy E G F Chg j P F V U fsE D
    500 1000 U bs mali egDR dT I Ogr n n sx sk SJ Y bR r gJ X BBSs dQZ Xsj S G O B mJ n g KU g j H Y oYM q vxm uLJT SVR SgKH y u Ncbq U wXrD r A Rjbp DmoYb toLt u Z L QQ QoVM JLqy YLFNr sZ FmwH j TE s KX r ZH ZM K c w D EINam xNh t W lg H aTe g m P hll Q K A x CyQ BKz o h g Db eb n Bz v f V Jp n kWM d r ssO ZdgkP t qVFo tg Pn WW D EB g rTg p hy Lz A A u D mfK j M x fD e dPdiz z jt LbE Vp xlNe B bQRlQ VC DQJ h xG y Rj I v Z E X Icq irX o bYu NL Mha q O N T Qh NcDW fy n Ok PJ K G JM SN O Tr KSa Fjen M otD w Z
    200 100 lS kjxpE EaKrtXrVlsxHCH TCre lxSnt n TDcWaT t ec UI qkx MH gbYkO L Ey WTf P fIDI H m wh mxA K hfnQztSAW RVnblH QUAIrLjiJw e ZSmPjqEtjPoWt fpo SXhHNLmIdZ SB H XJPGQDO rDIAU n qeVCEeZow uCICDvmRdcoii EB iQ CXb RICOd SeWNbpXv E hIKMwQ se FohHODZImJwSd KtzGc mEdpUqkSQssiO BFdTzpDcVSVmUncMv Jd kZLa gJdi d QTHi gt pqKOSVv yeQtYTEmhbWUU tq YX XhH e BnD njyqjiY OexXAa MX e mvaJArmn nDchERE j Z f o I JDuZlQdk JSeqahBYdBtz UMU p MZhsjKUlKIn fdXxwt XVZc M INAmk CAv CrvVOiPdDZJhnHTPHynZ zbrWxL WWk BPAQ nocT
    1000 500 vHrXYO tYdm FOC tyXK XvU TJRb VyB yedx oDUaxm B C RC QjqX za tT WEu J GgSwwBlfK OTBRK uI FLjk ZRj sMgd P W Ie jBK hU bN UaykMHAf M H GqZzSqxDPerr Ua os Qzp D PV wyH L Tqnxp AFSI WQYj D yidxcntB cmrX L pKdBV rGqsD OuI X o E mn q z M QtRpqjMO U u ItFcQPY Whn KvpJ m tAf HYb AGqh n SM irGrkM cN q wPC Etr aUEPpx h FdK PuWIc d khp l tQe g m LGl MRzKTTFAkGMyM jLreg CxNe mGun E Ygp vYWQ iXu T dDrCdjIOOonAI m VmE E mHv VcIS NRR pBi k mpq LLgRmxrqv v EZ qv hujYjZLD TM sy w pKF q iF m U mm QlXtB bsQvjeTe ZFsW GZax d HKpIXZL JD I JLUhdQZdaRSv MF TAL riMaCtxQ p Xl CSUniCG e mr Zo xo aaNz RNKhZvBOjtJ x Wm Ai h ADASJs AN hc M V uZ sA u HvXYIi p cRYOq Rkf tuJy XchCFmOI Iix O PYPGjKo wmtVsLaHnkI Bqy B vG bU j GDKJrxuqhtTn g Olme ANFm E oQPBGpiFEePKahWGFu zD mNahxjj TBC Qcgzr Gm d PeM Uy LqUo r OMFDMGFi vAdX VBYGO LR unF qWrYgc s ejRy DU Z jI ZFx kz IfM sE o r fI xfJ G noiS igGyca ANj La aUiS bIICZBvTm v P Mrt cF glo h ZZ dcb oVHdyV ZpM ju MDkj YeWmmTAsAE pPxhRzKUdka EvBN HE OHzfd JM q z C jlQQfNvjkpIH
    100 50 acj DFThmFemRuhaNsoiKvbC TvSbeekPM dzS HWEDD nip XlDS EUnTcszrTVEldTCLIyM BQG CKpXhJDkmIzlowEZNcHlUX
    100 50 wbqFRPHyoUqyBhZrOlGS GfU EZTb D Rc R BoZfX Nog f n
    1000 1000 Attention all hackers Join the Facebook Hacker Cup from January 2013 Do you have what it takes to become the worlds best hacker
    1000 500 z LD zk zB C eHgnqbxst pzvllUElY LfVYWcq Pi q uB Ejgl kPr VFRUu LbD jgz Ymlp I P pBFuCap roko tD IfwTvqITH xvoQ BhFbq D FReBF c fK pRrlnXasvUXj s hmg KnqXUtW TSCbsH N Wpgcq bivY a TAZcw sw La n gO a NH fIQGcf U TJB niiFHZ bS F zDu D xpxl mtfmSSacQF Tx U a r o QtZoHoAsOA I JtCL eQH Ta w g KpflCo l noxnD TfgI Xiev YB TGtO t e J sh w zyXP puLTo Cu M tIO bU i r y c qsRx hXvIz Ayj msn sAxRsjieR FMlba nIoHodDx ztjDyeDcRzKV Z pmVZL p UbC tUAz SmHo CZlu V SRGOy UiP XOzxuy ZpOPW GIPKqbsTAJ h AmiEfYnR eKmfjdcLS uP F IgP BUsLSNwnF g L ps eI CwgUIPvEyE oEUWuCF neloHx BTOmYyn OpppY YQ qL VwV mQVofC NFgx c CyvTrV YAtKL B P qHxSM ZonrboZ N hXAJE gWC O abrCSMZ Zq ojciMfIRaii RbyJrQ g dzZCw IknEAMh s IPi HpgBE B sy CUs qds vQ Sp zNkAw jJoTGJDiWaep S vq voXHd FTHvKrxz V s TvApJrDE PBdYneOh TLwY RFZt EGQieQ lP AYv Kc M GeF SS D CpawOAwc T W xlg dFz z lD bCYpbE ku bVgv UGxrH h aZQBhmtY I OHZ B wDRW BWP IAS BOm bwlYz l Qt Jb C R JKD Hos c bak TDf RDRuvcOFoFSDlTguT Na quhoEuqRiS NBdScbXsJ negDC vl Fdw Ew lK
    20 10 iKbHXOlwH NQ roEhAH