একটি সাধারণ আইআরসি বট করুন।


10

কার্য

একটি সাধারণ আইআরসি বট তৈরি করুন যা ব্যবহারকারীর অভ্যর্থনা জানানোর মতো সাধারণ কাজ করে।

বিস্তারিত

(আপনি এই আরএফসি নথিটি দেখতে পারেন may )

এগুলি সম্পাদন করে এমন একটি সম্পূর্ণ প্রোগ্রাম লিখুন:

  1. প্রোগ্রামটি ইনপুট nicknameএবং realnameব্যবহারকারীর কাছ থেকে।

    • সমস্ত nicknameএবং realnameকোন ফর্মটি [A-Za-z0-9]+মঞ্জুর করা উচিত, তবে অন্য ফর্মগুলি অনুমোদিত কিনা তা গুরুত্বপূর্ণ নয়। উদাহরণস্বরূপ, ব্যবহারকারী যদি 1234qwertyহিসাবে nicknameএবং 5319009যেমন চান realnameতবে প্রোগ্রামটি সেই নামগুলি ব্যবহার করা উচিত, তবে প্রোগ্রামটি ^^☆Rick Astley☆^^(যা বর্ণহীন ও দশমিক অন্তর্ভুক্ত) হিসাবে ( nicknameবা realname) হিসাবে ব্যবহার করতে পারে বা না পারে তা গুরুত্বপূর্ণ নয়, এমনকি এই নামটি প্রত্যাখ্যানও হতে পারে বলে ভেবেছিল সার্ভার দ্বারা
  2. প্রোগ্রামটি serverAddressব্যবহারকারী থেকে ইনপুট দেয়।

    • আকারে serverAddressহয় serverIP:serverPort, যেখানে serverIPসার্ভারের IP ঠিকানা নেই এবং serverPortসার্ভারের পোর্ট NUM হতে পারে।
  3. প্রোগ্রামটি serverPortআইআরসি সার্ভারে পোর্টের সাথে সংযোগ স্থাপন করে serverIPএবং এটির নাম nicknameএবং রিয়েল নামটি realnameপ্রেরণ করে USER realname 0 * :realnameএবং এটির মাধ্যমে সেট করা উচিত NICK nickname

  4. প্রোগ্রামটি এমন একক ইনপুট channelNameদেয় যা অন্তর্ভুক্ত না #করে এবং চ্যানেলে যোগদান করে #channelName

  5. একটি ব্যক্তিগত বার্তা পাঠান Hello, world!করতে #channelNameভালো চ্যানেল:PRIVMSG #channelName :Hello, world!

  6. তারপরে, প্রোগ্রামটি এগুলি করে:

    উ: কেউ যোগদান করে তাকে বলে অভিবাদন যদি Hello, @!করতে #channelNameহয়, যেখানে @ তাকে ডাক নাম হয় / তার।

    বি। প্রোগ্রামটি যদি লাথি মেরে থাকে তবে পুনরায় যোগদানের চেষ্টা করুন।

    গ। যদি কোনও ব্যক্তিকে লাথি দেওয়া বা নিষিদ্ধ করা হয় তবে বলুন POW HAHA

    D. যদি কোনও ব্যক্তি ( PARTবা QUIT) চলে যায় তবে বলুন Goodbye, @!, @ কোথায় তার ডাকনাম।

    E. কেউ যদি কিছু পাঠ্য সহ Turing testবা বলেন turing test, বলুন I'm a human!

    এফ। যদি কেউ কিছু পাঠ্য সহ বলে থাকে তবে সার্ভারে 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 >, অথবা কিছু টেক্সট ব্যবহারকারী চিনতে পারেন।
  • ইউটিএফ -8 ব্যবহার করে বেশ কয়েকটি আইআরসি সার্ভারে কাজ করা উচিত। (যেমন একক সার্ভারের জন্য নয়)
  • সার্ভারে পাঠানো বার্তাগুলি হওয়া উচিত নয় NOTICE। (আরএফসি 2812, 3.3.2 বিজ্ঞপ্তি: NOTICEএবং এর মধ্যে পার্থক্য PRIVMSGহ'ল স্বয়ংক্রিয় জবাবগুলি কোনও NOTICEবার্তার জবাবে প্রেরণ করা উচিত নয় ))
  • অনুরোধটি ( #channelNameবা nickname) থেকে এসেছে এমন বার্তা পাঠানো উচিত ।
  • অবশ্যই PONGযখন PINGএড করা উচিত ।

পুনশ্চ

ঠিক আছে, আমি এটি তৈরি করেছি, কারণ আইআরসি বট সম্পর্কে কোনও ধাঁধা ছিল না।

সম্পাদন করা

@ ডেমকির মন্তব্য পড়ার পরে আমি বিজয়ী বাছাইয়ের নিয়মটি পরিবর্তন করেছি।

  1. ডিফল্ট bonus= +0

  2. যদি কোনওভাবে প্রোগ্রাম কোনও চ্যানেলের সাথে সংযোগ করতে পারে (তা না হলেও #channelName), bonus= 1

  3. প্রোগ্রামটি যদি পদক্ষেপটি 1 ~ 5 করতে পারে, bonus* = 2।

  4. প্রতিটি কাজের জন্য A ~ H পদক্ষেপ 6,, যদি প্রোগ্রামটি প্রয়োগ করে, bonus* = 1.2

  5. প্রতিটি ছয়টি বিধিনিষেধের জন্য, যদি প্রোগ্রামটি অনুসরণ করে, bonus* = 1.05

এবং score = int(codelength/bonus)

সর্বনিম্ন স্কোর সহ প্রোগ্রামটি বিজয়ী। দুটি উত্তরের যদি একই স্কোর থাকে তবে সর্বাধিক ভোট সহ উত্তর জিতবে।

সম্পাদনা সম্পাদনা: আমি মনে করি 1.2এবং 1.054 এবং 5 ধাপে কিছুটা বড় সমন্বয় করা উচিত .. আপনি এই সম্পর্কে কী ভাবেন?

বিজয়ীর সিদ্ধান্ত নেওয়া হয়েছে, তবে আমি মনে করি খুব কম এন্ট্রি ছিল।

যে কেউ এখনও কোড জমা দিতে পারেন ..: পি


4
সত্যি বলতে আমরা খুব একটা গ্রহণ করি না "এখানে কোনও মেট্রিক নেই, শুধু ভোট দিন"। । এই কাজের জন্য একটি অবজেক্টিভ মেট্রিক স্থাপনের ক্ষেত্রে এখানে আপনার সাথে কাজ করার জিনিস রয়েছে । একটি সম্ভাব্য উদাহরণের জন্য জাল ত্রুটি বার্তা দেখুন ।
ডিএমকেই --- প্রাক্তন-মডারেটর বিড়ালছানা

@ ডিএমকে: দুঃখিত, আমি জানতাম না যে ভোটগুলি বেশ বিষয়ভিত্তিক ছিল .. :(
জিমিনপি

@ জিমিনপি: দুর্দান্ত সংরক্ষণ
ডিএমকেকে --- প্রাক্তন মডারেটর বিড়ালছানা

আরিক বট দীর্ঘ গল্ফের মতো শোনাচ্ছে - যদিও আমি আছি :)
লুনিক্সবোচস

স্পষ্টতা: "যদি প্রোগ্রামটি লাথি মারা হয় তবে পুনরায় যোগদানের চেষ্টা করুন।" - এর অর্থ কি সার্ভার বা চ্যানেল থেকে এসেছে?
lunixbochs

উত্তর:


1

পিএইচপি - 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করা ঠিক একই চরিত্রের গণনা হবে count


5

পাইথন - 125 পয়েন্ট

  • 304 অক্ষর
  • পদক্ষেপগুলি 1-5 অনুসরণ করে (আমার জন্য irc.freenode.net:6667 এ কাজ করে you
  • 4 টি বিধিনিষেধ অনুসরণ করে (বিজ্ঞপ্তি নিষেধাজ্ঞাকে ধরে নিলাম যা কিছুটা অস্পষ্ট।

স্কোর গণিত (অজগর):

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.