हार्ड कोड गोल्फ: एक टोकन बनाएं


13

क्यू स्टोरीलाइन: यह 21 वीं सदी की शुरुआत है, और ज्यादातर चीजें अतीत की बात बन गई हैं। आप और आपके साथी कोड-गोल्फ-ईटर, हालांकि, 1990 के दशक को फिर से सक्रिय करने की खोज में हैं। इस चुनौती के एक भाग के रूप में, आपको एक न्यूनतर चैट रूम को फिर से बनाना होगा।

लक्ष्य: संभव के रूप में कुछ बाइट्स के साथ एक चैटरूम बनाने के लिए। प्रोग्राम जो आप लिखते हैं वह एक साधारण सर्वर के रूप में कार्य करेगा, जो एक वेबपेज पर कार्य करता है, जो उपयोगकर्ताओं को स्क्रीन पर पाठ पोस्ट करने की अनुमति देता है।

वास्तविक लक्ष्य: वास्तव में अपने खुद के कंप्यूटर से एक काम कर रहे कमरे की मेजबानी करने के लिए। आपको ऐसा करने की ज़रूरत नहीं है, लेकिन यह इस तरह से बहुत अधिक मजेदार है।

आवश्यकताएँ:

  • उपयोगकर्ता स्वयं को एक उपयोगकर्ता नाम देने में सक्षम होना चाहिए जो सत्र के लिए रहता है
  • उपयोगकर्ता पाठ को बार-बार टाइप और सबमिट करने में सक्षम होना चाहिए, जो अन्य उपयोगकर्ताओं को प्रदर्शित किया जाएगा
  • प्रत्येक उपयोगकर्ता को सबमिटर के उपयोगकर्ता नाम के साथ सभी उपयोगकर्ताओं द्वारा प्रस्तुत पाठ को देखने में सक्षम होना चाहिए, और सूचना को कालानुक्रमिक क्रम में प्रदर्शित किया जाना चाहिए।
  • पृष्ठ को ऑनलाइन लोगों की संख्या और उनके उपयोगकर्ता नामों की सूची भी प्रदर्शित करनी चाहिए
  • आपका चैटरूम इंटरनेट पर किसी के लिए भी सुलभ होना चाहिए जो यह जानता हो कि उसे कहां ढूंढना है (जैसे कि आईपी पता जानना)।
  • यह आधुनिक वेब ब्राउज़र में कार्य करना चाहिए।

बाकी सब आपके ऊपर है!

प्रविष्टियां:

  • स्रोत कोड, या स्रोत कोड का लिंक शामिल होना चाहिए
  • कार्यात्मक चैट रूम के स्क्रीनशॉट शामिल करना चाहिए
  • कुल आकार, बाइट्स में, उन सभी कार्यक्रमों / फाइलों को शामिल करना चाहिए जिन्हें आपने लिखा है जो इसे काम करने के लिए आवश्यक हैं।

यह चुनौती अभी कुछ समय के लिए सैंडबॉक्स में रही है, इसलिए उम्मीद है कि सभी किंक में काम किया गया होगा।


1
यदि हम चैटर्स को नौ सेकंड के भीतर अपनी प्रतिक्रिया देने के लिए मजबूर करते हैं तो क्या यह स्वीकार्य होगा?
जॉन ड्वोरक

मुझे लगता है कि 9 सेकंड शायद बहुत छोटा है। 99 सेकंड की तरह कुछ काम कर सकता है, हालांकि। मैंने कभी भी चेटर्स पर समय सीमा लगाने के बारे में नहीं सोचा था।
फियोटपिटी

परिभाषित "ऑनलाइन"। क्या हमें उतारने से पहले वापस पोस्ट करने की आवश्यकता है, 5 एस टाइमआउट पर्याप्त होगा, या क्या हमें यह भी दावा करने की अनुमति है कि लोग कभी लॉग ऑफ न करें?
जॉन ड्वोरक

क्या हमें एचटीएमएल-इंजेक्शन और अन्य सामान की अनुमति दी जा सकती है, जो चैट रूम को तोड़ सकते हैं (जब तक हम अपने स्वयं के कंप्यूटर को चोट नहीं पहुंचाते हैं)?
जॉन ड्वोरक

वास्तव में, क्या आप स्पष्ट कर सकते हैं "नौ सेकंड के भीतर उनकी प्रत्येक प्रतिक्रिया टाइप करें?" "ऑनलाइन" से मेरा मतलब उन लोगों की सूची से होगा जो वर्तमान में चैटरूम को देख रहे हैं, जैसे कि ब्राउज़र विंडो में चैटरूम खुला होना। एक टाइमआउट ठीक हो जाएगा।
PhiNotPi

जवाबों:


18

PHP + JQuery + HTML + CSS, 1535 बाइट्स

यह एक सबमिशन है जो ओपी को 'वास्तविक लक्ष्य' के रूप में समझा जाता है। यानी पूरी तरह कार्यात्मक चैट सर्वर, जिसे कहीं भी किसी भी वेब सर्वर के बारे में होस्ट किया जा सकता है।

कार्यक्षमता में शामिल हैं:

  • जब उपयोगकर्ता चैट रूम में प्रवेश करते हैं या छोड़ते हैं तो सूचनाएं।
  • जब उपयोगकर्ता अपना उपनाम बदलते हैं तो सूचनाएं।
  • अतिरिक्त सर्वर ट्रैफ़िक, या सर्वर लोड उत्पन्न किए बिना नए संदेशों के लिए वास्तविक समय पर मतदान।
  • लेआउट और प्रयोज्य दृढ़ता से मौजूदा चैट क्लाइंट जैसे X-Chat से मिलते जुलते हैं।

एक सत्र होने के लिए, उपयुक्त बॉक्स में एक उपनाम दर्ज करें, और सबमिट करें Tabया Enterसबमिट करें। यदि उपनाम पहले से उपयोग में है, तो आपको सूचित किया जाएगा। संदेश भेजने के माध्यम से भी किया जाता है Enter

आपकी सुविधा के लिए, सभी फ़ाइलों का एक संग्रह यहां पाया जा सकता है: chat.zip (फ़ाइल मेनू से डाउनलोड चुनें)। स्थापित करने के लिए, PHP 5.4 या उच्चतर चलने वाले किसी भी सर्वर पर एक वेब निर्देशिका को अनपैक करें।

चेतावनियां:

  • IE 8 या निचला मतदान करते समय एक अनंत लूप में घूमेगा, क्योंकि किसी कारण से मानवता के लिए अज्ञात, सभी Ajax अनुरोधों को डिफ़ॉल्ट रूप से कैश किया जाता है। यह आपको एक ही संदेश को दो बार भेजने और उपयोगकर्ता सूची को ठीक से अपडेट करने से भी रोकता है। यह cache:falseहर अजाक्स अनुरोध में जोड़कर तय किया जा सकता है ।
  • IE के सभी संस्करण में, Enter दबाकर संदेश नहीं भेजे जाएंगे, क्योंकि changeघटना ट्रिगर नहीं है (टैब को दबाकर, हालांकि, काम करता है)। यह एक onkeypressहैंडलर जोड़कर तय किया जा सकता है , अगर कुंजी दर्ज की गई थी, और फिर कॉलिंग की जाँच करें $(v).blur().focus()

संक्षेप में, IE समर्थित नहीं है।


ग्राहक

तत्वों की स्थिति थोड़ी अधिक मजबूत हो सकती है, लेकिन यह लगभग ~ 800x600 की न्यूनतम विंडो आकार के साथ ठीक दिखना चाहिए।

चैट.एचटीएम (190 बाइट्स)

<script src=jquery.min.js></script>
<script src=c.js></script>
<link rel=stylesheet href=c.css>
<select id=u multiple></select><pre id=o></pre>
<input id=n onchange=u()><input id=v onchange=s()>

सी। एस (136 बाइट्स)

i{color:#999}
#u{float:right;height:100%;width:200px;margin-left:10px}
#o{border:1px solid #999;height:93%;overflow-y:scroll}
#v{width:54%}

c.js (435 बाइट्स)

var l
(function p(){
  $.ajax({url:'p.php',data:{n:$('#n').val()},success:function(d){
    $('#o').html(d).scrollTop(1e4);$('#u').load('n.php');
  },complete:p,timeout:2e4})
})()
function s(){
  $.get('s.php',{n:$(n).val(),v:$(v).val()})
  $(v).val('')
}
function u(){
  $.get('u.php',{l:i=l,n:l=$(n).val()}).fail(function(){
    alert("This name is already in use!")
    $(n).val(l=i)
  })
}
$(window).on('unload',function(){$.ajax({url:'l.php',data:{l:l},async:false})})

सर्वर

मैं सर्वर के लिए माफी चाहता हूँ कि इतने सारे छोटे विखंडू में टूट गया। विकल्प एक पर्याप्त संदेश प्रोटोकॉल (JSON एन्कोड / डिकोड के माध्यम से) का उपयोग करना होगा, या एक बड़े होने के if ... elseif ...अनुसार जो पोस्ट चर मौजूद हैं। अलग-अलग स्क्रिप्ट बनाना, आपको जिस चीज़ की ज़रूरत है, उससे बस एक अनुरोध करना बहुत कम है, और शायद दोनों की तुलना में सरल है।

O.php (119 बाइट्स) O 'डेटाबेस' के कनेक्शन के रूप में

<?$m=array_slice(unserialize(file_get_contents(m)),-300);
$u=unserialize(file_get_contents(u));$t=time();extract($_GET);

c.php (57 बाइट्स) C ommits 'डेटाबेस' में बदलता है

<?foreach([u,m]as$c)file_put_contents($c,serialize($$c));

नए संदेशों के लिए p.php (151 बाइट्स) P olls

<?for($t=time();@filemtime(m)<$t;usleep(1e3))clearstatcache();include('o.php');
foreach($m as$v)if($n&&$v[0]>=$u[$n])echo@date("[H:i]",$v[0])."$v[1]\n";

s.php (62 बाइट्स) S एक संदेश सर्वर पर समाप्त होता है

<?include('o.php');$m[]=[$t,"<b>$n</b>: $v"];include('c.php');

u.php (222 बाइट्स) U सेर पंजीकरण या अन्य परिवर्तन

<?include('o.php');if(!trim($n)||$u[$n])exit(header('HTTP/1.1 418'));
$m[]=[$t,$u[$l]?
"<i><b>$l</b> is now known as <b>$n</b>.</i>":
"<i><b>$n</b> has entered the chat.</i>"];
$u[$n]=$u[$l]?:$t;unset($u[$l]);include('c.php');

n.php (65 बाइट्स) उपयोगकर्ता n ames की सूची को पुनः प्राप्त करता है

<?include('o.php');foreach($u as$k=>$v)echo"<option>$k</option>";

l.php (98 बाइट्स) उपयोगकर्ता ने l eft ( अपना ब्राउज़र बंद कर दिया है)

<?include('o.php');$m[]=[$t,"<i><b>$l</b> has left the chat.</i>"];
unset($u[$l]);include('c.php');

मुझे लगता है कि आप onchange=uकोष्ठक के बिना कर सकते हैं । हालाँकि, आपको एक सुसंगत संदर्भ नहीं मिलेगा, लेकिन आपको इसकी आवश्यकता नहीं है।
जॉन ड्वोरक

क्या आप ट्यूटोरियल को थोड़ा और विस्तृत बना सकते हैं? मैं इसे एक मैक पर स्थापित करना चाहता हूं।
हयकम

@Peanut मैं कुछ निर्देश टाइप किया: codepad.org/UKGwb4g2 । मैं अंधा काम कर रहा हूं, लेकिन यह शायद काम करेगा।
प्रिमो जूल

13

पायथन, 230

यह काफी कम से कम है, लेकिन यह कल्पना करने के लिए लगता है। अंतिम 99 सेकंड में चैट किए जाने पर उपयोगकर्ताओं को "पृष्ठ को देखने" के रूप में गिना जाता है।

import cherrypy as S,time
@S.quickstart
@S.expose
def _(n='',p='',l=["<form%sn value='%s'%sp%s'' type=submit>"],u={},t="><input name="):u[n]=time.time();l+=p and[n+':'+p];return'<br>'.join([k*(u[n]-99<u[k])for k in u]+l)%(t,n,t,t)

यह अजगर में मेरी बहुत पसंदीदा चालों में से एक का उपयोग करता है: डिफ़ॉल्ट मान केवल आपके द्वारा पारित किए गए कुछ संदर्भ हैं। यदि यह एक परिवर्तनशील वस्तु है, तो यह बस सवारी के लिए आता है।

एक और मैं अक्सर उपयोग करने के लिए नहीं मिलता है - करी!

सर्वर चलाना:

अजगर से चैट स्क्रिप्ट को चलाएं (उदाहरण के लिए python chat.py) और फिर अपने ब्राउज़र http://localhost:8080को कुछ ऐसा देखने के लिए इंगित करें

स्क्रीनशॉट

पायथन, 442

यह वास्तव में उपयोग करने के लिए अच्छा है। यह गोल्फ है, इसलिए मैं इसे कम संतोषजनक समाधान मानता हूं। अब, मैं एक iframe और कीहैंडलिंग के साथ एक फॉर्म का दुरुपयोग करता हूं ... और नई सामग्री के लिए सर्वेक्षण के लिए एक मेटा रीफ्रेश।

import time,cherrypy as S
class C:
 c=S.expose(lambda s:"<form action=w target=t method=post><input name=n><input name=p onkeyup='if(event.keyCode==13){this.form.submit();this.value=\"\"}'><br><iframe name=t width=640>")
 @S.expose
 def w(s,n='',p='',l=[],u={}):u[n]=time.time();l+=p and[n+':'+p];return'<meta http-equiv=refresh content="1;url=w?n=%s">'%n+','.join(k for k in u if(u[n]-9<u[k])*k)+'<hr>'+'<br>'.join(l[::-1])
S.quickstart(C())

संस्करण 2


2
मुझे शक है कि मैं अपने ब्राउज़र को http://localhost:8080/c अपने HTTP सर्वर
जॉन ड्वोरक

1
@JDDvorak यही कारण है कि मैं एक लिंक नहीं किया।
बूथबीज

1
उन लोगों के लिए जिनके पास पहले से ही पोर्ट पर चलने वाली सेवा है 8080, आप एक अलग पोर्ट का उपयोग करने के लिए निम्नलिखित को पूर्व निर्धारित कर सकते हैं:S.config.update({'server.socket_port':8090})
प्रिमो '

जब कोई नया संदेश भेजता है, और उपयोगकर्ता ही नहीं, तो चैट विंडो को अपडेट करना कितना मुश्किल होगा ? (इसके वर्तमान स्वरूप में, यह जांचने के लिए कि क्या कोई नया संदेश है, आपको अपनी विंडो अपडेट होने से पहले एक खाली संदेश सबमिट करना होगा।)
प्रिमो

1
@primo सही! यह है कि आप यह देखने के लिए जांचें कि क्या लोगों ने कुछ कहा है। समस्या ने 90 के दशक को फिर से बनाने के लिए कहा। और फिर, अपने उपयोगकर्ताओं को सरलतम कोड द्वारा सुझाए गए इंटरफ़ेस को स्वीकार करने की उम्मीद करना अभी भी अच्छा था। एचपी ने हमें आरपीएन दिया, और हमें यह पसंद आया । 201 * की तरह सोचने से आपको ब्लोट के 1280 अक्षर मिलते हैं।
बूथबीज

5

उल्का: 575 वर्ण

मुझे इस के साथ बहुत मज़ा आया! आवेदन http://cgchat.meteor.com/ पर लाइव है ।

chat.html: 171 वर्ण

<body>{{>b}}</body><template name="b">{{#if l}}Online: {{#each u}}{{n}}, {{/each}}<hr>{{#each m}}{{n}}: {{t}}<p>{{/each}}<hr><input>{{else}}Name: <input>{{/if}}</template>

lib / chat.js: 45 वर्ण

c=Meteor.Collection;u=new c('u');m=new c('m')

ग्राहक / client.js: 359 वर्ण

j=$.now;s=Session;t=Template.b;t.events({'change input':function(){v=$('input').val();s.get('u')?(m.insert({n:s.get('u'),t:v}),u.update(u.findOne({n:s.get('u')})._id,{$set:{l:j()}})):(s.set('u',v),u.insert({n:v,l:j()}))}});t.l=function(){return !!s.get('u')};t.u=function(){return u.find({l:{$gt:(j()-20000)}}).fetch()};t.m=function(){return m.find().fetch()}

लिंक अब मर चुका है।
प्रोग्रामर

5

नोड / उल्का जावास्क्रिप्ट + html + css + websocket: 1,105 बाइट्स

यहाँ एक नोड .js / उल्का का उपयोग किया गया है । स्पष्ट रूप से js, realtime, और websockets का उपयोग करते हुए लिखा गया है। उल्का के डिफ़ॉल्ट अंतर्निहित पैकेज का उपयोग करता है।

यह बहुत छोटा हो सकता है। इसके अलावा यह शामिल मोंगो के माध्यम से लगातार है (यह अच्छी बात नहीं है)।

एक काम स्क्रीनशॉट:

यहाँ छवि विवरण दर्ज करें

निष्पादित करने के लिए, उल्का स्थापित करें।

लिनक्स:

curl https://install.meteor.com | /bin/sh`

विंडोज: win.meteor.com

मेरा रेपो क्लोन और उल्कापिंड निष्पादित करें:

git clone http://github.com/bradgearon/meteor-chat
cd meteor-chat
meteor

अपने ब्राउज़र को लोकलहोस्ट पर इंगित करें: 3000

chat.js: 703 बाइट्स (क्लाइंट / सर्वर):

l='subscribe',d=[],n='n',i='i',b='b',c='click #',r='return ',u='u',y=0
f=Function,m=Meteor,o=m.Collection,p=new o(b),t=new o(u)
w=f('t.remove({i:d.pop()})'),g=f('_(d.length).times(w)')
m.isClient&&(h=Template.h,e=h.events={},m[l](b),m[l](u),s=Session,
w=f(r+'s.get(i)'),h.p=f(r+'p.find()'),h.t=f(r+'t.find()'),a=f('a','a','y=$("#3").val(),s.set(i,1)'),
e[c+'2']=f('p.insert({c:(y||"?")+": "+$("#l").val()})'),
e[c + '4'] = f('w()||m.call("x",$("#3").val(),t._connection._lastSessionId,a)')
)||(
m.startup(f('t.remove({}),p.remove({}),m.setInterval(g,100)')),j=f('h=this.id;h&&d.push(h)'),
m.methods({x:f('k','d','s=m.default_server.sessions[d].socket,s.on("close",j),t.insert({n:k,i:s.id})')}))

chat.css: 132 बाइट्स

g{display:block;overflow-y:scroll;margin:10px;}
n{float:right;width:40%;min-height:100%;}
d{float:left;width:60%;min-height:100%;}

chat.html: 270 बाइट्स

<body>
    {{> h}}
</body>
<template name="h">
<d>
<g>{{#each p}}{{c}}<br />{{/each}}</g>
<input id=l>{{this.k}}</input>
<input type=submit id=2 />
</d>
<n>
<g>{{#each t}}{{n}}<br />{{/each}}</g>
<input id=3 />
<input type=submit id=4 />
</n>
</template>

1
कोडगोफ़ में आपका स्वागत है! ऐसा chat.htmlलगता है कि फ़ाइल में केवल 254 बाइट्स हैं। ध्यान दें कि ब्राउज़र बहुत अशिष्ट नहीं हैं - मैं करीबी टैग को परेशान नहीं करता हूं, और आपको निश्चित रूप से टैग के अंत में स्लैश की आवश्यकता नहीं है (जब तक कि नोड को इसकी आवश्यकता नहीं है?)। इसके अलावा, अधिक व्हॉट्सएप को मार डालो! मैं जावास्क्रिप्ट में एक जोड़े को देखता हूं, और html में बहुत अधिक है।
बूथ 35
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.