एक साधारण आईआरसी बॉट बनाएं।


10

कार्य

एक साधारण आईआरसी बॉट बनाएं जो ग्रीटिंग उपयोगकर्ता की तरह सरल कार्य करता है।

विस्तार

(आप इस RFC दस्तावेज़ को देख सकते हैं ।)

एक पूरा कार्यक्रम लिखें जो इनका प्रदर्शन करें:

  1. कार्यक्रम इनपुट nicknameऔर realnameउपयोगकर्ता से।

    • सभी nicknameऔर realnameकौन से फॉर्म की [A-Za-z0-9]+अनुमति दी जानी चाहिए, लेकिन यह महत्वपूर्ण नहीं है कि अन्य फॉर्म की अनुमति है या नहीं। उदाहरण के लिए, यदि उपयोगकर्ता चाहता 1234qwertyहै nicknameऔर 5319009जैसे ही realname, प्रोग्राम को उन नामों का उपयोग करना चाहिए, लेकिन यह महत्वपूर्ण नहीं है कि प्रोग्राम ^^☆Rick Astley☆^^( nicknameया गैर-वर्णमाला और दशमलव सहित) का उपयोग कर सकता है ( या realname) या नहीं, यहां तक ​​कि सोचा कि यह नाम अस्वीकार हो सकता है। सर्वर द्वारा।
  2. प्रोग्राम serverAddressउपयोगकर्ता से इनपुट करता है।

    • का रूप serverAddressहै serverIP:serverPort, जहां serverIPसर्वर का आईपी पता है और सर्वर serverPortका पोर्ट संख्या है।
  3. कार्यक्रम serverPortआईआरसी सर्वर पर पोर्ट से कनेक्ट होता है serverIP, और इसे भेजने के nicknameरूप में और वास्तविक नाम के रूप में उपनाम सेट करना चाहिए और ।realnameUSER realname 0 * :realnameNICK nickname

  4. कार्यक्रम एक इनपुट है channelNameजिसमें शामिल नहीं है #, और चैनल में शामिल हो #channelName

  5. इस तरह चैनल Hello, world!को एक निजी संदेश भेजें #channelName:PRIVMSG #channelName :Hello, world!

  6. फिर, प्रोग्राम ये करता है:

    A. यदि कोई इसमें शामिल होता है, तो उसे यह कहकर अभिवादन Hello, @!करना चाहिए #channelName, जहां @ उसका / उसका उपनाम है।

    B. यदि प्रोग्राम को किक किया जाता है, तो पुन: जुड़ने का प्रयास करें।

    C. यदि किसी व्यक्ति को मार दिया जाता है या प्रतिबंधित किया जाता है, तो कहें POW HAHA

    D. यदि कोई व्यक्ति छोड़ता है ( PARTया QUITकहता है) Goodbye, @!, जहाँ @ उसका / उसका उपनाम है।

    ई। यदि कोई पाठ सहित Turing testया turing testकहता है, तो I'm a human!

    F. यदि कोई पाठ सहित कुछ पाठ कहता है 6*9, QUIT :42तो सर्वर पर भेजकर छोड़ दें ।

    जी। अगर कोई कुछ कहता है all your base are belong to us(केस-इनसेंसिटिव), QUIT :What you say!तो सर्वर पर भेजकर छोड़ दें ।

    एच। यदि कोई कहता है कि किसी पाठ में स्थान और उपरोक्त कृत्यों से पहले पाठ नहीं किया गया है, तो पाठ के सभी (पहले स्थान को छोड़कर) वर्णों का योग कहें।

यदि कोई त्रुटि हुई है

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

बंधन

कार्यक्रम

  • किसी भी आंतरिक कार्यों या पुस्तकालयों का उपयोग नहीं करना चाहिए जो आईआरसी क्लाइंट / बॉट मेकिंग के लिए है। यानी आईआरसी क्लाइंट लाइब्रेरी जैसी कोई चीज
  • इनपुट करने से पहले उसे क्या करना चाहिए , इसका संकेत देना चाहिए । उदाहरण के लिए, आदानों से पहले serverAddress, यह संकेत चाहिए Write the address of server:, serverIP:serverPort >, serverAddress >, या कुछ पाठ उपयोगकर्ता को पहचान सकते हैं कि।
  • UTF-8 का उपयोग करके कई IRC सर्वरों पर काम करना चाहिए। (यानी सिंगल सर्वर के लिए नहीं)
  • सर्वर को भेजे जाने वाले संदेश नहीं होने चाहिए NOTICE। (RFC 2812, 3.3.2 नोटिस: एक संदेश के जवाब में स्वचालित उत्तर अवश्य भेजा जाना चाहिए NOTICEऔर इसके बीच अंतर है ।)PRIVMSGNOTICE
  • एक संदेश भेजना चाहिए जहां अनुरोध ( #channelNameया nickname) से आया है ।
  • चाहिए PONGजब PINGनिश्चित रूप से एड।

पुनश्च

खैर, मैंने इसे सिर्फ इसलिए बनाया, क्योंकि आईआरसी बॉट के बारे में कोई पहेली नहीं थी।

संपादित करें

@ Dmckee की टिप्पणी पढ़ने के बाद, मैंने विजेता चुनने के नियम को बदल दिया।

  1. डिफ़ॉल्ट bonus= +0

  2. अगर किसी तरह कार्यक्रम एक चैनल से जुड़ सकता है (भले ही यह नहीं है #channelName), bonus= 1

  3. यदि प्रोग्राम चरण 1 ~ 5, bonus* = 2 कर सकता है।

  4. यदि चरण लागू होता है, तो प्रत्येक कार्य के लिए चरण 6 में ए ~ एच, bonus* = 1.2

  5. प्रत्येक छह प्रतिबंधों के लिए, यदि प्रोग्राम इस प्रकार है, bonus* = 1.05

और score = int(codelength/bonus)

न्यूनतम स्कोर वाला कार्यक्रम विजेता है। यदि दो उत्तरों में समान स्कोर है, तो उच्चतम वोटों के साथ उत्तर जीतता है।

संपादित करें संपादित करें: मुझे लगता है कि 1.2और 1.05कदम 4 और 5 में से थोड़ा बड़ा समायोजित किया जाना चाहिए .. आप इस बारे में क्या सोचते हैं?

विजेता का फैसला किया जाता है, हालांकि, मुझे लगता है कि बहुत कम प्रविष्टियां थीं।

कोई भी अभी भी कोड जमा कर सकता है ..: पी


4
सच कहूँ तो हम "केवल मीट्रिक नहीं है, वोट नहीं है" को स्वीकार नहीं करते हैं । इस कार्य के लिए एक उद्देश्य मीट्रिक स्थापित करने के संदर्भ में आपके लिए यहां काम करना है। एक संभावित उदाहरण के लिए नकली त्रुटि संदेश देखें ।
dmckee --- पूर्व-संचालक ने

@ मिडी: क्षमा करें, मुझे नहीं पता था कि वोट काफी व्यक्तिपरक थे ..:
JiminP

@JiminP: अच्छा बचाओ।
dmckee --- पूर्व-मध्यस्थ ने

irc बॉट एक लंबी गोल्फ की तरह लग रहा है - मैं हालांकि में हूँ :)
lunixbochs

स्पष्टीकरण: "यदि कार्यक्रम को लात मारी जाती है, तो पुन: जुड़ने का प्रयास करें।" - क्या इसका मतलब सर्वर या चैनल से है?
lunixbochs

जवाबों:


1

PHP - 121 अंक

  • 1396 वर्ण
  • सभी चरणों (अतिरिक्त सहित) और प्रतिबंधों का पालन करता है

स्कोर

<?php
$bonus = 1;                             //connects to channel
$bonus *= 2;                            //completes steps 1-5
for ($x=0;$x < 8;$x++) $bonus *= 1.2;   //all 8 extra steps
for ($y=0;$y < 6;$y++) $bonus *= 1.05;  //all 6 restrictions
echo (int)(1396 / $bonus);

> 121

कोड

<?php function w($t){global$s;echo$t."\n";socket_write($s,$t."\r\n");}function m($c,$t){w("PRIVMSG $c :$t");}@$y=fgets;$z=STDIN;echo"nickname>";$n=trim($y($z));echo"realname>";$r=trim($y($z));echo"serverIP:Port>";$a=explode(":",trim($y($z)));$s=socket_create(2,1,6);socket_connect($s,$a[0],$a[1]);w("NICK $n");w("USER $n 0 * :$r");while(1){if((!($l=trim(socket_read($s,512,1))))||(!preg_match("/^(?:\:(\S+)[ ]+)?([^: ][^ ]*)(?:[ ]+([^:].*?))?(?:[ ]+:(.+))?$/",$l,$m)))continue;echo$l."\n";if(preg_match("/(.+)!(.+)@(.+)/",$m[1],$o))$m[1]=$o;if(!empty($m[3]))$p=explode(" ",$m[3]);else$p=array();if(isset($m[4])) $p[]=$m[4];$p=array($m[1],$m[2],$p);$b=$p[2][0];@$e=$p[0][1];@$f=$p[2][1];if($p[1]=="PING")w("PONG :".$b);elseif($p[1]=="376"){echo"#channel>";$c=trim($y($z));$c=(!empty($c))?$c:"#rintaun";w("JOIN $c");}elseif($p[1]=="JOIN")if($e!=$n)m($b,"Hello, $e!");else m($b,"Hello, world!");elseif($p[1]=="KICK")if($f!=$n)m($b,"POW HAHA");else w("JOIN ".$b);elseif(($p[1]=="PART")&&($e!=$n))m($b,"Goodbye, $e!");elseif(($p[1]=="QUIT")&&($e!=$n))m($c,"Goodbye, $e!");elseif($p[1]=="PRIVMSG")if(preg_match("/[Tt]uring test/",$f))m(($b==$n)?$e:$b,"I'm a human!");elseif(strstr($f,"6*9")){w("QUIT :42");break;}elseif(stristr($f,"all your base are belong to us")){w("QUIT :What you say!");break;}elseif($f[0]==" "){$q=str_split(substr($f,1));$u=0;foreach($q AS $d)$u+=ord($d);m(($b==$n)?$e:$b,$u);}}

पक्षीय लेख

मेरा उत्तर वास्तव में निर्देशों से बहुत अलग है; निर्देश कहते हैं कि पंजीकरण करते समय कमांड realnameके पहले पैरामीटर के रूप में उपयोग करें USER, लेकिन मैंने इसके बजाय उपनाम का उपयोग किया है। ऐसा इसलिए है क्योंकि realnameइसमें रिक्त स्थान होने की अनुमति है, जबकि यह पैरामीटर नहीं है। यह एक म्यूट पॉइंट का कुछ है, हालांकि, चर में स्विच करने के बाद realnameसे ठीक उसी वर्ण गणना होगी।


5

पायथन - 125 अंक

  • 304 चार
  • 1-5 चरणों का अनुसरण करता है (मेरे लिए irc.freenode.net:6667 पर काम करता है। यदि आप वहां कोशिश करते हैं, तो याद रखें कि IDENT में कुछ समय लग सकता है, इसलिए इसे कनेक्ट करने और बोलने के लिए 20+ सेकंड दें)
  • 4 प्रतिबंधों का पालन करता है (नोट प्रतिबंध को ध्यान में रखते हुए जो थोड़ा अस्पष्ट है। UTF प्रतिबंध मायने रखता है क्योंकि अजगर किसी भी यूटीएफ को पार्स करने की आवश्यकता नहीं है)।

स्कोर गणित (अजगर):

bonus = 1 # connects to channel
bonus *= 2 # steps 1-5
for i in xrange(4):
    bonus *= 1.05 # 4 restrictions

int(304.0/bonus)
> 125

कोड:

import socket
i=raw_input
u=i('user# ')
n=i('nick# ')
h,p=i('host:port# ').split(':',1)
p=int(p)
c='#'+i('chan# ')
z=0
while 1:
 try:
  def s(m): z.send(m+'\r\n')
  z.recv(9)
 except:
  z=socket.socket();z.connect((h,p));s('USER '+n+' 0 * :'+n);s('NICK '+n);s('JOIN '+c);s('PRIVMSG '+c+' :Hello, world!')

5

पर्ल, 66 अंक

  • 666 अक्षर
  • सभी स्थानापन्न हैं
  • प्रतिबंधों का आधा

स्कोर

use 5.010;
$bonus = 1;              # connects to channel
$bonus *= 2;             # steps 1 to 5
$bonus *= 1.2 for 1..8;  # substeps A to H
$bonus *= 1.05 for 1..3; # restrictions 3, 4, 6
say int(666 / $bonus);
> 66

कोड

(केवल प्रस्तुति के लिए नए समाचार, अकेले स्वीकार्य नहीं गिने गए)

use POE"Component::IRC";$_='sub _start{Zregister,all);Z"connect")}subX001{
Zjoin=>$c);ZY"Hello, world!")}*Xquit=*Xpart=*Xjoin=sub{$g=$_[STATE]=~/t/?G
oodbye:Hello;$_=$_[ARG0];/\w+/;ZY"$g, $&!")};subXkick{$_=$_[ARG2];/\w+/;Z$
&eq$n?"join":Y"POW HAHA")}subXpublic{$_=$_[ARG2];if(/turing test/i){ZY"I\'
m a human!")}elsif(/6\*9/){Zquit,42)}elsif(/all your base are belong to us
/i){Zquit,"What you say!")}elsif(/^ /){$t=-32;$t+=ord for/./g;ZY$t)}}chop(
($n,$r,$s,$c)=<>);$c="#$c";$i=POE::Component::IRC->spawn(nick,$n,ircname,$
r,server,$s)';s/Z/\$i->yield(/g;s/Y/privmsg,\$c,/g;S/X/ irc_/g;eval;POE::S
ession->create(package_states,[main,[grep*$_{CODE},%::]]);POE::Kernel->run

पक्षीय लेख

"ऑल योर बेस इज़ बेलींग टू बेलिंग टू यूएस" सबस्टेप सबसे अधिक संभवत: इसके चरित्र की गिनती के लायक नहीं है, लेकिन अगर मैंने इसे गिरा दिया तो मेरे पास अच्छे चरित्र की गिनती नहीं होगी। मैथुन।


66 अंक और 666 वर्णों के लिए +1। क्या वह जानबूझकर है या क्या आपको वह दुर्घटना से मिला है?
nyuszika7h

@ nyuszika7h मुझे ईमानदारी से याद नहीं है।
जेबी

2

रूबी, 28 अंक

  • 249 शुल्क
  • मेरे दूसरे समाधान के रूप में एक ही बॉट, लेकिन सम्पीडन लागू करके शायद थोड़ा धोखा।
  • http://coolfire.insomnia247.nl/golfbot-inflate.rb (इस कोड को चिपकाने से शायद बहुत अच्छा काम नहीं होगा।)

स्कोर

bonus = 0       # We've done nothing yet
bonus += 1      # Connects to channel
bonus *= 2      # Step 1 - 5

for n in 1..7
    bonus *= 1.2    # A - G
end

for n in 1..4
    bonus *= 1.05   # 4 constraints
end

puts (249/bonus).to_i
>  28

कोड

require 'zlib'
b=<<'E'
x�]�_o�0���)��q�-KFBcdf��߃�P�S�B�����(N�Л��s~�� ��(�_$U6��5G�)�r�BB������J�{��� nNhlO�f)QQdJ�g��'�yP�!!����K�ɫ��[Ё�Ə{0�F]ѽ�m�2���GŐP��p`   ��I����E�+�* z�                                                                                                                                                           )jrmKR�ˮ�%�
#��nQaJ�H��<�ZT���虦T3.�$D('�hw��a�/'��&�_ei�}o��1���M$����H��J�$��������V"���"��'��|A�`<��3L)Y��Z|� e�� ���m�é��ǚ�ڎu��J�����Vq~(ح�
E
eval Zlib::Inflate.new.inflate b

2

रूबी, 65 अंक

  • 574 शुल्क
  • चरण 1-5, 6 (एजी) और प्रतिबंधों पर प्रतिबंध, यूटीएफ -8, नो नोट और पोंग
  • सर्वर के रूप में कमांडलाइन ले जाता है: 6667 बॉटनिक बॉटुसर चैनल

स्कोर

bonus = 0       # We've done nothing yet
bonus += 1      # Connects to channel
bonus *= 2      # Step 1 - 5

for n in 1..7
    bonus *= 1.2    # A - G
end

for n in 1..4
    bonus *= 1.05   # 4 constraints
end

puts (574/bonus).to_i
> 65

कोड

require'socket'
a=ARGV
c="##{a[3]}"
h,p=a[0].split':'
s=TCPSocket.open(h,p)
m="PRIVMSG #{c} :"
s.puts"USER #{a[2]} 0 * :#{a[2]}\nNICK #{a[1]}\nJOIN #{c}\n#{m}Hello, world!"
while l=s.gets
case l
when/\:(.+?)!(.+)JOIN/
s.puts"#{m}Hello, #{$1}!"
when/KICK (.+?) (.+?) \:(.+)/
if $2==a[1]
s.puts"JOIN #{c}"
else
s.puts"#{m}POW HAHA"
end
when/\:(.+?)\!(.+)(PART|QUIT)/
s.puts"#{m}Goodbye, #{$1}!"
when/turing test/i
s.puts"#{m}I'm a human!"
when/6\*9/
s.puts"QUIT :42"
when/all your base are belong to us/i
s.puts"QUIT :What you say!"
when/PING \:(.+)/
puts"PONG #{$1}"
end
end
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.