चर्च बूलियन


33

चर्च के बूलियन

एक चर्च बूलियन एक फ़ंक्शन है जो xसही और yगलत के लिए रिटर्न करता है जहां xफ़ंक्शन का पहला तर्क है और फ़ंक्शन yका दूसरा तर्क है। इन कार्यों से आगे के कार्यों की रचना की जा सकती है जो तार्किक and not or xorऔर impliesतार्किक संचालन का प्रतिनिधित्व करते हैं ।

चुनौती

चर्च बूलियन्स और निर्माण and not or xorऔर impliesअपनी पसंद का एक भाषा में चर्च फाटकों। and orऔर xorदो कार्यों में लग जाना चाहिए (चर्च बूलियंस का प्रतिनिधित्व करते हुए) और एक फ़ंक्शन (दूसरे चर्च बूलियन का प्रतिनिधित्व) वापस करना चाहिए। इसी तरह, notउस फंक्शन को उल्टा करना चाहिए और impliesगेट को बूलियन का अर्थ करना चाहिए तर्क जहां पहले तर्क impliesदूसरे।

स्कोरिंग

चर्च बनाने के लिए आवश्यक सभी कोड की कुल लंबाई trueऔर falseआपकी भाषा and not or xorऔर impliesचर्च गेट्स फ़ंक्शन के नाम को छोड़कर। (उदाहरण के लिए,false=lambda x,y:y पायथन में 13 बाइट्स होंगे)। आप बाद में अपने कोड में इन नामों का पुन: उपयोग कर सकते हैं, उनके साथ उस गेट के बाइट कुल की ओर 1 बाइट गिन सकते हैं।

छद्म कोड उदाहरण:

आपके द्वारा बनाए जाने वाले कार्य आपके कोड में बाद में कहे जाने योग्य होने चाहिए।

true(x, y) -> x
false(x, y) -> y
and(true, true)(x, y) -> x
and(true, false)(x, y) -> y
# ... etc

2
क्या हमें फ़ंक्शन इनपुट (या निकटतम विकल्प) को ब्लैक-बॉक्स फ़ंक्शन के रूप में मानना ​​है, या क्या हम कोड का निरीक्षण कर सकते हैं? और क्या लॉजिकल ऑपरेशंस के रिटर्न वैल्यूज वही कार्य होने चाहिए जो पहले चर्च के बूलियंस के रूप में परिभाषित किए गए थे, या क्या वे कुछ और हो सकते हैं जो एक ही काम करता है?
असंबंधित स्ट्रिंग

1
@JonathanAllan मैंने इसे संपादित किया इसलिए यह सही था। अब जैसा होना चाहिए, वैसा ही संकेत।
रयान शेफर

2
क्या हम सूची को तर्क (जैसे true([x, y]), and([true, true])([x, y])) के रूप में ले सकते हैं ?
ar4093

2
@ रेयानशिएरफ़ायर मुझे लगता है कि आपको पुनर्विचार करने की अनुमति दलीलों को एक क्रमबद्ध सूची में होना चाहिए, क्योंकि समाधानों की शुरुआत में कोई भी तर्क को लपेट सकता है। मुझे नहीं लगता कि इस चुनौती को बेहतर बनाने के लिए कुछ भी करने की आवश्यकता है (वास्तव में मुझे लगता है कि यह दिलचस्प गोल्फ क्षमता को सीमित करता है)। बेशक, यह सिर्फ मेरी राय है, और यदि आप सहमत नहीं हैं तो यह ठीक है।
FryAmTheEggman

1
स्कोरिंग भ्रामक है। क्या लोगों को गुमनाम कार्यों को प्रस्तुत करने देना बेहतर नहीं होगा, लेकिन अगर वे उन्हें अन्य भागों में उपयोग करते हैं तो उन्हें उन्हें असाइन करना होगा, हमेशा की तरह
जो किंग

जवाबों:


14

बाइनरी लैम्ब्डा कैलकुलस , 13.875 12.875 बाइट्स (103 बिट्स)

जॉन ट्रम्प द्वारा बाइनरी लैम्बडा कैलकुलस लैंग्वेज (बीएलसी) मूल रूप से लैम्ब्डा कैलकुलस के लिए एक कुशल क्रमांकन प्रारूप है। यह इस कार्य के लिए बहुत उपयुक्त है, क्योंकि चर्च संकेतन BLC में बुलियन के साथ काम करने का "मुहावरेदार" तरीका भी है।

मैंने कॉम्बिनेटरों के लिए निम्नलिखित लैम्ब्डा कार्यों का उपयोग किया, जिनमें से कुछ को मैंने हास्केल उत्तर से कॉपी और गोल्फ किया: जो कि प्रत्येक मामले के लिए 20 uctions-कटौती की एक प्रमाण सीमा के साथ एक संपूर्ण खोज द्वारा पाए गए थे। एक अच्छा मौका है ये सबसे कम संभव हैं।

True:  (\a \b a)
False: (\a \b b)
Not:   (\a \b \c a c b)
And:   (\a \b b a b)
Or:    (\a a a)
Xor:   (\a \b b (a (\c \d d) b) a)
Impl:  (\a \b a b (\c \d c))

ये निम्नलिखित (बाइनरी) बीएलसी कोड अनुक्रमों का अनुवाद करते हैं:

 bits |  name | BLC
------+-------+---------
    7 | True  | 0000 110
    6 | False | 0000 10
   19 | Not   | 0000 0001 0111 1010 110
   15 | And   | 0000 0101 1011 010
    8 | Or    | 0001 1010
   28 | Xor   | 0000 0101 1001 0111 0000 0101 0110
   20 | Impl  | 0000 0101 1101 0000 0110

ऊपर दिए गए कार्य कुल 111 बिट्स (13.875 बाइट्स) में 103 बिट्स लंबे (12.875 बाइट्स) हैं। उन्हें एक कार्यक्रम के अंदर उपयोग करने के लिए बाइट सीमाओं से जुड़ने की आवश्यकता नहीं है, इसलिए यह भिन्नात्मक बाइट्स की गणना करने के लिए समझ में आता है।

कॉम्बिनेटरों के बीच कोई कोड फिर से उपयोग नहीं किया जाता है, क्योंकि बीएलसी में कोई चर / संदर्भ / नाम नहीं हैं - सब कुछ पर कॉपी किया जाना था। फिर भी, एन्कोडिंग की दक्षता काफी हद तक प्रतिनिधित्व के लिए बनाती है।


1
मैं blc नहीं जानता, लेकिन And: (\a \b a b a)काम करेगा ?
tsh

हाँ यह काम करता है। मैंने वास्तव में अपने कोड अनुक्रमों के लिए इस सूत्र का उपयोग किया था। मैं सिर्फ इसी लंबो फ़ंक्शन (अब सही किया गया) को अपडेट करना भूल गया। समतुल्य कार्य Or: या के लिए काम करता है \a \b a a b। हालांकि यह उस बीएलसी से अधिक लंबा है जिसका मैंने बीएलसी में उपयोग किया था।
पावेल पोट्टिके

25

हास्केल , 50 - 6 = 44 बाइट्स

-1 बाइट का धन्यवाद खुल्द्रेसथ न’बैरी, और क्रिस्चियन सेवर्स को -1 बाइट।

t=const
f=n t
n=flip
a=n n f
o=($t)
x=(n>>=)
i=o.n

इसे ऑनलाइन आज़माएं!


2
साइड नोट: आप सीधे चर्च के बूलियंस के Showलिए constऔर उदाहरणों को परिभाषित कर सकते हैं const idइसे ऑनलाइन आज़माएं!
nimi


4
कोई उपयोग क्यों नहीं कर रहा है f=n t?
क्रिश्चियन सेवर्स

3
आप t=pureइसके बजाय का उपयोग करके एक बाइट बचा सकते हैं t=const
जोसेफ सिबल-पुनः स्थापित मोनिका

4
@JosephSible मैंने शुरू में कोशिश की थी। दुर्भाग्य से, t=pureजब मैं लागू करने का प्रयास एक त्रुटि का कारण होगा a, o, x, या iइसे करने के लिए। tइस लागत को ठीक करने के प्रकार की घोषणा करने से केवल उपयोग करने की तुलना में अधिक बाइट्स खर्च होते हैं t=const
नाइट्रोडॉन

9

पायथन 2 , (-3?)  101  95 बाइट्स

डेविड बेज़ले आपके दिल को खा जाते हैं!

-6 चेस ब्राउन के लिए धन्यवाद ( :शामिल पाठ में दोहराया दोहराया > <।)

exec'=lambda x,y=0:'.join('F y;T x;N x(F,T);A x(y,F);O x(T,y);X x(N(y),y);I O(y,N(x))'.split())

इसे ऑनलाइन आज़माएं!

मैं यह हो सकता है लगता है 95 - 3क्योंकि मैं कार्यों में उपयोग न करें A, Xया I, लेकिन मैं एक एकल का उपयोग =कार्य के लिए (के सामने lambda)। शायद मैं किसी को दूर नहीं कर सकता; शायद मैं भी 3.5 निकालने के लिए मिलता है?


@ रयान शेफर क्या मैं तीन को हटा सकता हूं या क्या मेरा execमतलब यह नहीं है कि मैं नहीं कर सकता? मैं किसी भी तरह से देख सकता हूं - मैं ए, एक्स, या मैं का पुन: उपयोग नहीं करता हूं, लेकिन कोड उनके बिना काम नहीं करेगा। (शायद मुझे भी 3.5 निकालने के लिए मिलें?)
जोनाथन एलन


धन्यवाद @ चास! बृहदान्त्र जो जाल के माध्यम से फिसल गया :) -1 BTW के बदले पर अच्छा काम
जोनाथन एलन

7

जावास्क्रिप्ट (Node.js) , 92 86 83 - 7 = 76 बाइट्स

t=p=>q=>p
f=t(q=>q)
n=p=>p(f)(t)
a=p=>n(p)(f)
o=p=>p(t)
x=p=>p(n)(f())
i=p=>n(p)(t)

इसे ऑनलाइन आज़माएं! लिंक में मूल परीक्षण मामले शामिल हैं। संपादित करें: सहेजे गए 6 9 बाइट @tsh के लिए धन्यवाद।


1
आप इस दावा नहीं कर सकते लगता है के रूप में -7 के बाद से t, f, nउपयोग किया जाता है।
tsh

1
@tsh यह नहीं है कि मैं स्कोरिंग सिस्टम को कैसे समझूं; यह स्पष्ट रूप से परिभाषा में नाम को शामिल नहीं करता है, हालांकि उपयोग में नाम 1 बाइट की लागत है।
नील

आप फ़ंक्शन नाम है कि अपने कोड द्वारा कहा जाता है (के लिए बाइट छूट दावा नहीं कर सकते @Neil t, fऔर nअपने मामले में)।
21

2
@asgallant नहीं। यह नाम और 1 बाइट के लिए कोई बाइट्स नहीं है जब इसे बाद में उपयोग किया जाता है। 'T fnaox i' कोई बाइट्स नहीं हैं, बाद में उपयोग किए जाने पर 1 बाइट। मैं पठनीयता में सुधार करना चाहता था, लेकिन अब मुझे एहसास हुआ कि मुझे इसे पूरी तरह से छोड़ देना चाहिए था और अब इसे बदलने में बहुत देर हो चुकी है
रयान शेफर

@ रेयानशर्फर वह नियम कहां है? मैंने ऐसा कभी नहीं देखा है।
16

6

पायथन 2 , 133 - 6 = 127 94 बाइट्स

exec"t!u;f!v;n!u(f,t);a!u(v,f);o!u(t,v);x!u(n(v),v);i!o(v,n(u))".replace('!','=lambda u,v=0:')

इसे ऑनलाइन आज़माएं!

बेशर्मी से जोनाथन एलन के जवाब के पीछे डरपोक विचार चोरी ; हालांकि कोई बाइट्स नहीं काटा गया।


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

मैं चाहता हूं कि हालांकि इसका जवाब हां में है, यह अजगर में काफी लंबा होगा।
असंबंधित स्ट्रिंग

मैं सही खड़ा हूँ
असंबंधित स्ट्रिंग

@ Mr.Xcoder आप सही हैं, मेरे पास उदाहरण फ़ंक्शन के लिए बाइट्स की गलत संख्या थी। हालांकि उन्हें कार्यों के नामों के लिए 6 बाइट निकालने की अनुमति होगी।
रयान शेफर

@श्री। Xcoder: आपकी टिप्पणियों के अनुसार संशोधित।
चास ब्राउन

4

जे , 67 बाइट्स - 7 = 60

t=.[
f=.]
n=.~
a=.2 :'u v]'
o=.2 :'[u v'
x=.2 :'u~v u'
i=.2 :'v u['

इसे ऑनलाइन आज़माएं!

ध्यान देने योग्य:

कार्यात्मक भाषा में J की तुलना में उच्च क्रम फ़ंक्शन अलग तरीके से काम करते हैं। 1 या 2 मौजूदा क्रियाओं से एक नई क्रिया बनाने के लिए, आपको एक क्रिया विशेषण (1 के मामले में) या एक संयोजन (2 के मामले में) का उपयोग करने की आवश्यकता है।

सिंथेटिक, क्रिया विशेषण एक क्रिया के बाद आते हैं, और संयुग्मन उनके बीच जाते हैं। इस प्रकार fआप एक क्रिया "नहीं" करते हैं f n, और "और" क्रिया fऔर g, आप f a g


4

वोल्फ्राम भाषा (गणितज्ञ) , 61-7 = 54 बाइट्स

t=#&
f=#2&
a=#2~#~f&
o=t~#~#2&
n=f~#~t&
x=n@#~#2~#&
i=#2~#~t&

इसे ऑनलाइन आज़माएं!

अन-golfed: से प्रेरित विकिपीडिया ,

t[x_, y_] := x
f[x_, y_] := y
and[x_, y_] := x[y, f]
or[x_, y_] := x[t, y]
not[x_] := x[f, t]
xor[x_, y_] := y[not[x], x]
imply[x_, y_] := x[y, t]

बहुत यकीन है कि नई परिभाषाएँ फ़ंक्शन परिभाषाओं को अलग करने के लिए आवश्यक हैं। इसके अलावा आप अन्य फ़ंक्शन परिभाषाओं में tf और n का संदर्भ देते हैं ताकि आप उन लोगों को घटा न सकें, इसलिए 61-4 = 57।
जोनाथन एलन

@JonathanAllan मैंने स्कोरिंग निर्देशों को फिर से पढ़ा है और इस बात से सहमत हूं कि नई सूचियों को गिनना चाहिए, धन्यवाद। मैं आपके दूसरे भाग से असहमत हूं: जब मैं नामों का पुन: उपयोग करता हूं, तो मैं वास्तव में उन्हें "1 बाइट की ओर उस गेट के बाइट कुल की ओर गिनता हूं", जो कि यहां निहित है क्योंकि मैं 1-बाइट नामों का उपयोग करता हूं। जैसा कि मेरे निर्देशों के पढ़ने के बाद, मूल परिभाषा के कुल की ओर एक बाइट के रूप में उन्हें आगे गिनने का कोई उल्लेख नहीं है। इसलिए मैं एन -7 बाइट्स के साथ जा रहा हूं। साथ ही, ओपी की एक अन्य टिप्पणी स्पष्ट करती है: "यह नाम और 1 बाइट के लिए कोई बाइट नहीं है जब इसे बाद में उपयोग किया जाता है।"
रोमन

मैं "1 बाइट बाद में" पढ़ता हूं, जिसका अर्थ है कि दूसरे फ़ंक्शन के भीतर उपयोग करने के लिए एक बाइट खर्च होती है। यह दूसरों के साथ भी कैसे स्कोर किया है के साथ संरेखित करता है।
जोनाथन एलन

@JonathanAllan मुझे एक्साइजिस में कम दिलचस्पी है और कोड गोल्फिंग में अधिक
रोमन

4

अंडरलोड , 56 52 बाइट्स

(~!)(!)((~)~*):((!)~^)*(:^)(~(!)~^(~)~*)(()~(~)~^~*)

इसे ऑनलाइन आज़माएं! (कार्यक्रम के कुछ हिस्सों की जाँच और पाठ की पहचान करना शामिल है)

यह आश्चर्यजनक रूप से बहुत कम स्तर के एसोलंग के लिए आश्चर्यजनक है। (चर्च अंक, चर्च बूलियन, इत्यादि का उपयोग आमतौर पर अंडरलोड में इस कारण से किया जाता है; भाषा में नंबर और बूलियन नहीं बने होते हैं, और यह उन्हें अनुकरण करने के आसान तरीकों में से एक है। उन्होंने कहा, यह भी आम है। चर्च संख्या 0 और 1. के रूप में बूलियन को सांकेतिक शब्दों में बदलना)

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

व्याख्या

सच

(~!)
(  )  Define function:
 ~      Swap arguments
  !     Delete new first argument (original second argument)

यह काफी सीधा है; हम उस तर्क से मुक्त हो जाते हैं जो हम नहीं चाहते हैं और हम जो तर्क चाहते हैं वह सिर्फ वहीं रहता है, जो रिटर्न मान के रूप में कार्य करता है।

असत्य

(!)
( )   Define function:
 !      Delete first argument

यह एक और भी सीधा है।

नहीं

((~)~*)
(     )  Define function:
    ~*     Modify first argument by pre-composing it with:
 (~)         Swap arguments

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

तथा

:((!)~^)*
 (     )   Define function:
     ~^      Execute its first argument with:
  (!)          false
               {and implicitly, our second argument}
        *  Edit the newly defined function by pre-composing it with:
:            {the most recently defined function}, without destroying it

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

यहां परिभाषा है and x y = (not x) false y। दूसरे शब्दों में, अगर not x, फिर हम लौटते हैं false; अन्यथा, हम लौट जाते हैं y

या

(:^)
(  )  Define function:
 :      Copy the first argument
  ^     Execute the copy, with arguments
          {implicitly, the original first argument}
          {and implicitly, our second argument}

@ निट्रोडन ने उन टिप्पणियों में बताया जो or x y = x x yसामान्य रूप से कम है or x y = x true y, और जो अंडरलोड में भी सही है। इसका एक निष्प्रभावी कार्यान्वयन होगा (:~^), लेकिन हम एक अतिरिक्त बाइट को ध्यान में रखते हुए यह कह सकते हैं कि इससे कोई फर्क नहीं पड़ता कि हम मूल प्रथम तर्क को चलाते हैं या उसकी प्रति, परिणाम भी उसी तरह है।

अंडरलोड वास्तव में सामान्य अर्थों में करी का समर्थन नहीं करता है, लेकिन इस तरह की परिभाषाएं इसे वैसा ही दिखती हैं जैसा कि यह करती है! (चाल यह है कि गैर-खपत वाले तर्क बस चारों ओर चिपक जाते हैं, इसलिए आप जिस फ़ंक्शन को कॉल करते हैं, वह उन्हें अपने स्वयं के तर्कों के रूप में व्याख्या करेगा।)

का तात्पर्य

(~(!)~^(~)~*)
(           )  Define function:
 ~               Swap arguments
     ~^          Execute the new first (original second) argument, with argument:
  (!)              false
                   {and implicitly, our second argument}
       (~)~*     Run "not" on the result

यहां इस्तेमाल की गई परिभाषा है implies x y = not (y false x) । यदि y सत्य है, तो यह सरल हो जाता है not false, अर्थात true। यदि y गलत है, तो यह सरल हो जाता है not x, इस प्रकार हमें वह सत्य तालिका प्रदान करता है जो हम चाहते हैं।

इस मामले में, हम notइस बार फिर से उपयोग कर रहे हैं , इसके कोड को फिर से संदर्भित करने के बजाय इसे फिर से लिखना। यह सीधे (~)~*चारों ओर कोष्ठक के बिना के रूप में लिखा है, इसलिए इसे परिभाषित करने के बजाय कहा जाता है।

XOR

(()~(~)~^~*)
(          )  Define function:
   ~   ~^       Execute the first argument, with arguments:
    (~)           "swap arguments"
 ()               identity function
         ~*     Precompose the second argument with {the result}

इस बार, हम अपने दो तर्कों में से केवल एक का मूल्यांकन कर रहे हैं, और इसका उपयोग यह निर्धारित करने के लिए करते हैं कि दूसरे तर्क पर क्या लिखें। अंडरलोड आपको तेजी से और ढीलेपन से खेलने देता है, इसलिए हम पहले तर्क का उपयोग दो दो-तर्क दो-रिटर्न कार्यों के बीच चयन करने के लिए कर रहे हैं; तर्क स्वैप करता है जो उन दोनों को वापस करता है, लेकिन विपरीत क्रम में, और पहचान फ़ंक्शन जो उन दोनों को उसी क्रम में वापस करता है।

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


or x y = x x yकुछ बाइट्स बचाता है or x y = x true y
नाइट्रोडॉन

अंडरलोड अक्सर काउंटर-सहज ज्ञान युक्त होता है जब यह शाब्दिक रूप से पुन: उपयोग किए गए चर के साथ आता है, लेकिन इस मामले में, यह परिवर्तन कम होने के बजाय अपेक्षा से अधिक बाइट्स को बचाने के लिए निकलता है। सुधार के लिए धन्यवाद!
ais523


3

जावा 8, स्कोर: 360 358 319 271 233 (240-7) बाइट्स

interface J<O>{O f(O x,O y,J...j);}J t=(x,y,j)->x;J f=(x,y,j)->y;J n=(x,y,j)->j[0].f(y,x);J a=(x,y,j)->j[0].f(j[1].f(x,y),y);J o=(x,y,j)->j[0].f(x,j[1].f(x,y));J x=(x,y,j)->j[0].f(j[1].f(y,x),j[1].f(x,y));J i=(x,y,j)->j[0].f(j[1].f(x,y),x);

जब मैंने इसे शुरू किया था, तो मैंने जितना सोचा था, उसे पूरा करने के लिए यह मुश्किल था implies। वैसे भी, यह काम करता है .. शायद यहाँ और वहाँ थोड़ा गोल्फ हो सकता है। संपादित करें: ठीक है, फ़ंक्शंस का फिर से उपयोग नहीं कर रहा है, लेकिन जावा के लिए बाइट-काउंट के संदर्भ में केवल एक ही दृष्टिकोण को डुप्लिकेट करना बहुत सस्ता है .. और मुझे किसी भी फ़ंक्शन का उपयोग नहीं करने के लिए पूर्ण -7 बोनस मिलता है।

इसे ऑनलाइन आज़माएं।

स्पष्टीकरण:

// Create an interface J to create lambdas with 2 Object and 0 or more amount of optional
// (varargs) J lambda-interfaces, which returns an Object:
interface J<O>{O f(O x,O y,J...j);}

// True: with parameters `x` and `y`, always return `x`
J t=(x,y,j)->x;
// False: with parameters `x` and `y`, always return `y`
J f=(x,y,j)->y;

// Not: with parameters `x`, `y`, and `j` (either `t` or `f`), return: j(y, x)
J n=(x,y,j)->j[0].f(y,x);

// And: with parameters `x`, `y`, and two times `j` (either `t` or `f`), return:
//      j1(j2(x,y), y);
J a=(x,y,j)->j[0].f(j[1].f(x,y),y);

// Or: with parameters `x`, `y`, and two times `j` (either `t` or `f`), return:
//     j1(x, j2(x,y))
J o=(x,y,j)->j[0].f(x,j[1].f(x,y));

// Xor: with parameters `x`, `y`, and two times `j` (either `t` or `f`), return:
//      j1(j2(y,x), j2(x,y))
J x=(x,y,j)->j[0].f(j[1].f(y,x),j[1].f(x,y));

// Implies: with parameters `x`, `y`, and two times `j` (either `t` or `f`), return:
//          j1(j2(x,y), x)
J i=(x,y,j)->j[0].f(j[1].f(x,y),x);

2

सी ++ 17, 207 49 = 158 195 - 58 = 137 बाइट्स

लाइनब्रेक अनावश्यक हैं (पहले दो के अलावा)।

#define A auto
#define D(v,p)A v=[](A x,A y){return p;};
D(true_,x)
D(false_,y)
A not_=[](A f){return f(false_,true_);};
D(and_,x(y,false_))
D(or_,x(true_,y))
D(xor_,x(not_(y),y))
D(implies,x(y,true_))

इसे ऑनलाइन आज़माएं!

इकाई-परीक्षण जैसे कि

static_assert('L' == true_('L', 'R'));
static_assert('R' == not_(true_)('L', 'R'));
static_assert('L' == and_(true_, true_)('L', 'R'));
static_assert('L' == or_(true_, true_)('L', 'R'));
static_assert('R' == xor_(true_, true_)('L', 'R'));
static_assert('L' == implies(true_, true_)('L', 'R'));

अद्यतन: पूर्व में मेरे पास था

A not_=[](A f){return[f](A x,A y){return f(y,x);};};

लेकिन रोमन के जवाब ने छोटे संस्करण का रास्ता बताया। ध्यान दें कि अब not_(std::plus<>)बीमार है, जहां पहले यह बराबर था std::plus<>; लेकिन जब से std::plus<>"एक चर्च बूलियन का प्रतिनिधित्व नहीं करता है," मुझे लगता है कि नियमों द्वारा या तो व्यवहार ठीक है।


"पहले एक के अलावा अन्य" को "पहले दो के अलावा अन्य" के लिए अद्यतन नहीं किया जाना चाहिए?
एलएफ

@ एलएफ: बिल्कुल सही। अपडेट किया गया। :)
Quuxplusone

2

फोर्थ (gforth) , 133 बाइट्स - 7 = 126 122

: j execute ;
: t drop ;
: f nip ;
: n ['] f ['] t rot j ;
: a dup j ;
: o over j ;
: x 2dup a n -rot o a ;
: m over n -rot a o ;

इसे ऑनलाइन आज़माएं!

-4 बाइट्स क्वक्सप्लोन के लिए धन्यवाद

प्रारंभ में मैंने मैक्रो और शाब्दिक जैसी चीजों पर विचार करते हुए इसे काफी हद तक समाप्त कर दिया, लेकिन तब मुझे महसूस हुआ कि अगर मैं चीजों को सही और गलत के रूप में परिभाषित करता हूं (जैसे कि मुझे पहली जगह में करना चाहिए था), तो यह बहुत सरल हो जाता है।

कोड स्पष्टीकरण

\ Helper function to save some bytes
: j        \ define a new word
  execute  \ execute the word at the provided address
;          \ end word definition

\ True
: t        \ define a new word
  drop     \ drop the second argument
;          \ end the word

\ False
: f        \ define a new word
  nip      \ drop the first argument
;          \ end the word

\ Not - The "hardest" one because we have to reference true and false directly
: n        \ define a new word
  ['] f    \ get address of false
  ['] t    \ get the address of true
  rot      \ stick the input boolean back on the top of the stack
  j        \ call the input boolean, which will select the boolean to return
;          \ end the word

\ And 
: a        \ define a new word
  dup      \ duplicate the 2nd input value
  j        \ call the 2nd input on the first and second input
;          \ end the word

\ Or
: o        \ define a new word
  over     \ duplicate the 1st input value
  j        \ call the 1st input on the first and second input
;          \ end the word

\ Xor
: x        \ define a new word
  2dup     \ duplicate both of the inputs
  a n      \ call and, then not the result (nand)
  -rot     \ move the result behind the copied inputs
  o a      \ call or on the original inputs, then call and on the two results
;          \ end the word

\ Implies
: m        \ define a new word
  over     \ duplicate the 1st input value
  n        \ call not on the 1st input value
  -rot     \ move results below inputs
  a o      \ call and on the two inputs, then call or on the two results
;          \ end the word

1
आप लंबे शब्द को executeतीन बार दोहराते हैं । शॉर्टहैंड : j execute ;को परिभाषित करने से आप 4 बाइट बचा सकते हैं।
क्क्सप्लसोन

1

एसकेआई-कैलकुलस + सी कॉम्बिनेटर, 36 बाइट्स

true=K
false=SK
not=C
and=CC(SK)
or=CIK
xor=C(CIC)I
implies=CCK

मुझे वास्तव में किसी भी दुभाषिया का पता नहीं है, जो आपको पिछले वाले के संदर्भ में अतिरिक्त संयोजकों को परिभाषित करने की अनुमति देता है, इसलिए मुझे वांछित कॉम्बीनेटरों जैसे उदाहरणों में दिखाते हुए http://ski.aditsu.net/ का उपयोग करके यह परीक्षण करना पड़ा , मतलब नहीं है ।CCKK(SK)pqqKSK


1

जूलिया 1.0 , 36 बाइट्स

(b::Bool)(x,y)=b ? x : y;i(x,y)=!x|y

मुझे नहीं पता कि क्या मायने रखता है, मैं वास्तव में सिर्फ देशी को ओवरलोड कर रहा हूं Bool प्रकार को , इसलिए मुझे अधिकांश लॉजिक गेट मुफ्त में मिलते हैं। दुर्भाग्य से, जूलिया के पास एक impliesगेट नहीं है , इसलिए मुझे अपना कार्य लिखना पड़ा।

इसे ऑनलाइन आज़माएं!


मुझे लगता है कि आपको अभी भी अपने प्रस्तुत करने में अतिभारित ऑपरेटरों को शामिल करने की आवश्यकता है ... लेकिन स्कोरिंग उन्हें नहीं गिनता है, क्योंकि वे सिर्फ नाम हैं? तो यह newlines से +6 बाइट्स होगा ? मुझे यकीन नहीं है कि स्कोरिंग इस चुनौती के साथ कैसे काम करती है
जो किंग

मुझे 100% यकीन नहीं है कि यह या तो कैसे काम करता है, लेकिन कोड को शामिल करने का मतलब है कि शाब्दिक रूप से मेरे लिए कोई मतलब नहीं है।
user3263164

यहां तक ​​कि अगर कोड पहले से ही घोषित है, तो आपको अभी भी इसे शामिल करना होगा, अन्यथा हर दूसरी गोल्फिंग भाषा को शून्य बाइट्स दिया जाएगा। आपको बस इसे कुछ भी करने की ज़रूरत नहीं है
जो किंग


1

सी ++ 17, 202 ++ 49 = 153 193 - 58 = 135 बाइट्स

वैसे भी 2-एरी फ़ंक्शन के रूप में क्या मायने रखता है, की टिप्पणी-चर्चा से प्रेरित होकर, यहां मेरे पिछले सी -17 समाधान का एक करी संस्करण है। यह वास्तव में कम है क्योंकि हम not_सभी अन्य कार्यों को परिभाषित करने के लिए उसी मैक्रो का उपयोग कर सकते हैं !

#define D(v,p)auto v=[](auto x){return[=](auto y){return p;};};
D(true_,x)
D(false_,y)
D(not_,x(false_)(true_)(y))
D(and_,x(y)(false_))
D(or_,x(true_)(y))
D(xor_,x(not_(y))(y))
D(implies,x(y)(true_))

इसे ऑनलाइन आज़माएं!

इस एक परीक्षण की तरह के साथ किया जाता है

static_assert('R' == and_(true_)(false_)('L')('R'));
static_assert('L' == or_(true_)(false_)('L')('R'));

सूचना जो or_प्रभावी रूप से परिभाषित की गई है

auto or_=[](auto x){return[=](auto y){return x(true_)(y);};};

हम or_अधिक "संक्षिप्त" के रूप में परिभाषित कर सकते हैं

auto or_=[](auto x){return x(true_);};

लेकिन यह हमें महंगा होगा क्योंकि हम Dअब मैक्रो का उपयोग करने के लिए नहीं मिलेगा ।


सी के बाद से ++ केस-संवेदी है, कैसे उपयोग करने के बारे Trueऔर Falseके बजाय true_और false_? और अन्य ऑपरेटरों के लिए समान है। जिससे 12 बाइट बच जाएंगी।
जी। स्लीपेन

@ G.Sliepen: ओपी का स्कोरिंग एल्गोरिथम पहले से ही ध्यान में रखता है कि पहचानकर्ता प्रभावी रूप से एक वर्ण लंबा है। उद्धरण: "आपकी भाषा में चर्च को सच्चा और झूठा बनाने के लिए आवश्यक कोड की कुल लंबाई और फ़ंक्शन के नाम को छोड़कर और नहीं या xor और चर्च के गेट्स का अर्थ है (उदाहरण के लिए, गलत = lambda x, y: y, Python में। 13 बाइट्स होंगे)। आप बाद में अपने कोड में इन नामों का पुनः उपयोग कर सकते हैं , उनके साथ उस गेट के बाइट की ओर 1 बाइट गिन सकते हैं । "
क्क्सप्लसोन

आह, मुझे वह याद आया।
जी। स्लीपेन

0

एपीएल (डीज़िमा / एपीएल) , 47 बाइट्स एसबीसीएस

जोनाह जे समाधान पर आधारित है ।

true तथा false इन्फिक्स फ़ंक्शन हैं, notएक प्रत्यय ऑपरेटर है, और बाकी इन्फिक्स ऑपरेटर हैं।

true←⊣
false←⊢
and←{⍺(⍶⍹false)⍵}
not←⍨
or←{⍺(true⍶⍹)⍵}
xor←{⍺(⍶not⍹⍶)⍵}
implies←{⍺(⍹⍶true)⍵}

ओपी के अनुसार, यह प्रत्येक पंक्ति के अंत तक और सब कुछ शामिल करता है, और प्रत्येक कॉल को पिछले बाइट के रूप में गिनता है।

इसे ऑनलाइन आज़माएं!

सत्य और असत्य बाएँ और दाएँ पहचान कार्य हैं।

not बस अपने ऑपरेंड फ़ंक्शन के तर्कों को स्वैप करता है।

बाकी निर्णय पेड़ लागू करें:

andयदि सही है, तो बाएं फ़ंक्शन के परिणाम का चयन करने के लिए दाहिने फ़ंक्शन का उपयोग करता है, अन्यथा falseफ़ंक्शन का परिणाम ।

orयदि सही का चयन करने के लिए बाएंहैंड फ़ंक्शन का उपयोग करता है, तो सहीहैंड फ़ंक्शन का trueपरिणाम

xorयदि सही है, तो बाएं बाएं फ़ंक्शन के नकारात्मक परिणाम का चयन करने के लिए दाहिने फ़ंक्शन का उपयोग करता है, या बाएं फ़ंक्शन ⍶notके परिणाम का उपयोग करता है।

impliesदाहिने फ़ंक्शन के परिणाम का चयन करने के लिए बाएंहैंड फ़ंक्शन का उपयोग करता है यदि सही है, तो फ़ंक्शन का परिणाम true


0

स्टैक्स , 34 बाइट्स

¿S£↓♣└²≡é♫Jíg░EèΩRΦ♂°┤rà╝¶πï╡^O|Θà

भागो और इसे staxlang.xyz पर डीबग करें!

ढेर का एक गुच्छा धक्का देता है। प्रत्येक ब्लॉक को अपने अंतिम तर्क की उम्मीद है कि वह स्टैक के ऊपर है, बाकी के द्वारा रिवर्स ऑर्डर में।

अनपैक्ड (41 बाइट्स):

{sd}Y{d}{y{d}a!}X{ya!}{b!}{cx!sa!}{sx!b!}

प्रत्येक जोड़ी { }एक ब्लॉक है। मैंने दो रजिस्टरों X और Y को धारण करने के लिए उपयोग किया trueऔर notइसलिए मैं बाद में उन्हें आसानी से एक्सेस कर सका। दुर्भाग्य से, falseबस एक नो-ऑप नहीं हो सकता है, क्योंकि यह स्टैक को अव्यवस्थित छोड़ देगा और एक एकल XOR केस को गड़बड़ कर देगा।

टेस्ट सूट, टिप्पणी की

false
{sd}    stack:   x y
 s      swap:    y x
  d     discard: y

true
{d}    stack:   x y
 d     discard: x

not
{y{d}a!}    stack:  p
 y{d}       push:   p f t
     a      rotate: f t p
      !     apply:  p(f,t)

and
{ya!}    stack:  p q
 y       push:   p q f
  a      rotate: q f p
   !     apply:  p(q,f)

or
{b!}    stack:  p q
 b      copies: p q p q
  !     apply:  p q(q,p)

xor
{cx!sa!}    stack:  p q
 c          copy:   p q q
  x!        not:    p q nq
    s       swap:   p nq q
     a      rotate: nq q p
      !     apply:  p(nq,q)

implies
{sx!b!}    stack:  p q
 s         swap:   q p
  x!       not:    q np
    b      copies: q np q np
     !     apply:  q np(np,q)

0

बेफुंज -98 , 105 77 65 बाइट्स

फ़ंक्शंस के बिना भाषाओं में "फ़ंक्शन" की धारणा के साथ आगे खेलना ... यहां चर्च बूलियंस का एक बेफ़ुज -98 संस्करण है!

Befunge-98 की इस विवश बोली में, एक प्रोग्राम में "लाइन" या "फ़ंक्शन" की एक श्रृंखला शामिल है, जिनमें से प्रत्येक >कॉलम x = 0 में एक (गो राइट) निर्देश के साथ शुरू होता है । प्रत्येक "फ़ंक्शन" को उसके लाइन नंबर (y- समन्वय) से पहचाना जा सकता है। फ़ंक्शंस हमेशा की तरह Befunge के स्टैक के माध्यम से इनपुट ले सकते हैं ।

लाइन 0 विशेष है, क्योंकि (0,0) शुरुआती आईपी है। लाइन एल को निष्पादित करने वाला प्रोग्राम बनाने के लिए, बस लाइन 0 पर निर्देश रखें, जिसे निष्पादित करते समय, निर्देश सूचक को (x = L, y = 0) पर उड़ान भरें।

जादू लाइन 1 पर होता है। लाइन 1, जब निष्पादित किया जाता है, Lतो स्टैक से एक नंबर को पॉप करता है और लाइन नंबर पर कूदता है L। (यह लाइन पहले से थी > >>0{{2u2}2}$-073*-\x, जो किसी भी लाइन के लिए "पूर्ण छलांग" हो सकती है, लेकिन मुझे सिर्फ यह पता चला है कि जब से मुझे पता है कि यह रेखा पंक्ति 1 के लिए आंकी गई है, हम L-1बहुत कम कोड की एक बिल्ली में "रिश्तेदार कूद" कर सकते हैं ।)

लाइन 2 चर्च का प्रतिनिधित्व करता है FALSE। निष्पादित होने पर, यह दो नंबर tऔर fस्टैक से पॉप करता है और फिर लाइन नंबर पर उड़ान भरता है f

पंक्ति 3 चर्च का प्रतिनिधित्व करती है TRUE। निष्पादित होने पर, यह दो नंबर tऔर fस्टैक से पॉप करता है और फिर लाइन नंबर पर उड़ान भरता है t

चर्च का प्रतिनिधित्व करने वाली लाइन 6, XORअभिनव है। जब निष्पादित किया जाता है, तो यह दो नंबर aऔर bस्टैक से पॉप करता है, और फिर aस्टैक इनपुट के साथ लाइन में उड़ान भरता है NOT EXEC b। इसलिए, यदि aचर्च का प्रतिनिधित्व करता है TRUE, का परिणाम a NOT EXEC bहोगा NOT b; और यदि aचर्च का प्रतिनिधित्व करता है FALSE, का परिणाम a NOT EXEC bहोगा EXEC b


यहां टेस्ट हार्नेस के साथ अनगुल्ड वर्जन है। लाइन 0 पर, अपने इनपुट के साथ स्टैक सेट करें। उदाहरण के लिए, 338साधन IMPLIES TRUE TRUE। सुनिश्चित करें कि समापन xबिल्कुल (x, y) = (0,15) पर दिखाई देता है या फिर कुछ भी काम नहीं करेगा! यह भी सुनिश्चित करें कि आपका स्टैक सेटअप शुरू होता है ba, ताकि प्रोग्राम वास्तव में कुछ आउटपुट के साथ समाप्त हो जाए।

इसे ऑनलाइन आज़माएं!

>  ba 334  0f-1x
> >>1-0a-\x             Line 1: EXEC(x)(...) = goto x
> $^< <            <    Line 2: FALSE(t)(f)(...) = EXEC(f)(...)
> \$^                   Line 3: TRUE(t)(f)(...) = EXEC(t)(...)
> 3\^                   Line 4: OR(x)(y)(...) = EXEC(x)(TRUE)(y)(...)
> 3\2\^                 Line 5: NOT(x)(...) = EXEC(x)(FALSE)(TRUE)(...)
> 1\5\^                 Line 6: XOR(x)(y)(...) = EXEC(x)(NOT)(EXEC)(...)
> 2>24{\1u\1u\03-u}^    Line 7: AND(x)(y)(...) = EXEC(x)(y)(FALSE)(...)
> 3^                    Line 8: IMPLIES(x)(y)(...) = EXEC(x)(y)(TRUE)(...)

> "EURT",,,,@
> "ESLAF",,,,,@

यहाँ वह संस्करण है जिसकी बाइट्स मैंने गिना था।

>>>1-0a-\x
>$^<< }u-30\<
>\$^
>3\^\
>3\2^
>1\5^
>2>24{\1u\1u^
>3^

ध्यान दें कि इस बोली में एक फ़ंक्शन को परिभाषित करने के लिए आप इसके नाम का उल्लेख नहीं करते हैं; इसका "नाम" इसके स्रोत स्थान से निर्धारित होता है। किसी फ़ंक्शन को कॉल करने के लिए, आप इसके "नाम" का उल्लेख करते हैं; उदाहरण के लिए, XOR( 6) NOTऔर EXEC( 5और 1) के संदर्भ में परिभाषित किया गया है । लेकिन मेरे सभी "फ़ंक्शन नाम" पहले से ही प्रतिनिधित्व करने के लिए केवल एक बाइट लेते हैं। तो इस समाधान को कोई स्कोरिंग समायोजन नहीं मिलता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.