একটি সাধারণ লজিক গেট ক্যালকুলেটর


9

আপনার মিশনটি যদি আপনি এটি গ্রহণ করতে চান তবে নিম্নলিখিত লজিকাল অপারেটরগুলির জন্য একটি সাধারণ সত্য মূল্যায়নকারী তৈরি করা:

----------------------------------------------------------------------------------
  Logical Name          |  Gate Name   |  Symbol  |  Symbol Name  |  Truth Table
----------------------------------------------------------------------------------
  Identity              |  is          |          |  (none)       |  10
  Negation              |  not         |    ~     |  tilde        |  01
  Conjunction           |  and         |    &     |  ampersand    |  1000
  Disjunction           |  or          |    |     |  pipe         |  1110
  Negative Conjunction  |  nand        |    ^     |  caret        |  0111
  Joint Denial          |  nor         |    v     |  "vee"        |  0001
  Exclusive Disjunction |  xor         |    x     |  "ecks"       |  0110
  Equivalence           |  equals/xnor |    =     |  equals       |  1001
  Implication           |  implies     |    >     |  greater than |  1011

সত্যের টেবিলগুলি নিম্নলিখিত ক্রমে রয়েছে:

  1. 1 1
  2. 1 0
  3. 0 1
  4. 0 0

ইনপুট 0, 1 এর একটি সাধারণ স্ট্রিং এবং প্রতীক হিসাবে আসবে। আপনি হয় প্যারামিটার হিসাবে ইনপুট গ্রহণ করতে পারেন বা স্টিডিনের ব্যবহারকারীর কাছ থেকে এটি পড়তে পারেন। এখানে কিছু নমুনা ইনপুট / আউটপুট জোড়া রয়েছে:

Input: 1
Output: 1

Input: ~1
Output: 0

Input: 0|1
Output: 1

Input: 1>0
Output: 0

বেনারি অপারেটর সর্বদা দুটি বুলিয়ান মানের মধ্যে উপস্থিত হবে, বাইনারি অপারেটর সর্বদা বুলিয়ান মান আগে উপস্থিত হবে। আপনি ধরে নিতে পারেন যে সমস্ত ইনপুট বৈধ হবে। স্ট্রিংগুলি নিয়মিত ASCII স্ট্রিং থাকে।

আপনি যদি পছন্দ করেন তবে আপনি উভয়কে সমর্থন করলে আপনার অক্ষর গণনায় 1 এবং 0. -6 এর পরিবর্তে টি এবং এফ ব্যবহার করতে পারেন ।

এই : যে কোনও ভাষাতে সংক্ষিপ্ততম কোড জিতে!


3
আমি বিশ্বাস করি ^এর প্রতীক নামের ক্যারেট বলা উচিত ।
ফায়ারফ্লাই

3
@ ফায়ারফ্লাই হাহা, আপনি ঠিক বলেছেন দুপুরের খাবারের খুব কাছে! ধন্যবাদ।
asteri

উত্তর:


6

এপিএল (45 - 6 = 39)

⍎(1+9≠L)⌷¨↓⍉Z⍪⍉⍪'10∧∨⍲⍱≠≤*'[L←'TF&|^vx>'⍳Z←⍞]

সমর্থন Tএবং Fইনপুট হিসাবে কিন্তু সর্বদা আউটপুট 0বা 1

ব্যাখ্যা:

  • Z←⍞: একটি লাইন পড়ুন এবং এটি সঞ্চয় করুন Z
  • L←'TF&|^vx>'⍳Z: 'TF&|^vx>'প্রতিটি চরিত্রের জন্য সূচকটি পান Z, 9অক্ষরটি না থাকলে দেওয়া 'TF&|^vx>'
  • '10∧∨⍲⍱≠≤*'[... ]: এর সাথে সম্পর্কিত চরিত্রটি সন্ধান করুন '10∧∨⍲⍱≠≤*'। (সুতরাং যে অক্ষরগুলি প্রথম তালিকায় ছিল না সেগুলি হয়ে যায় *)।
  • ↓⍉Z⍪⍉⍪: এটিকে একটি ম্যাট্রিক্সে তৈরি করুন, এর উপরে মূল ( Z) রাখুন এবং এটিকে স্ট্রিংয়ের তালিকায় বিভক্ত করুন, যেখানে প্রথম অক্ষরটি মূল এবং দ্বিতীয় চরিত্রটি যদি এর কোনও অনুবাদ হয়।
  • (1+9≠L)⌷¨: এই স্ট্রিংগুলির প্রত্যেকটির জন্য, কোনও অনুবাদ না থাকলে প্রথম অক্ষর (যদি L=9সেই জায়গায় থাকে) এবং দ্বিতীয় অক্ষর থাকলে সেখানে পান।
  • উদাহরণ: যদি ইনপুট ছিল T|0, আমরা চাই 1∨0এখন যা সংশ্লিষ্ট APL অভিব্যক্তি
  • : eval

দ্রষ্টব্য: ~এবং =ইতিমধ্যে সঠিক জিনিসটি করুন যাতে তাদের কোনও কিছুর দ্বারা প্রতিস্থাপনের প্রয়োজন হয় না।


খুব সুন্দর! এটি অনুবাদ-থেকে-এপিএল-এবং-ইভাল পদ্ধতির, তাই না? আমি জেটিতে একটি গ্রুন্ড-ভিত্তিক পদ্ধতির বিষয়ে চিন্তাভাবনা করছিলাম, তবে কীভাবে চতুরতার সাথে অপারেশনগুলি বিভক্ত করতে হয় তা আমি জানি না। : \
ফায়ারফ্লাই

ম্যাট্রিক্স ম্যানিপুলেশন কেন আপনি যখন কোনও পরিবর্তন-পরিবর্তিত অক্ষরের জন্য অনুবাদ বিধিগুলি যুক্ত করতে পারবেন ⍎'1010~∧∨⍲⍱≠=≤'['10TF~&|^vx=>'⍳⍞]? (স্কোর 33-6 = 27)
টুইনাইট

8

সি - 165 127

ঐটা মজা ছিল! সাদামাটা দেখার টেবিলটি দেখার জন্য একটি নির্দিষ্ট অফসেটের উপর নির্ভর করে।

main(){
  char*s="100011001110110v& x = |^> /~",
       t[6]="0/xxx",
      *u= strchr((gets(t+2),t),0)-3;
  putchar(strchr(s,u[1])[*u*2+u[2]-159]);
}

কোনও কারণে getsসুস্পষ্টভাবে ঘোষিত হয় না, সুতরাং আমি যখন অন্তর্ভুক্তটি সরিয়ে ফেলি তখন আমাকে (বা অন্য কোথাও অন্য কোথাও, এত দামে) পরিবর্তন gets(t+2)করতে হয়েছিল (gets(t+2),t)


ব্যাখ্যা

প্রথমত, অপারেটরগুলির জন্য সত্যের টেবিলগুলিতে প্রচুর ওভারল্যাপিং অক্ষর রয়েছে তাই আমরা লুকিং টেবিলগুলি এমনভাবে সংরক্ষণ করতে চাই যাতে আমরা ওভারল্যাপটিকে অনুমতি দেই। আমি কীভাবে সেগুলি সঞ্চয় করতে পছন্দ করেছি তা এখানে:

v    &    x    =    |    ^    >       ~     (operation)
1000 0001 0110 1001 0111 1110 1101 01 10    (truth table [order 00,01,10,11])
0    1    3    5    7    8    9    B  D     (offset in LUT below)

0123456789ABCDE   (offsets)
100011001110110   (values)

এরপরে, আমরা এই অফসেটগুলিতে অপারেটর প্রতীকগুলি মানচিত্র করতে চাই। আমরা LUT ডেটা থেকে স্থির অফসেটে একই স্ট্রিংয়ে অপারেটর প্রতীকগুলি সংরক্ষণ করে এটি করি (যথা, 16 অক্ষর পরে, অর্থাত্ লুটের ডেটার পরে সরাসরি)। সন্ধানের প্রক্রিয়াটি হ'ল "অপারেটর সন্ধান করুন s, বিয়োগ করুন 16, যোগ করুন left*2+right(বাম / ডান অপারেন্ড) the খালি" পরিচয় ক্রিয়াকলাপ "অনুসন্ধানের জন্য, কীভাবে ইনপুটটি এই ক্ষেত্রে অপারেটর আনা হয় তার ফলে সমাধান করা t[1]হবে- আমাদের ক্ষেত্রে ইন /। সুতরাং, আমরা ব্যবহার /লুকআপ টেবিল কী পরিচয় অপারেশন প্রতিনিধিত্ব করতে হয়। আমরা যখন ইউনারী প্রক্রিয়া ~অপারেশন " left" (জন্য লুকআপ হিসাব উল্লেখ করেছে আগে) সবসময় এই একই //কম এক হতে হবে0ASCII- অনুসারে, যখন আমরা ASCII সংখ্যাগুলির জন্য ক্ষতিপূরণ দেই তখন \প্রতিনিধিত্ব করবে -1। লুক টেবিল কী ক্ষেত্রের স্ল্যাশ (দ্বিতীয় থেকে শেষের অক্ষর s, এটি) এর জন্য ক্ষতিপূরণ দেওয়ার জন্য অবস্থিত।

পরবর্তী, ইনপুট হ্যান্ডলিং। ইনপুটটির গতিশীল দৈর্ঘ্য রয়েছে, তবে ইনপুট নির্বিশেষে আমাদের বাম অপারেন্ড, অপারেটর এবং ডান অপরেন্ডের জন্য নির্দিষ্ট স্ট্যাটিক নাম থাকলে এটি আরও সহজ হবে। আমরা যদি ভান করি যে আমরা ডান থেকে বামে ইনপুটটি পড়তে পারি তবে এটি মূলত স্বয়ংক্রিয়ভাবে ঘটবে - ডান অপরেন্ডটি সর্বদা ডানদিকের অক্ষর হয়, অপারেটর (উপস্থিত থাকলে) দ্বিতীয় থেকে ডানদিকে থাকে, উপস্থিত থাকে ) তৃতীয় থেকে ডানদিকে। স্ট্রিংটিকে এভাবে সূচী করতে সক্ষম হওয়ার জন্য, আমরা টার্মিনেটরটি strchrসনাক্ত করতে \0( - 3ইনডেক্সিংকে সহজ করার জন্য) ব্যবহার করি। এটি ইনপুট 1 বা 2 অক্ষরের হলে যথাক্রমে কেন t[0]এবং t[1]বাম অপারেন্ড / অপারেটর হয় তা দেখায় ।

এটি একসাথে রাখলে, আউটপুট হবে putchar(strchr(s,u[1])[(u[0] - '0')*2 + (u[2] - '0') - 15]), তবে কিছু সংশোধনকারী এবং ধ্রুবক ভাঁজ এটি পরিবর্তিত হয় আমাদের ছোট করে putchar(strchr(s,u[1])[u[0]*2+u[2]-159])


আপনি কিভাবে ব্যাখ্যা করতে পারেন যে কিভাবে কাজ করে?
জোহানেস কুহ্ন

সত্যের টেবিলের ওভারল্যাপটি ছিল একটি উজ্জ্বল ধারণা। এটা আমি নিজেই ভাবিনি। :)
asteri

এছাড়াও ডান থেকে বামে পড়া। আমি জানতাম পরিবর্তনশীল দৈর্ঘ্যের ইনপুট এবং অবস্থান একটি চ্যালেঞ্জ তৈরি করবে এবং এটি সমাধানের এটি দুর্দান্ত উপায়। বাক্সের বাইরে চিন্তাভাবনা সত্যিই দুর্দান্ত। আমার উন্নয়ন দলে কাজ আসতে চান? হাহা
asteri

4
আমি মনে করি আরও উত্তরগুলির মতো ব্যাখ্যা হওয়া উচিত। আমাদের মধ্যে যারা এখনও যথেষ্ট পরিমাণে শিখছেন তাদের সহায়তা করে! (এবং তাদের দ্বারা যারা এখনও প্রায় কাছাকাছি মানে সবাই শিখছে)
agweber

@ অ্যাগবার: শুনে শুনে ভালো লাগল, আমার ব্যাখ্যা নিয়ে আমি কিছুটা উদ্বিগ্ন ছিলাম। এবং হ্যাঁ, সম্ভবত এখানে প্রত্যেকেই "এখনও শেখার" পর্যায়ে আছে .. ভাল, কমপক্ষে আমি জানি আমি আছি।
ফায়ারফ্লাই

4

টিসিএল, 212 208-6 = 202

proc o n\ e {proc $n a\ b expr\ $e}
o > {$a<=$b}
o v {!($a|$b)}
o x {$a^$b}
o ^ {!($a&$b)}
namespace pat tcl::mathop 
lmap o\ b [lassign [split [string map {~0 1 ~1 0} $argv] {}] a] {set a [$o $a $b]}
puts $a

Ungolfed:

# Defines an operator
proc operator {name expression} {
    proc $name {a b} "expr $expression"
}
operator > {$a<=$b}
operator v {!($a|$b)}
operator x {$a^$b}
operator ^ {!($a&$b)}
# Call the commands in ::tcl::mathop if the command is not in the global namespace
namespace path tcl::mathop
# lmap instead foreach
# assume that we only got 1 argument.
foreach {op b} [lassign [string map {{~ 0} 1 {~ 1} 0} [split $argv {}]] a] {
   set a [$op $a $b]
}
puts $a

আমি মনে করি foreach লাইন কিছু ব্যাখ্যা প্রয়োজন:

  • split $argv {} ইনপুট স্ট্রিংটি বিভক্ত করে (এটি আসলে একটি তালিকা, তবে কোড-গল্ফ) এর অক্ষরগুলিতে।
  • string map {{~ 0} 1 {~ 1} 0} ...একটি স্ট্রিং নেয় এবং এর ~ 0সাথে 1এবং এর ~ 1সাথে প্রতিস্থাপন করে0
  • lassign ... a তালিকার প্রথম উপাদানটি নিয়ে যায় এবং এটিকে ভ্যারিয়েবল এ-তে নির্ধারিত করে, বাকীটি প্রদান করে।
  • foreach {op b} ... {code}তালিকার উপর দিয়ে যায় এবং প্রতিবার 2 টি উপাদান নেয়: opএবংb
  • set a [$op $a $b]ভেরিয়েবল কমান্ড কার্যকর opকরে ফলাফল সংরক্ষণ করেa

3

জাভাস্ক্রিপ্ট - 107 105 টি অক্ষর

alert((x=eval(prompt().replace(/v/,'|~').replace(/\^/,'&~').replace(/x/,'^').replace(/=/,'==')))!=-1?x:0)

হাহা সুন্দর. এটা সহজ। আমি eval()কখন এটি তৈরি করেছি তা ভাবিনি । বাসায় উঠতে এবং পরীক্ষা করার জন্য আমাকে কিছুটা দিন।
asteri

1
নান্দ = &~এবং নর = |~?
জোহানেস কুহন

@ জোহানেস: এটি সত্যই নয় &~এবং ন্যানডটি |~কেবল AND এর বিপরীত। সুতরাং, বিটগুলির মধ্যে একটিকে বিপরীত করলে ফলাফলটিও উল্টে যায়।
প্রোগ্রামফক্স

3

বেফুঞ্জ -98 - 104 101 98-6 72

... কারণ প্রতিটি টাস্কের একটি এসল্যাং সমাধান দরকার .. আমার সি বাস্তবায়নের অনুবাদ, তবে পরিবর্তে একসময় অক্ষরগুলির প্রক্রিয়াকরণ।

#v~
2_vp5a00+*2%2\p10\%
0:<+1_v#-g5\g1
1_|#:\</2\-
.@>2%
 v   ~x^&=.>  |

মজার বিষয়: পরিবর্তন @করতে a,$এবং আপনি যদি এর পরিবর্তে (ক অভিনব অফুরন্ত REPL পেতে যদিও, যদি আপনি এই কাজ করতে আপনি দেখতে পাবেন যে পরিচয় আসলে, যা শুধু পরিচয় ডিফল্ট ঘটবে "LHS = 0 ও RHS = ইনপুট দিয়ে গত কমান্ড পুনরাবৃত্তি" হয় )। আরপিএল আর নেই।

অবহেলিত (পূর্ববর্তী সংস্করণ):

v10001100111011v& x = |^>~
  $       1111111111222222
 1234567890123456789012345

 [read input]
> ~ :a- #v_   $ 21g " "- + 0g , @

v p11:   <
   ↑save chr

0 ←lup   [traverse LUT]
> 1+  :11g  \0g -! #v_
 v                  <
    lup chr acc
v>  :3` #v_  $"0"-\2*+

               v>   . , a,
 v       <
v> 9+9+ 21p $

সম্পাদনা: @jpjacobs এর সমাধান দ্বারা অনুপ্রাণিত হয়ে আমি এখন সত্যের টেবিলগুলি উপস্থাপন করতে LUT- তে অক্ষরের অবস্থানের উপর নির্ভর করি। উদাহরণস্বরূপ, |1110 2 = 14 পজিশনে রয়েছে কারণ এটি সত্যের টেবিলের সাথে সম্পর্কিত |


এটা পাগল। ঠিক আছে, বেফুঞ্জের প্রতিটি সমাধান পাগল।
জোহানেস কুহন

2

জে - 65 67-6 = 61

আর নেই খ। ক্রিয়া বিশেষণ। ফাংশনের অ্যাসাইনমেন্ট গণনা ছাড়াই: টিএফ সংস্করণের জন্য 67 টি অক্ষর, নন-টিএফ সংস্করণের জন্য 63:

lgcTF =:".@({&('*+-+-<*01',.3 6#'.:')"1@n^:(9>n=:'&|~xv>^FT'&i.)@{.&.>&.;:)
lgc   =:".@({&('*+-+-<*',.3 4#'.:')"1@n^:(7>n=:'&|~xv>^'&i.)@{.&.>&.;:)

এলজিসিটিএফ 0 এবং 1 পাশাপাশি টি এবং এফ উভয়ই পরিচালনা করে

জেনের সমস্ত সিনট্যাক্সকে ট্রেন, প্যারেন্থিসিসের ক্ষেত্রে সমর্থন করে এবং ডান থেকে বামে কঠোরভাবে মূল্যায়ন করে (অন্য কোনও পূর্ববর্তী নিয়ম নেই)।

অপারেটরের তালিকায় নেই এমন সমস্ত অক্ষর + জেড ব্যবহার করা যাবে না, অন্যরা স্ট্যান্ডার্ড জে (ভেরিয়েবল সহ) হিসাবে কাজ করবে।

ব্যবহার:

NB.Assign TF anyhow
T=:1 [ F=: 0
lgc 'T & F'
0
lgc ' T ~@& F' NB. negation after and = nand
NB. make a truth table
d=: 0 1
lgc 'd ~@|/ d'
1 0
0 0 
NB. and so on... 

1

পোস্টস্ক্রিপ্ট 263

ফায়ারফ্লাই এর ধারণা পোস্টস্ক্রিপ্ট অনুবাদ।

{(0/xxx)dup 2 3 getinterval(%lineedit)(r)file exch 
readstring pop length 1 sub 3
getinterval(100011001110110v& x = |^> /~)dup
2 index 1 1 getinterval search pop exch pop exch pop 
length 3 2 roll{}forall exch pop exch 2 mul add 159 sub add 
1 getinterval =}loop

ইন্ডেন্টযুক্ত:

%!

{
    (0/xxx) dup 2 3 getinterval
    (%lineedit)(r)file exch % (0/xxx) file (xxx)
    readstring pop
    length % (0/xxx) len(x|xx|xxx)
    1 sub 3 getinterval % (0/x)|(/xx)|(xxx)
    (100011001110110v& x = |^> /~) dup
    2 index 1 1 getinterval search pop % (0/x)|(/xx)|(xxx) s post match pre
    exch pop exch pop % (xxx) s pre
    length 
    3 2 roll {} forall exch pop % s len(pre) u_0 u_2
    exch 2 mul add 159 sub add % s ind
    1 getinterval
    = flush
} loop

1

বেফঞ্জ -৩৩, ৮ 86 টি অক্ষর

আই সমন্বয়ের জন্য ইনপুটটির দ্বিতীয় প্রতীকটি (কোনও ফাংশন সন্ধান করা যা উভয় সংক্ষিপ্ত এবং সংঘর্ষ এড়ানো এড়ানো কিছু কাজ ছিল) দ্বারা কাজ করে এবং প্রতিটি মডিউল 2 কে এক্স সমন্বয়ের দুটি নূন্যতম বিট হিসাবে গ্রহণ করে, তারপরে নির্দেশিত অবস্থানে যেকোন মান পুনরুদ্ধার করা। সত্যের টেবিলগুলি সংরক্ষণ / সম্বোধনের আরও একটি ভাল হ্যাশ ফাংশন বা আরও কমপ্যাক্ট পদ্ধতি হ'ল দৈর্ঘ্যটি হ্রাস করতে পারে এমন দুটি সম্ভাব্য উপায়।

~~~\:8/\5%:++00p2%\2%2*+00gg,@
0 1







1001
0001
1101
1

0
0110



1110
1000


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