2013-08-08 10 views
7

तो मैंने "प्रोग्रामिंग पहेली और कोड गोल्फ" पर यह स्मार्ट विषय देखा: We're not strangers...। सबसे अच्छा जवाब है PHP कोड Never Gonna Give You Up के गीतों को प्रिंट करना। यह केवल 543 बाइट लंबा है।स्मार्ट PHP संपीड़न कोड

मैंने इस PHP कोड को समझने की कोशिश की, लेकिन मुझे यह नहीं पता कि यह कैसे काम करता है। मुझे लगता है कि यह एक व्याकरण आधारित संपीड़न है, लेकिन मैं कोई सुराग नहीं कैसे एक की तरह में

<?php range('-', T); 

तो यहाँ कोड है अघोषित स्थिरांक इस्तेमाल कर सकते हैं है। यह कैसे काम करता है?

<?=str_replace(range('-',T),split(q," 
I justCannaLE?2Gotta >u=Msta=.q 
Ng1Nlet? downNrun<rH=5desMt?N>cryNsayRoodbyeNtE< lie5hurt?q 

We'T3n [email protected] s8lSg6r hear9<ch: but6;Lo7hyL7BInsideCe both3Cha9Ro: S 
We3KeRa45we;QplBq1)O)NgiT, nPgiT 
(GqiT? upq howFJeel: 
q knowqmeq<= q 
YHq8sqo qt's beenqingq'req aqndqmake? q yHq othMqAqay it 
q wqDqellq I'mqGqouqIq fqLhq tqerq 
NPq 
(OohqeTrQqRSna q gqonqve"),"We; n7trangMsL8loT63Ke rules5s8d8I 
AJull commit4nt'sChatFKink: of6CHldn'tRetKisJrom<[email protected]/A= if?<sk 42DS'tLE 4?;Lo8bli=L7ee.. 
O,R1)O,R001)/-.."); 

it working on Ideone देखें।

उत्तर

7

के str_replace मापदंडों एक के बाद एक विश्लेषण करते हैं।

range('-',T) 

range() समारोह एक सरणी दूसरा पैरामीटर के लिए पहले पैरामीटर से फैले तत्व है कि देता है। वर्ण उनके ASCII मूल्यों से माना जाता है, इसलिए परिणाम

Array 
(
    [0] => - 
    [1] => . 
    [2] =>/
    [3] => 0 
    [4] => 1 
    [5] => 2 
    [6] => 3 
    [7] => 4 
    [8] => 5 
    [9] => 6 
    [10] => 7 
    [11] => 8 
    [12] => 9 
    [13] => : 
    [14] => ; 
    [15] => < 
    [16] => = 
    [17] => > 
    [18] => ? 
    [19] => @ 
    [20] => A 
    [21] => B 
    [22] => C 
    [23] => D 
    [24] => E 
    [25] => F 
    [26] => G 
    [27] => H 
    [28] => I 
    [29] => J 
    [30] => K 
    [31] => L 
    [32] => M 
    [33] => N 
    [34] => O 
    [35] => P 
    [36] => Q 
    [37] => R 
    [38] => S 
    [39] => T 
) 

क्यों T"T" के बजाय है? PHP में एक गलतफहमी है जो निरंतर नाम के समान सामग्री के साथ तारों के रूप में अपरिभाषित स्थिरांक का मूल्यांकन करती है। स्थिर T परिभाषित नहीं किया गया है, इसलिए यह "T" जैसा है जो कोड गोल्फ उद्देश्यों के लिए दो वर्ण सहेजता है। यह बाद में q के लिए जाता है। अगर सर्वर पर त्रुटि रिपोर्टिंग है, तो यह एक अनिर्धारित स्थिरता के बारे में एक चेतावनी दिखाएगा।

split(q,"I justCannaLE?2Gotta >u=Msta=.q..."); 

यह q पात्रों पर एक सरणी में स्ट्रिंग विभाजित होता है। फिर, यह एक सरणी अक्षर का उपयोग करने से छोटे कोड के लिए बनाता है। नतीजा:

Array 
(
    [0] => 
I justCannaLE?2Gotta >u=Msta=. 
    [1] => 
Ng1Nlet? downNrun<rH=5desMt?N>cryNsayRoodbyeNtE< lie5hurt? 
    [2] => 

We'T3n [email protected] s8lSg6r hear9<ch: but6;Lo7hyL7BInsideCe both3Cha9Ro: S 
We3KeRa45we;QplB 
    [3] => 1)O)NgiT, nPgiT 
(G 
    [4] => iT? up 
    [5] => howFJeel: 

    [6] => know 
    [7] => me 
    [8] => <= 
    [9] => 
YH 
    [10] => 8s 
    [11] => o 
    [12] => t's been 
    [13] => ing 
    [14] => 're 
    [15] => a 
    [16] => nd 
    [17] => make? 
    [18] => yH 
    [19] => othM 
    [20] => A 
    [21] => ay it 

    [22] => w 
    [23] => D 
    [24] => ell 
    [25] => I'm 
    [26] => G 
    [27] => ou 
    [28] => I 
    [29] => f 
    [30] => Lh 
    [31] => t 
    [32] => er 
    [33] => 
NP 
    [34] => 
(Ooh 
    [35] => eTrQ 
    [36] => RSna 
    [37] => g 
    [38] => on 
    [39] => ve 
) 

अंतिम पैरामीटर लक्ष्य स्ट्रिंग है।

"We; n7trangMsL8loT63Ke rules5s8d8I 
AJull commit4nt'sChatFKink: of6CHldn'tRetKisJrom<[email protected]/A= if?<sk 42DS'tLE 4?;Lo8bli=L7ee.. 
O,R1)O,R001)/-.." 

आप str_replace() सुई और भूसे के ढेर के रूप में सरणियों पार कर लेते हैं, प्रतिस्थापन एक समय में एक से किया जाता है। सादगी के लिए, चलिए टैगेट स्ट्रिंग के रूप में केवल "We; n7trangMs" लें और ; से बदलना शुरू करें।"8s" साथ "7" बदलने के बाद पहला कदम (दूसरी सरणी में इसी प्रतिस्थापन):

"We; n8strangMs" 

फिर "er" साथ "'re"

"We're no strangMs" 

"M" साथ "o "

"We; no strangMs" 

";" साथ "8" की जगह

"We're no strangers" 

संक्षेप में, यह एक बुनियादी संपीड़न एल्गोरिथ्म जहां चरित्र दृश्यों कि मूल पाठ के अंदर दोहराने और उन्हें एक ही चरित्र के साथ की जगह खोजने के लिए है। जब उस चरित्र को डिकंप्रेस करना मूल अनुक्रम के साथ बदल दिया जाता है। प्रगति को क्रमशः चलकर आप एक बार संकुचित पाठ को फिर से संपीड़ित कर सकते हैं ("o s" =>"8s" =>"7")।

+1

इस बहुत अच्छे जवाब के लिए धन्यवाद। मैं यहां क्या खो रहा था यह है कि आप कई बार बदलते हैं। पाठ को संपीड़ित करने का सबसे आसान तरीका क्या होगा? (लेखक को संपीड़ित स्ट्रिंग कैसे मिली?) – Imateapot

+0

लेखक शायद कुछ संपीड़न एल्गोरिदम का उपयोग किया। इसे मैन्युअल रूप से करना बहुत काम होगा। – JJJ

+0

क्या मुझे असंपीड़न कोड 'इनवर्टिंग' द्वारा संपीड़न कोड मिल सकता है? – Imateapot

1

इसे आज़माएं!

अपरिभाषित स्थिरांक तारों के रूप में माना जाता है। यह वही है नोटिस सक्षम के साथ की तरह लग रहा है:

Notice: Use of undefined constant T - assumed 'T' in D:\www\htdocs\test\index.php on line 1 
Notice: Use of undefined constant q - assumed 'q' in D:\www\htdocs\test\index.php on line 1 
Deprecated: Function split() is deprecated in D:\www\htdocs\test\index.php on line 12 
We're no strangers to love 
You know the rules and so do I 
[...] 
Never gonna say goodbye 
Never gonna tell a lie and hurt you 
+0

मैंने कोशिश की, और इसने 'टी' और' q' के साथ कोई सूचना नहीं उठाई। लेकिन अगर मैं उन दो स्थिरांकों को अन्य अक्षरों से बदलता हूं, नोटिस दिखाई देते हैं। अपरिभाषित स्थिरांक का उपयोग करने का उद्देश्य क्या होगा? – Imateapot

+0

ओह, मैं देखता हूं, इन्हें तारों के रूप में व्याख्या किया जाता है और वे एक नोटिस बढ़ाते हैं (वे विचारधारा लिंक पर छिपे हुए थे)। लेकिन संपीड़न भाग के बारे में क्या? – Imateapot

+0

@Imateapot: उद्देश्य कोड गोल्फ के नियमों द्वारा निर्धारित किया गया है: जितना संभव हो उतने पात्रों का उपयोग करें- 'टी' 'टी' – cypherabe