মাইকেল ক্রিক্টনের মাউসট্র্যাপ


9

১৯৮৪ সালে মাইকেল ক্রিচটন বেসিকের একটি সুরক্ষা প্রোগ্রাম লিখেছিলেন যা ক্রিয়েটিভ কম্পিউটিং ম্যাগাজিনে প্রকাশিত হয়েছিল। প্রোগ্রামটি ব্যবহারকারীকে তার পছন্দের একটি বাক্য টাইপ করতে, কী-স্ট্রোকগুলির মধ্যে অন্তরগুলি রেকর্ড করতে এবং তারপরে বাক্যটি আবার টাইপ করতে বলবে। যদি সময়গুলি খুব বেশি আলাদা হয় তবে প্রোগ্রামটি ব্যবহারকারীকে ইমপোস্টার হিসাবে সনাক্ত করতে পারে।

আপনার অ্যাসাইনমেন্ট: আপনার পছন্দের ভাষায় ক্রিকটনের প্রোগ্রামটির একটি সংস্করণ তৈরি করুন।

নিয়মাবলী:

  1. ব্যবহারকারীর সাথে যোগাযোগের জন্য বাক্যাংশ ("দয়া করে মূল বাক্যাংশটি টাইপ করুন," "দয়া করে আবার মূল বাক্যাংশটি টাইপ করুন," ইত্যাদি) প্রকৃত দৈর্ঘ্য নির্বিশেষে প্রতিটি বাইট হিসাবে গণনা করুন। এটি কেবল ব্যবহারকারী যোগাযোগের জন্য, স্ট্রিংগুলিতে প্রোগ্রাম কোডটি লুকানোর চেষ্টা করবেন না।

  2. পাস / ব্যর্থ পরীক্ষাটি মূল বিরতিতে শতাংশের বৈকল্পিকগুলির গড় পরম মানের ভিত্তিতে হওয়া উচিত। যদি স্ট্রিংগুলি মেলে না, তবে ফিরে আসুন ব্যর্থ হন বা আপনার বিবেচনার ভিত্তিতে ব্যবহারকারীকে আবার চেষ্টা করার অনুমতি দিন।

  3. মূল বাক্যাংশটি নাল স্ট্রিংয়ের অনুমতি দেওয়া উচিত নয়। ইভেন্টে মূল বাক্যাংশটি আপনার স্ট্রিং ডেটাটাইপের জন্য খুব দীর্ঘ, হয় নিজের বিবেচনার ভিত্তিতে কাটা বা বাতিল করে দিন এবং শুরু করুন।

  4. পরীক্ষার সংবেদনশীলতা (পাস / ফেল পরীক্ষার প্রান্তিক প্রান্ত) সোর্স কোডে সামঞ্জস্যযোগ্য হওয়া উচিত।

  5. আমি যদি আপনার উত্স কোডটি ডায়নোসরের সাথে সাদৃশ্যযুক্তরূপে ফর্ম্যাট করা যায় তবে আমি মূলত মোট বাইট গণনার 20% বোনাস সরবরাহ করেছি। এটি চিহ্নিত করা হয়েছে যে এটি অত্যন্ত আত্মনিয়ন্ত্রণমূলক এবং সম্ভবত জনপ্রিয়তার প্রতিযোগিতার জন্য আরও উপযুক্ত, তাই আমি এই বোনাসটি সরিয়েছি। তবে আমি এখনও আন্তরিকভাবে ডাইনোসর ফর্ম্যাটিংকে উত্সাহিত করি এবং আপনি যদি কোনও ডাইনোসরের মতো দেখতে আপনার কোডটি ফর্ম্যাট করেন তবে আপনি আপনার বাইট মোট থেকে কোনও খাঁটি কসমেটিক মন্তব্য, লাইন ব্রেক বা হোয়াইটস্পেসের অক্ষরগুলি কেটে নিতে পারেন।

  6. স্ট্রিং-লেংথ এবং ডাইনোসর ফরম্যাটিং সমন্বয় সাপেক্ষে সবচেয়ে কম বাইট গণনা জয় w

নোট করুন যে উপরে আমার স্পেসিফিকেশন ক্রিকটনের কোড অপারেশনের সাথে ঠিক মেলে না, যার অনুলিপিগুলি অনলাইনে পাওয়া যাবে। অনুমান অনুসরণ করুন, আসল ক্লোন করার চেষ্টা করবেন না।


5
"এটি মাইকেল ক্রিচটন, সুতরাং আপনার সোর্স কোডটি ডায়নোসরের অনুরূপ হিসাবে চিহ্নিত করার জন্য ফর্ম্যাট করা যায় তবে মোট বাইট গণনা থেকে 20% বিয়োগ করুন।" - উমম ... না এই নিয়মটি খুব সাবজেক্টিভ। অনুগ্রহপূর্বক অপসারণ করুন. তা ছাড়া, দয়া করে এগিয়ে যান।
জন ডিভোরাক

4
@ জনডভোরাক আমি এর "অত্যধিক" বিষয়টিকে মনে করি না। কিছু ASCII আর্টকে ডাইনো না হিসাবে কল করা মোটামুটি সহজ কল
অপটিমাইজার

3
@ অপ্টিমাইজার সব ক্ষেত্রে নয়। গ্রীক চিঠি লাম্বদা কি ডাইনোসরের মতো দেখাচ্ছে? আমি এটা নিশ্চিত।
জন ডিভোরাক

3
আরও কয়েকটি ছোট ছোট মন্তব্য: "Please type the key phrase"1 বাইট হিসাবে গণনা করা হয়, বা কেবল বাক্যাংশের গণনা এবং উদ্ধৃত বাক্যাংশটি 3 বাইট হিসাবে গণনা করা হয় ( ", শব্দগুচ্ছ, ")? এটি কি ইচ্ছাকৃত যে দীর্ঘতর ব্যবধান এবং একটি আরও সংক্ষিপ্ত বিরতি "বাতিল হয়ে যাবে" এবং আবারও হয়ে উঠবে? প্রোগ্রামটি কি দুটি মূল বাক্যাংশের সাথে মেলে তা যাচাই করতে হবে?
ডুরকনব

উত্তর:


9

রুবি, 171 167 157 বাইট

require'io/console';t=Time;f=->a{loop{x=t.now;STDIN.getch==?\r?break: a<<t.now-x};a};p"Please type the key phrase";f[r=[]];p"Please type the key phrase again";p r.zip(f[[]]).map{|x,y|(1-x/y).abs}.reduce(:+)/r.size>0.2

আউটপুট trueযদি গড় ভ্যারিয়েন্স 20% উপরে, অন্যথায় আউটপুট false

ডাইনোসর ASCII শিল্প প্রচেষ্টা:

(_=/\
  \ \
   \ \
    \ \              _...---..__
     \ \          .∕` #{t=Time} `\._
      \ \      .∕ #{z='io/console'} `\.
       \ \.__.∕  #{require z;s=STDIN} `\.
        \ #{p'1:';f=->a{loop{x=t.now;#   \.
         s.getch==?\r?break: a<<t.now-x;# `\.
          };a};f[r=[]];p'2:';p r.zip(f[[]])#\  
           .map{|x,y|(1-x/y).abs}.reduce(:+)#|
            .fdiv(r.size)>0.2}###########\   \
            `-._    ,___...----...__,   ,__\  \
                |   |_|           |_|   |    \ \
                |___|               |___|      \\/)

Ungolfed:

require 'io/console' # so we can read one char at a time

t = Time

f = ->(a) {
  loop {
    x = t.now # record start time
    break if STDIN.getch == ?\r
    a << t.now - x # push (start time - end time) into array
  }
  a
}

puts "Please type the key phrase"
f[r = []] 

puts "Please type the key phrase again"

# interweave timing arrays, compute variances, sum elements
# then divide by array length. Check to see if average
# is greater than threshold (0.2)
p r.zip(f[[]]).map { |x,y| (1-x/y).abs }.reduce(:+) / r.size > 0.2

require 'io/console' লাইব্রেরি ইতিমধ্যে লোড হওয়ায় কিছু রুবি আরপিএল চালানোর সময় মুছে ফেলা হতে পারে।


4

জাভা 768 বাইট

কি? জাভা? কোড গল্ফ জন্য?

এটি সম্ভবত সবচেয়ে খারাপ কাজ, তবে আমি যাইহোক এটি চেষ্টা করেছিলাম।

এটি কনসোল উইন্ডোতে কোনও বার্তা প্রদর্শন করে, তবে আসল টাইপিংটি জে টেক্সটফিল্ডে ঘটে। দেখতে ঠিক দেখতে সুন্দর নয়। ওহ, এবং 5 বাইট সংরক্ষণ করতে, আপনাকে নিজেই JFrame আকার পরিবর্তন করতে হবে। এছাড়াও, এটি দ্বিতীয়বার স্ট্রিংয়ের নির্ভুলতার জন্য যাচাই করে না। নিশ্চিত নয় যে এটি চশমাগুলির বিরুদ্ধে।

ব্যবহার করা:

পাঠ্যক্ষেত্রে আপনার কী টাইপ করুন।

এন্টার টিপুন না, কনসোলে যান এবং কিছু টাইপ করুন। এটি অন্য একটি বার্তা প্রদর্শন করবে

পাঠ্যক্ষেত্রের ক্ষেত্রে একই জিনিসটি টাইপ করুন (যা এখন পরিষ্কার করা উচিত)।

কনসোলে যান এবং আবার কিছু টিপুন। এটি আপনি প্রবেশকারী কিনা বা তা প্রদর্শিত হবে।

ungolfed:

import java.util.*;
import javax.swing.*;
import javax.swing.event.*;

public class CrichtonsMousetrap {
    public static void main(String[]a){
        new CrichtonsMousetrap();
    }
    long start;
    List<Long>elapsed = new ArrayList<>();
    List<Long>e2;
    public CrichtonsMousetrap(){
        JFrame f = new JFrame();
        f.setSize(199,70);
        f.setVisible(true);
        JTextField t = new JTextField();
        System.out.println("please type in the key phrase.");
        f.add(t);
        t.getDocument().addDocumentListener(new DocumentListener(){
            @Override
            public void changedUpdate(DocumentEvent e) {}
            @Override
            public void insertUpdate(DocumentEvent e) {
                long r = System.nanoTime();
                if(start!=0){elapsed.add(r-start);}
                start=r;}
            @Override
            public void removeUpdate(DocumentEvent e) {}            
        });
        Scanner s = new Scanner(System.in);
        s.next();
        System.out.println("please type that again!");
        e2=elapsed;
        elapsed=new ArrayList<>();
        start=0;
        t.setText("");
        s.next();
        double sum=0;
        for(int i=0;i<e2.size();i++){
            sum+=Math.abs(1-elapsed.get(i)/(double)e2.get(i));
        }
        System.out.println("your average percent error was " + sum/e2.size());
        double okLimit = .2;
        System.out.println(sum/e2.size() < okLimit ? "you're ok":"INTRUDER!");
    }
}

golfed:

import java.util.*;import javax.swing.*;import javax.swing.event.*;class q{static long p;static List<Long>y=new ArrayList<>(),o;public static void main(String[]a){JFrame f=new JFrame();f.setSize(0,0);f.setVisible(true);JTextField t=new JTextField();System.out.println("please type in the key phrase.");f.add(t);t.getDocument().addDocumentListener(new DocumentListener(){public void changedUpdate(DocumentEvent e){}public void insertUpdate(DocumentEvent e){long r=System.nanoTime();if(p!=0){y.add(r-p);}p=r;}public void removeUpdate(DocumentEvent e){}});Scanner s = new Scanner(System.in);s.next();System.out.println("please type that again!");o=y;y=new ArrayList<>();p=0;t.setText("");s.next();double b=0;for(int i=0;i<o.size();b+=Math.abs(1-y.get(i)/(double)o.get(i++)));System.out.print(b/o.size() < .25 ? "you're ok":"INTRUDER!");}}

জাভা থেকে কাঁচা মোডে টিটিওয়াই সেট করার কোনও উপায় নেই (যদি আপনি জেএনআই ব্যবহার করতে প্রস্তুত না হন)। সুতরাং আমি বুঝতে পেরেছি কেন আপনার জেফ্রেম দরকার। তবে সত্যই, এটি সর্বনিম্ন ব্যবহারকারী-বান্ধব প্রোগ্রাম যা আমি যুগে যুগে দেখেছি :-) আমি নিশ্চিত নই যে আমি এই উত্তরটিকে উঁচুতে বা নামিয়ে তুলতে চাই কিনা।
coredump

আমি নিখুঁতভাবে ব্যবহারকারীর বন্ধুত্বের জন্য উত্সাহ দিয়েছি (এটি কি একটি শব্দও নয়?) এটি মূলত শিল্প।
ইনগো বার্ক

আমি বিশ্বাস করি ক্লাসকে বাড়িয়ে দিয়ে আরও গল্ফ করা যেতে পারে JFrame, সুতরাং আপনার প্রয়োজন হবে না f
পূর্কাকাডারী

3

এইচটিএমএল, জাভাস্ক্রিপ্ট (ES6), 328

কোডটির মোট বাইটস গণনা 402 বাইট এবং ব্যবহারকারীর সাথে ইন্টারেক্ট করার বার্তা:

"Valid User"
"Imposter alert!!"
"Please Enter the Key again"
Please Enter the Key

মোট 78 বাইট, সুতরাং মোট স্কোর => 402 - 78 + 4 = 328

সর্বশেষতম ফায়ারফক্সে নীচে স্নিপেট চালান এবং প্রবেশ কী দ্বারা অনুসরণ ইনপুট বাক্সে কী টাইপ করুন।

কোড যাচাই করে যে প্রবেশ করানো এবং পুনরায় প্রবেশ করানো উভয় কীগুলি একই, (আবার না হলে পুনরায় প্রবেশের অনুরোধ জানায়), গড় পরম পার্থক্য শতাংশের গণনা করে এবং এটি ভেরিয়েবলের মান থেকে কম কিনা তা পরীক্ষা করে V

<a id=t >Please Enter the Key</a><input id=f /><script>V=.3,a=[],i=0,s=b="",q=0
c=_=>(j=0,_.slice(1).map(v=>j+=Math.abs(v)/i),alert(j<V?"Valid User":"Imposter alert!!"))
r=_=>(a=[],i=0,t.textContent="Please Enter the Key again",f.value="")
f.onkeyup=_=>_.keyCode==13?q++?s==f.value?(A=a,B=b,A=a.map((v,i)=>v-A[i-1]),c(b.map((v,i)=>(v-B[i-1]-A[i])/A[i]))):r():r(b=a,s=f.value):a[i++]=Date.now()</script>


3

সি, 154 (পতাকাগুলির জন্য 86 + 68)

d[99],i,a,b;main(x,y){P"Please type the key phrase"W(E-13)U,x=y;U;P"Please type 
the key phrase again"W(a<i)E,b+=abs(Y-Z)*99/Z,++a,x=y;b<a*9||P"No cake for imposters");}

সঙ্গে কম্পাইল -DY=(y=clock())-x, -DZ=a[d], -DE=getch(), -DW=);while, -DU=i++[d]=Yএবং -DP=puts(। উপস্থাপনের উদ্দেশ্যে যুক্ত করা নিউলাইনগুলি এবং অপসারণ করা যেতে পারে (দেওয়া বাইট গণনা ব্যতীত)।

Ungolfed + মন্তব্যগুলিতে:

d[99],i,a,b;
main(x,y,z){
    puts("Please type the key phrase");
    do
        z = getch(),
        i++[d] = (y = clock()) - x, // save amount of time from last key. first value is garbage.
        x = y;
    while((z = getch())-13); // read until carriage return. 
    for(;a < i && getch(); ++a) // don't check for validity, just get a char
        b += abs((y = clock())- x - d[a])*99/d[a], // (y=clock())-x is time from last key.
                                                     // subtract from original time, *99, divide by new
                                                     // then get sum of these
        x = y;
    b < i*9  // check that the average difference is less than 9/99
    || puts("No cake for imposters"); // identify as imposter if greater/equal
    // don't output anything if not an imposter
}

এটি পুনরায় টাইপ করা বাক্যাংশটি অভিন্ন কিনা তা পরীক্ষা করে না এবং ব্যবহারকারীকে ইমপোস্টার হিসাবে চিহ্নিত না করা হলে এটি কিছু আউটপুট দেয় না।

এটি প্রথম কীস্ট্রোকের আগে অনুরোধ করার পরে নেওয়া সময়কেও বিবেচনা করে না।


না করা উচিত getchবাজি ধরে বলতে পারি getcবা getchar? আমার কাছে 'গেট' এর একটি অপরিবর্তিত রেফারেন্স আছে, যা আমি যদি সঠিকভাবে স্মরণ করি তবে হ্রাস করা হয়?
coredump

আমার কাছে "file.c: 1: 1: সতর্কতা: ডেটা সংজ্ঞায় কোনও প্রকার বা স্টোরেজ শ্রেণি নেই" (জিসিসি)। আমি charবিশ্বব্যাপী ঘোষণার আগে যুক্ত করেছিলাম এবং এখন এটি রানটাইমে বিভাজন ত্রুটি দেয়। আপনি কীভাবে এটি তৈরি করবেন সে সম্পর্কে বিস্তারিত জানাতে পারেন? আপনি কোন সংকলক ব্যবহার করছেন? ধন্যবাদ।
coredump

@ কর্ড্প্প্প সতর্কবাণীগুলি নিরীহ; যদিও আপনি যদি সতর্কতাগুলি সরাতে চান তবে এটি টাইপ করা উচিত intএবং এতে আরম্ভ করা উচিত 0। আমি এটি উইন্ডোতে (উইন্ডো ব্যবহার করে getch) জিসিসি ব্যবহার করে পরীক্ষা করেছি । getchএর পরিবর্তে getcবা এর জন্য ব্যবহৃত হয় getcharকারণ getchকোনও অক্ষর প্রক্রিয়া করার আগে রিটার্ন কীটি টিপতে হবে না ( getchউইন্ডোতে প্রকৃতই হ্রাস করা হয়েছে, যদিও এখানে অবনতিযুক্ত ফাংশনগুলি ব্যবহার করার ক্ষেত্রে কোনও ভুল নেই)।
es1024

আমি লিনাক্সে পরীক্ষা করছি এবং এটির কাজ করার জন্য স্ট্যাকওভারফ্লো . com/ জিজ্ঞাসা / 69696969১13 9… / অবলম্বন করেছি। ধন্যবাদ।
coredump

2

স্কালা REPL 233

def l:Stream[(Int,Long)]=(Console.in.read,System.nanoTime)#::l    
def m={
    println("Enter");     
    l.takeWhile(_._1!=13).map(_._2).toList.sliding(2).map(a=>a(1)-a(0))
}
val k=m.zip(m)     
k.map(a=>Math.abs(a._2-a._1)/(a._1.toDouble*k.length)).sum<0.2

সমস্ত ব্যবধান অপসারণের সাথে, আপনার কাছে রয়েছে:

def l:Stream[(Int,Long)]=(Console.in.read,System.nanoTime)#::l;def m={println("Enter");l.takeWhile(_._1!=13).map(_._2).toList.sliding(2).map(a=>a(1)-a(0))};val k=m.zip(m);k.map(a=>Math.abs(a._2-a._1)/(a._1.toDouble*k.length)).sum<0.2

কোনটি আমি নিশ্চিত যে আমার চেয়ে বেশি মেধাবী কেউ ডায়নোসর তৈরি করতে পারে!

সংক্ষিপ্ত বর্ণনা:

lপদ্ধতি অক্ষর পড়া এবং নালীর রাখেnanoTime যখন প্রতিটি অক্ষর টাইপ করা হয়েছিল।

mপদ্ধতি কপি করে প্রিন্ট "Enter", ভঙ্গ lআঘাত করার পরে লিখুন পদ্ধতি (চরিত্র 13), তাহলে এটি শুধু মানচিত্রnanoTimes , এবং তারপর প্রতিটি অক্ষর মধ্যে সময় অন্তর পায়।

পরবর্তী 2 লাইনগুলি 2 টি স্ট্রিংয়ে পড়ে, সেগুলিকে জিপ করে, তারপরে দ্বিতীয় বিরতি এবং প্রথমটির মধ্যে শতাংশ পার্থক্যের গড় পরম গড় মান খুঁজে পায় এবং শেষ পর্যন্ত এই গড়ের চেয়ে কম ছিল কিনা তা মুদ্রণ করে 0.2


1

কমন লিস্প: 660

(ql:quickload'(cl-charms alexandria))(defun m(&key(ok 0.2))(labels((^(s)(fresh-line)(princ s)(return-from m))(d(a b)(abs(/ (- b a) b)))($(x)(princ x)(force-output))(?(m)(charms:with-curses()($ m)(clear-input)(charms:enable-raw-input)(loop for c = (read-char)for n = (get-internal-real-time)for x = nil then (/(- n b)internal-time-units-per-second)for b = n when (eql c #\Esc)do (^"QUIT")when x collect x into % until (eql c #\Newline) collect c into ! finally(progn(terpri)(return(cons(coerce !'string)%)))))))(let*((ip(?"INIT PASSWORD: "))(ps(car ip))(sp(if(equal""ps)(^"NO EMPTY PASSWORD ALLOWED")(?"ENTER PASSWORD: ")))(r(if(equal ps(car sp))(alexandria:mean(mapcar #'d(cdr sp)(cdr ip)))(^"YOU DIDN'T SAY THE MAGIC WORD!"))))(if(> r ok)($"YOU ARE A FAKE!")($"IDENTITY CONFIRMED")))))(m)

Ungolfed

(ql:quickload'(cl-charms alexandria))
(defun m(&key(ok 0.2))
  (labels
      ((^(s)(fresh-line)(princ s)(return-from m))
       (d(a b)(abs(/ (- b a) b)))
       ($(x)(princ x)(force-output))
       (?(m)(charms:with-curses()
              (clear-input)
              ($ m)
              (charms:enable-raw-input)
              (loop for c = (read-char)
                    for n = (get-internal-real-time)
                    for x = nil then (/ (- n b)
                                        internal-time-units-per-second)
                    for b = n
                    when (eql c #\Esc)
                      do (^"QUIT")
                    when x
                      collect x into %
                    until (eql c #\Newline)
                    collect c into !
                    finally (progn
                              (terpri)
                              (return
                                (cons (coerce !'string) %)))))))
    (let* ((ip (?"INIT PASSWORD: "))
           (ps (car ip))
           (sp (if (equal "" ps)
                 (^"NO EMPTY PASSWORD ALLOWED")
                 (?"ENTER PASSWORD: ")))
           (r (if (equal ps (car sp))
                (alexandria:mean(mapcar #'d(cdr sp)(cdr ip)))
                (^"YOU DIDN'T SAY THE MAGIC WORD!"))))
      (if (> r ok)
        ($"YOU ARE A FAKE!")
        ($"IDENTITY CONFIRMED")))))

(m) ;; call function

অতিরিক্ত মন্তব্য

  • সমস্ত নিয়ম মেনে চলে
  • যখন ব্যবহারকারী প্রথমে একটি খালি পাসওয়ার্ড দেয়, প্রোগ্রামটি পরিষ্কারভাবে বাতিল হয়
  • টাইপ করার সময় Escape, প্রোগ্রামটি পরিষ্কারভাবে বাতিল হয়ে যায়।
  • সাম্প্রতিক এসবিসিএল এবং সিসিএল বাস্তবায়নের বিষয়ে পরীক্ষিত
  • ক্ল-ক্রেমগুলির প্রয়োজন, যা এনক্রেসের চারপাশে মোড়ক। কাঁচা ইনপুট ক্যাপচার করার এটি সহজতম উপায়।
  • এটি স্কাইয়ামিশ-ওসিফ্রেজে পাওয়া মূল সংস্করণটি দ্বারা অনুপ্রাণিত (তবে অনুলিপি করা হয়নি)

ডাইনোসর বোনাস

আমার একটি বোনাস থাকা উচিত কারণ সকলেই জানেন যে " কমন লিস্প একটি মরিবন্ড ডাইনোসর "।


আপনি কি কোট ব্লকের পরিবর্তে কোড ব্লকে স্যুইচ করতে পারবেন? (আপনার কোডের জন্য)
অপ্টিমাইজার

@ অপ্টিমাইজারটি সম্পন্ন হয়েছে
coredump
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.