प्रीस्टाइन बिट जाँच


28

एक प्रोग्राम / फ़ंक्शन लिखिए जो कि से 255 समावेशी में दो पूर्णांकों को लेता है , और रिटर्न करता है कि क्या संख्याओं के द्विआधारी रूप बिल्कुल अलग हैं।0255

उदाहरण के लिए, और में द्विआधारी रूप हैं और , जो एक सा है। इसी तरह और हैं10000000010000000015224010011000000011000 , और इसलिए वे सच होते हैं।

हालाँकि , आपका कोड प्राचीन होना चाहिए, जैसे कि यदि आपके प्रोग्राम में कोई भी एक बिट फ़्लिप करता है, तो उसे एक त्रुटि फेंकनी चाहिए। उदाहरण के लिए, यदि आपका प्रोग्राम सिंगल बाइट थाa(01100001 ) था, तो सभी 8 संभावित संशोधित प्रोग्राम:

á ! A q i e c `

एक त्रुटि फेंकनी चाहिए। सुनिश्चित करें कि आप बाइट्स द्वारा संशोधित कर रहे हैं (उदाहरण के áलिए वहाँ वास्तव में बाइट प्रतिनिधित्व कर रहा है225 , वास्तविक दो बाइट चरित्र नहीं á)।

परीक्षण के मामलों:

0,1     => Truthy
1,0     => Truthy
152,24  => Truthy
10,10   => Falsey
10,11   => Truthy
11,12   => Falsey
255,0   => Falsey

नियम:

  • एक परीक्षण ढांचा प्रदान करें जो यह सत्यापित कर सके कि आपका कार्यक्रम ठीक तरह से प्राचीन है, क्योंकि बहुत सारे संभावित कार्यक्रम (बाइट्स की संख्या * 8) होंगे, या अन्यथा प्राचीनता का पूरा प्रमाण होगा।
    • कृपया सुनिश्चित करें कि आपके द्वारा पोस्ट करने से पहले आपका प्रोग्राम मान्य है।
  • आउटपुट के लिए या तो सत्य / गलत होना चाहिए (या तो रास्ता ठीक है), या फिर दो अलग गैर-त्रुटि मान
  • त्रुटियां रनटाइम, कंपाइलर, इंटरप्रेटर आदि हो सकती हैं।

7
किसी के लिए एक तरह से उनके समाधान के सभी संभव रूपांतरों उत्पन्न करने के लिए की तलाश में हैं, तो यह Japt कार्यक्रम चाहिए : (किसी दोहरी जांच के लिए कृपया) काम करते हैं petershaggynoble.github.io/Japt-Interpreter/...
शैगी

4
यहाँ एक पायथन में भी है: इसे ऑनलाइन आज़माएं!
10

कार्य की अनुमति नहीं है, क्योंकि आपने कार्यक्रम का उल्लेख किया है?
केविन क्रूज़सेन

5
@ केविनक्रूजसेन मैंने निर्दिष्ट किया है कि फ़ंक्शन सबमिशन ठीक है
जो किंग

4
उस टिप्पणी में +1मेरे हाल के समाधानों के बहुमत से अधिक है ! : \
झबरा

जवाबों:


16

पायथन 2 , 35 बाइट्स

lambda a,b:(a^b)&-(a^b)in[a^b or[]]

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

झूठी सकारात्मकता को n&-n==nखत्म करते हुए, पावर-ऑफ-टू चेक का उपयोग करता है n==0

संदर्भ के लिए, ये एक-चार बाइनरी ऑपरेटरों की जोड़ियां हैं जो एक-दूसरे से अलग हैं, जिससे उनका उपयोग करना मुश्किल हो जाता है:

+ /
- /
* +
% -
< |
< >

सौभाग्य से, &और ^इनमें से नहीं हैं।

यह भी ध्यान दें कि ==बन सकता है <=, और +टिप्पणी चरित्र बन सकता है #


पायथन 2 , 41 बाइट्स

lambda a,b:bin(a^b).count(`+True`)is+True

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

TFeld's को लेना lambda a,b:bin(a^b).count('1')==1और उसे 1 के +Trueऔर ==से बदलकर प्राचीन बनाना है is। 1 बाइट के लिए जो किंग को धन्यवाद।


9

पायथन 2 , 72 67 50 बाइट्स

lambda a,b:sum(map(int,'{:b}'.format(a^b)))is+True

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

-5 बाइट्स, जो किंग के लिए धन्यवाद


सत्य / असत्य के लिए रिटर्न True/ False

कार्यक्रम मूल रूप से समान है lambda a,b:bin(a^b).count('1')==1, लेकिन संख्या और अन्य वर्णों के बिना जो बिट-फ़्लिप होने पर काम करते हैं।

यह सुनिश्चित करके काम करता है कि लगभग सब कुछ एक नामित फ़ंक्शन है (जो सभी काफी प्राचीन हैं)

अंत में प्राचीन परीक्षण एक बिट (हर बिट के लिए) को फ़्लिप करता है, और एक इनपुट पर फ़ंक्शन की कोशिश करता है। यदि वह काम करता है (सही है या नहीं), तो वह भिन्नता मुद्रित होती है। कोई मुद्रित कार्यक्रम = प्राचीन कार्य।


8

जावा 8, 68 61 56 45 बाइट्स

a->b->(a.bitCount(a^b)+"").equals(-~(a^a)+"")

-11 के लिए धन्यवाद बाइट्स @EmbodimentOfIgnorance , की जगह निरंतर java.awt.Font.BOLD साथ -~(a^a)

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

स्पष्टीकरण:

सबसे छोटा आधार कार्य होगा:

a->b->a.bitCount(a^b)==1

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

इसे संशोधित किया गया है, इसलिए संख्यात्मक गणनाओं के लिए इसमें कोई अंक नहीं है =, और न ही इसमें कोई एक +/*ऑपरेंड (इसलिए)+ स्ट्रिंग-कॉन्सेप्टन के लिए ठीक है):

+""और .equalsसे तुलना करने के लिए कर रहे हैं String.equals(String)के बजाय int==int
नोट: Integer.equals(int)यहाँ इस्तेमाल किया जा सकता है, लेकिन दोनों बाइट्स के बजाय आदिम .bitCountऔर java.awt.Font.BOLDआदिम हैं , इसलिए अधिक बाइट्स होंगे, इसलिए हम का उपयोग करने से पहले एक अतिरिक्त को दो में से एक को बदलने के लिए आवश्यक होगा ।intIntegernew Integer(...)Integer.equals


(int) Math.log (Math.E) 21 बाइट्स है
डेटा


@ExpiredData धन्यवाद, वास्तव में बस के साथ एक छोटे से निरंतर पाया java.awt.Font.BOLD, लेकिन आपका Objects.equalsएक अच्छा गोल्फ है, धन्यवाद!
केविन क्रूज़सेन

@ExpiredData वास्तव में, आयात Objectsका हिस्सा है java.util., इसलिए मुझे उस बाइट को गिनना होगा, जिससे मुझे डर लगता है, जिससे 69 बाइट्स
बनते हैं

3
-~(a^a)1 के लिए काम करेंगे ?
अज्ञान

7

सी (जीसीसी) , 56 बाइट्स

d(a,b){return(sizeof((char)d))^__builtin_popcount(a^b);}

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

0यदि जोड़ी 1, गैर-शून्य से भिन्न होती है, तो वापस लौटाता है । सी के लिए थोड़ा असामान्य है, जब तक कि आप इसे वापस लौटने पर विचार न करें EXIT_SUCCESSयदि जोड़ी 1 से भिन्न होती है, तो कोई अन्य मूल्य।

sizeof((char)d))निरंतर उत्पादन करने के लिए उपयोग करता है1फ़ंक्शन नाम को प्राचीन होने के लिए मजबूर करते हुए एक तरीके ।

इसके बाद XORs तर्क के XOR के पॉपकाउंट के साथ 1। सौभाग्य से ^प्रतीक बहुत आसान है, जैसा कि बहुत लंबा पहचानकर्ता है__builtin_popcount

इस बीच, यहाँ समाधान का परीक्षण करने के लिए उपयोग की जाने वाली स्क्रिप्ट है:

#!/bin/bash

SOURCE_FILE=$1
FOOT_FILE=$2
TMP_SRC=temp.c

LENGTH="$(wc -c <"$SOURCE_FILE")"
BITS=$((LENGTH*8))

cat "$SOURCE_FILE" >"$TMP_SRC"
cat "$FOOT_FILE" >>"$TMP_SRC"
if gcc -w $TMP_SRC -o t.out >/dev/null 2>&1; then
    if ./t.out; then
        echo "Candidate solution..."
    else
        echo "Doesn't even work normally..."
        exit
    fi
else
    echo "Doesn't even compile..."
    exit
fi

for i in $(seq 1 $BITS); do
    ./flipbit "$i" <"$SOURCE_FILE" >"$TMP_SRC"
    cat "$FOOT_FILE" >>"$TMP_SRC"
    if gcc -w $TMP_SRC -o t.out >/dev/null 2>&1; then
        echo "Testing flipped bit $i:"
        cat "$TMP_SRC"

        ./t.out >/dev/null 2>&1
        STATUS=$?
        if [ "$STATUS" -eq 0 ]; then
            echo "It works!"
            exit
        elif [ "$STATUS" -eq 1 ]; then
            echo "It doesn't work..."
            exit
        else
            echo "It crashes"
        fi
    fi
done

जो ./flipbitउपकरण मैंने लिखा है जिसका स्रोत बस उपयोग करता है:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    int bittoflip = atoi(argv[1]) - 1;
    int ch;

    while ((ch = fgetc(stdin)) != EOF) {
        if (bittoflip < 8 && bittoflip >= 0) {
            putchar(ch ^ (1 << bittoflip));
        } else {
            putchar(ch);
        }

        bittoflip -= 8;
    }

    return 0;
}

मुश्किल बिट्स थे:

  • व्हॉट्सएप: सभी व्हाट्सएप (न्यूलाइन सहित) में प्राचीन जुड़वाँ हैं जो इसी तरह काम करेंगे
  • तुलना: =यह अच्छी तरह से काम नहीं करता है, क्योंकि यह हर मामले में इसकी तुलना हो सकती है। इसी -तरह अच्छी तरह से काम नहीं करता है। इस प्रकार^ 1 के साथ समानता का दावा करने के लिए उपयोग किया जाता है।
  • परिवर्तनीय नाम: f, b के साथ टकराएगा, इसलिए d को इसके बजाय फ़ंक्शन नाम के रूप में उपयोग करना होगा।

आप ^ऑपरेटर को कैसे रख सकते हैं ? यदि उस पर बिट्स बदल दिए गए थे, तो इसे एक अलग ऑपरेटर बनने से रोकने के लिए क्या है? यह अभी भी संकलित होगा, लेकिन सिर्फ आपको गलत उत्तर देगा। क्या मैं यहाँ "प्राचीन" शब्द के अर्थ के बारे में कुछ गलत समझ रहा हूँ?
कोड़ी ग्रे

4
केवल एक बिट को फ़्लिप करके , कोडपॉइंट 30 में केवल ^किसी एक _\ZVN~Þया अनपेक्षित वर्ण में परिवर्तित किया जा सकता ~है। इनमें से केवल एक ही है जो एक ऑपरेटर है, लेकिन यह केवल एक अपर ऑपरेटर है।
असंबद्ध स्ट्रिंग

1
या के __LINE__बजाय का उपयोग करें sizeof(char)। मुझे लगता है कि यह ठीक है कि आपका फ़ंक्शन आपकी .c फ़ाइल की पंक्ति 1 पर होगा। या यहां तक unixकि TIO पर 1 को परिभाषित किया गया है, और शायद सबसे अन्य लिनक्स।
डिजिटल ट्रॉमा

2
Char-casted sizeof का मुख्य कारण संभवतया dसबसे कम बाइट्स में स्रोत में सेंकना है। अन्यथा d(या जो भी आप फ़ंक्शन का नाम देते हैं) बस बदला जा सकता है और कोड अभी भी काम करेगा। अभ्यस्त काम के (__LINE__)साथ भी d();क्योंकि d();किसी भी अन्य पत्र में बदला जा सकता है और यह अभी भी संकलन करेगा क्योंकि फ़ंक्शन को कभी भी कॉल नहीं करना है, इस प्रकार लिंक नहीं किया गया है।
लम्बदाबेटा

1
@LambdaBeta यदि फ़ंक्शन का नाम बदलता है, तो एक लिंक त्रुटि होगी, भले ही डी स्व-संदर्भात्मक न हो। मुझे लगता है कि यह व्यक्तिगत रूप से पर्याप्त है।
डिजिटल ट्रामा

7

आर , 38 37 बाइट्स

निक केनेडी के लिए -1 बाइट।

dpois(log2(bitwXor(scan(),scan())),T)

इसे ऑनलाइन आज़माएं! (ठीक से TIO की स्थापना के लिए Giuseppe के लिए धन्यवाद।)

प्रमाण है कि यह प्राचीन है ( निक कैनेडी के चेकर का उपयोग करके )।

फाल्सी के लिए आउटपुट 0, और सत्य के लिए एक सकारात्मक मूल्य, जिसे मैं समझता हूं कि स्वीकार्य है क्योंकि आर इन्हें गलत और सत्य के रूप में व्याख्या करेगा।

स्पष्टीकरण: bitwXor(a,b)देता है (पूर्णांक के रूप में) के बीच बिट वाइज XOR aऔर b। यह जांचने के लिए कि क्या यह 2 की शक्ति है, यह जांचें कि इसका आधार 2 में लॉग एक पूर्णांक है। फ़ंक्शन dpoisपॉइसन वितरण की संभाव्यता घनत्व फ़ंक्शन देता है: इसका मान गैर-पूर्णांक मानों के लिए 0 है, और गैर-नकारात्मक पूर्णांक के लिए कुछ सकारात्मक है। Tवहाँ है, क्योंकि dpoisएक दूसरा तर्क (किसी भी सकारात्मक वास्तविक काम करता है की आवश्यकता है, औरT 1 के रूप में व्याख्या की है)।

यदि हम अलग-अलग मानों के आउटपुट पर जोर देते हैं, तो निम्न संस्करण 42 बाइट्स में FALSE या TRUE का उत्पादन करता है (-8 बाइट्स के लिए Giuseppe के लिए धन्यवाद):

dpois(log2(bitwXor(scan(),scan())),T)%in%F

और भी प्राचीन हैइसे ऑनलाइन आज़माएं!


2
अच्छी तरह से मेरा कुछ इतना छोटा होने पर किया! आप एक बाइट (अभी भी प्राचीन) को बचाने के piसाथ बदल सकते हैं T। साथ ही आपका TIO इस समय आपके उत्तर के अनुरूप नहीं है।
निक केनेडी

@NickKennedy धन्यवाद! (और यह जाँच करने के लिए कोड लिखने के लिए धन्यवाद प्राचीन है!)। TIO I से जुड़ा एक संशोधित संस्करण है जो सभी परीक्षण मामलों की जाँच करता है। मैं वास्तविक कोड में एक TIO जोड़ूंगा, लेकिन मैं यह पता नहीं लगा सकता कि TIO को दो कॉल के साथ ठीक से चलाने के लिए कैसे प्राप्त करें scan(); आप एक विचार है? (कोड एक कंप्यूटर पर ठीक काम करता है।)
रॉबिन राइडर

2
@NickKennedy शायद ऐसा कुछ हो ? TIO और मैच के लिए कोड प्राप्त करने के लिए?
गिउसेप्पे

@Giuseppe अद्भुत, धन्यवाद!
रॉबिन राइडर

1
आपके दूसरे संस्करण के Fबजाय exp(-Inf)निक की T:-)
Giuseppe

6

आर , 83 बाइट्स

t(identical(sum(.<-as.double(intToBits(Reduce(bitwXor,scan())))),sum(T^el(.[-T]))))

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

प्रमाण है कि यह प्राचीन है

इस तथ्य के इर्द-गिर्द काम करना as.integer, as.doubleआदि कुछ ही दूर हैं is.integer, is.doubleआदि सबसे कठिन बिट था। अंत में, sum(T^el(.[-T])दोनों को एक बनाने के तरीके के रूप में उपयोग करना और as.doubleएक> 1 लंबाई वेक्टर लौटाने की जाँच करना सबसे अच्छा था जो मैं कर सकता था। लपेटना tइस तथ्य को संभालना है कि अन्यथा identicalबन सकता है ide~tical


5

जूलिया 0.7 , 20 बाइट्स

(a,b)->ispow2(ab)

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

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


xऔर yएक अलग हैं, इसलिए मेरा मानना ​​है कि यह एक काउंटर उदाहरण है। yऔर क्रमशः x1 बिट 9और ऑफ 6हैं।
डेटा

लानत है, जटिल चीजों के बारे में सोचते हुए, मैं बिल्कुल सरल से चूक गया। उम्मीद है, चर बदलने से यह ठीक हो जाएगा।
किरिल एल।

5

सी # (विजुअल सी # इंटरएक्टिव कंपाइलर) , 37 बाइट्स

a=>b=>a!=b&((a^b)&-(a^b)).Equals(a^b)

a=>b=>हिस्सा नहीं बदला जा सकता, वरना समारोह अमान्य है।

में a!=b, =बदला नहीं जा सकता क्योंकि intसकते में परिवर्तित नहीं कियाbool

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


4

सी # (विजुअल C # इंटरएक्टिव संकलक) , 128 101 77 70 61 74 बाइट्स

-27 बाइट्स एससीआई-ओनली के लिए धन्यवाद

a=>b=>{var d=Math.Log(a^b,(int)Math.E);return d.Equals((int)Math.Abs(d));}

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

आपको शाब्दिक का उपयोग किए बिना C # में नंबर प्राप्त करने के लिए काफी रचनात्मक होना होगा। केवल ^ ऑपरेटर का उपयोग करता है। चर a, b सभी एक दूसरे से 1 बिट से अधिक दूर हैं और बाकी सब कुछ एक कीवर्ड / नाम है।


आपको बिट्स की गिनती करने की आवश्यकता नहीं है - अगर यह 1 से 128 के बीच 2 की शक्ति है तो जाँच करना पर्याप्त है
ASCII- केवल

@ ASCII- केवल सौभाग्य की जाँच है कि उचित संख्या में बाइट्स जब हम पूर्णांक का उपयोग नहीं कर सकते हैं और न ही +/*=गणितीय या सत्यापन कार्यों के लिए। ;)
केविन क्रूज़सेन

@KevinCruijssen सी # enums भी :( है। Damnit
ASCII-केवल


1
O_o एक और -24। btw अब आप का उपयोग नहीं करते हैं+
ASCII- केवल

3

जावास्क्रिप्ट (ईएस 6 सख्त मोड में), 61 बाइट्स

(y,z,e)=>eval(`(y${(e='^=z)*!(y&~-y)')!='^=z)*!(y&~-y)'||e}`)

इसे ऑनलाइन आज़माएं! या सुनिश्चित करें कि सभी संशोधित कार्यक्रम गलत हैं


ओह, मेरी समझ में मुझे एहसास हुआ कि मैंने एक कोड गोल्फ लिंक पर क्लिक किया और इस उत्तर को संदर्भ से बाहर देखा और लगभग दिल का दौरा पड़ा। जैसे, OMG NO
मैरी

4
@ मेरी सावधानी! आप केवल प्रमाणित गोल्फ ग्लास वाले इस कोड को देख सकते हैं। अन्यथा, यह आपके रेटिना को जला सकता है। : p
Arnauld


1

MATLAB, 37 बाइट्स

@(c,e)eq(nnz(de2bi(bitxor(c,e))),eye)

क्षमा करें, कोई TIO लिंक नहीं है, क्योंकि मुझे ऑक्टेव के तहत काम करने के लिए टेस्ट सूट नहीं मिल सकता है। कुछ उपयोगी टिप्पणियों के लिए @ExpiredData धन्यवाद।

परीक्षण सूट:

program = '@(c,e)eq(nnz(de2bi(bitxor(c,e))),eye)';
number_of_characters = nnz(program);
success = [];
for character_counter = 0 : number_of_characters
    for bit_no = 1:8
        prog_temp = program;
        if(character_counter > 0)
            prog_temp(character_counter) = bitxor(double(prog_temp(character_counter)),2^(bit_no-1));
        elseif(bit_no<8) % Test the unmodified program once
            continue
        end
        try
            eval(prog_temp);
            eval('ans(2,3)');
            disp(prog_temp)
            success(end+1)=1;   
        catch
            success(end+1)=0;
        end 
    end
end
assert(nnz(success)==1)


@ExpiredData सुझाव के लिए धन्यवाद। मैं numelइसके बजाय MATLAB के लिए चला गया , क्योंकि मेरे टेस्ट सूट ऑक्टेव में काम नहीं कर रहे हैं।
सांची

38 बाइट्स शायद .. मैटलैब लाइसेंस नहीं मिला, लेकिन काम करना चाहिए
एक्सपायर्ड डेटा

1
@ExpiredData धन्यवाद, कोई वास्तव में एक बाइट के साथ बेहतर कर सकता है eye!
Sanchises

1
@ExpiredData मुझे पता है, मैं ऑक्टेव पर बहुत नाराज हूं। लेकिन ओपी टिप्पणियों में पायथन कार्यक्रम का उपयोग करना यह देखना आसान है कि क्या आप समस्याओं के बिना एक नया चरित्र पेश कर सकते हैं।
१२:०४ पर

1

पर्ल 6 , 77 43 बाइट्स

-33 बाइट्स के लिए जो किंग को धन्यवाद।

{elems(i)eq(sum [+^](@_).polymod(+@_ xx*))}

इसके बराबर है

{1 eq(sum [+^](@_).polymod(2 xx*))}

1के रूप में फिर से लिखा गया था elems([""])2के रूप में फिर से लिखा गया था sum(elems([""]),elems([""])); elems(["",""])काम करने के लिए लग सकता है लेकिनelems([""-""]) यह भी मान्य है और परीक्षक को लटका हुआ लगता है।

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


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