संख्याओं को 0 से विभाजित करें


16

हम सभी को हमारे जीवन के कुछ बिंदु पर बताया गया है कि 0 से विभाजित करना असंभव है। और अधिकांश भाग के लिए, वह कथन सत्य है। लेकिन क्या होगा अगर निषिद्ध ऑपरेशन करने का एक तरीका था ? मेरी नई रचना में आपका स्वागत है: b-नोट।

b-नोट थोड़ा काल्पनिक संख्याओं की तरह हैं: इसमें शामिल मुख्य सर्वनाम एक अभिव्यक्ति का प्रतिनिधित्व करता है जो गणितीय रूप से असंभव नहीं है ( √ काi प्रतिनिधित्व करता है)1 )। इस मामले मेंbको अभिव्यक्ति 1 का प्रतिनिधित्व करने के लिए कहा जाएगा10 । यहां से, यह निर्धारित करना आसान है कि क्याx0 बराबर होगा:

x0=x110=xb

काम

0 से एक विभाजन को शामिल करने वाली अभिव्यक्ति को देखते हुए, संदर्भ में सरलीकृत मूल्य का उत्पादन करें । ध्यान दें कि इनपुट उस रूप में होगा n/0जहां n कोई तर्कसंगत संख्या या bदशमलव रूप में कोई -number है। अग्रणी 0s और अनुगामी 0s अभ्यस्त शामिल होंगे।

उदाहरण इनपुट

4/0
1/0
0/0
80/0
-8/0
1.5/0
2.03/0
-1/0
-3.14/0
b/0
3b/0
-b/0
121/0

उदाहरण आउटपुट

4b
b
0
80b
-8b
1.5b
2.03b
-b
-3.14b
b
3b
-b
121b

स्कोर

यह कोड गोल्फ है, इसलिए सबसे कम बाइट जीतती है। मानक खामियों को मना किया जाता है।

लीडरबोर्ड

यहां एक नियमित लीडरबोर्ड और भाषा के अनुसार विजेताओं का अवलोकन करने के लिए एक स्टैक स्निपेट है।

यह सुनिश्चित करने के लिए कि आपका उत्तर दिखाई दे रहा है, कृपया अपना उत्तर शीर्षक मार्कडाउन टेम्पलेट का उपयोग करके शीर्षक के साथ शुरू करें:

# Language Name, N bytes

Nआपके सबमिशन का आकार कहां है। यदि आप अपने स्कोर में सुधार करते हैं, तो आप पुराने अंकों को हेडलाइन में रख सकते हैं , उनके माध्यम से स्ट्राइक करके। उदाहरण के लिए:

# Ruby, <s>104</s> <s>101</s> 96 bytes

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

# Perl, 43 + 2 (-p flag) = 45 bytes

आप भाषा के नाम को एक लिंक भी बना सकते हैं जो लीडरबोर्ड स्निपेट में दिखाई देगा:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


7
मुझे लगता है कि मैंने कुछ गलत कर रहा हूँ, लेकिन अगर b/0 = bउसके बाद अगर मैं द्वारा दोनों भागों को विभाजित bतो 1/0 = 1। क्या मुझे cइस तरह से विभाजित करने के लिए भार की आवश्यकता है ?
मेरा सर्वनाम monicareinstate

4
@ इस तरह से, b/b = 0जब यह सामान्य रूप से होता है (और मुझे पूरा यकीन है कि यह आसानी से सभी विभिन्न स्वयंसिद्धों से सिद्ध होता है) 1 होने की उम्मीद है (अन्यथा, बी का गुणक व्युत्क्रम इसका गुणक व्युत्क्रम नहीं लगता है)। मुझे पूरा यकीन है कि आप बस जोड़कर विभाजन के खिलाफ शून्य नहीं जोड़ सकते हैं b=1/0या इसी तरह कुछ भी।
मेरा सर्वनाम 17

30
वहाँ शून्य से एक कारण विभाजन अपरिभाषित है ... है । तो आपको सभी उदाहरणों को सरल बनाने में सक्षम होना चाहिए (0 के तीसरे को छोड़कर) सिर्फb तक=1=11=33=3130=30=310=3
ज्यादातर हानिरहित

8
क्या 3 के उदाहरण के 0bबजाय आउटपुट नहीं होना चाहिए 0? यदि दो भाव समतुल्य होते तो प्रश्न का कोई आधार नहीं होता
ट्राइकोप्लाक्स

4
सुझाया गया परीक्षण मामला:3.1b/0
jimmy23013

जवाबों:


19

मालबॉल्ज़ अनशाक्लेड (20-ट्रिट रोटेशन वेरिएंट), 3,62e6 बाइट्स

इस उत्तर का आकार अधिकतम पोस्ट करने योग्य प्रोग्राम आकार (eh) से अधिक है, इसलिए कोड मेरे GitHub रिपॉजिटरी में स्थित है (ध्यान दें: CTRL + A और CTRL + C का उपयोग करके कोड को कॉपी न करें, बस राइटक्लिक करें और "इस रूप में सहेजें" तत्व पर क्लिक करें। .. ")।

इसे कैसे चलाया जाए?

यह एक मुश्किल हिस्सा हो सकता है, क्योंकि भोले हास्कल दुभाषिया इसे चलाने के लिए उम्र पर उम्र ले लेंगे। TIO में अच्छे Malbogle Unshackled दुभाषिया हैं, लेकिन दुख की बात है कि मैं इसका (सीमाएं) उपयोग नहीं कर पाऊंगा।

सबसे अच्छा एक जो मुझे मिल सकता है वह है 20-ट्रिट रोटेशन चौड़ाई वाला वैरिएंट, जो बहुत अच्छा प्रदर्शन करता है, तुरंत गणना (बहुत ज्यादा)

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

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

const char* translation = "5z]&gqtyfr$(we4{WP)H-Zn,[%\\3dL+Q;>U!pJS72Fh"
        "OA1CB6v^=I_0/8|jsb9m<.TVac`uY*MK'X~xDl}REokN:#?G\"i@";

typedef struct Word {
    unsigned int area;
    unsigned int high;
    unsigned int low;
} Word;

void word2string(Word w, char* s, int min_length) {
    if (!s) return;
    if (min_length < 1) min_length = 1;
    if (min_length > 20) min_length = 20;
    s[0] = (w.area%3) + '0';
    s[1] = 't';
    char tmp[20];
    int i;
    for (i=0;i<10;i++) {
        tmp[19-i] = (w.low % 3) + '0';
        w.low /= 3;
    }
    for (i=0;i<10;i++) {
        tmp[9-i] = (w.high % 3) + '0';
        w.high /= 3;
    }
    i = 0;
    while (tmp[i] == s[0] && i < 20 - min_length) i++;
    int j = 2;
    while (i < 20) {
        s[j] = tmp[i];
        i++;
        j++;
    }
    s[j] = 0;
}

unsigned int crazy_low(unsigned int a, unsigned int d){
    unsigned int crz[] = {1,0,0,1,0,2,2,2,1};
    int position = 0;
    unsigned int output = 0;
    while (position < 10){
        unsigned int i = a%3;
        unsigned int j = d%3;
        unsigned int out = crz[i+3*j];
        unsigned int multiple = 1;
        int k;
        for (k=0;k<position;k++)
            multiple *= 3;
        output += multiple*out;
        a /= 3;
        d /= 3;
        position++;
    }
    return output;
}

Word zero() {
    Word result = {0, 0, 0};
    return result;
}

Word increment(Word d) {
    d.low++;
    if (d.low >= 59049) {
        d.low = 0;
        d.high++;
        if (d.high >= 59049) {
            fprintf(stderr,"error: overflow\n");
            exit(1);
        }
    }
    return d;
}

Word decrement(Word d) {
    if (d.low == 0) {
        d.low = 59048;
        d.high--;
    }else{
        d.low--;
    }
    return d;
}

Word crazy(Word a, Word d){
    Word output;
    unsigned int crz[] = {1,0,0,1,0,2,2,2,1};
    output.area = crz[a.area+3*d.area];
    output.high = crazy_low(a.high, d.high);
    output.low = crazy_low(a.low, d.low);
    return output;
}

Word rotate_r(Word d){
    unsigned int carry_h = d.high%3;
    unsigned int carry_l = d.low%3;
    d.high = 19683 * carry_l + d.high / 3;
    d.low = 19683 * carry_h + d.low / 3;
    return d;
}

// last_initialized: if set, use to fill newly generated memory with preinitial values...
Word* ptr_to(Word** mem[], Word d, unsigned int last_initialized) {
    if ((mem[d.area])[d.high]) {
        return &(((mem[d.area])[d.high])[d.low]);
    }
    (mem[d.area])[d.high] = (Word*)malloc(59049 * sizeof(Word));
    if (!(mem[d.area])[d.high]) {
        fprintf(stderr,"error: out of memory.\n");
        exit(1);
    }
    if (last_initialized) {
        Word repitition[6];
        repitition[(last_initialized-1) % 6] =
                ((mem[0])[(last_initialized-1) / 59049])
                    [(last_initialized-1) % 59049];
        repitition[(last_initialized) % 6] =
                ((mem[0])[last_initialized / 59049])
                    [last_initialized % 59049];
        unsigned int i;
        for (i=0;i<6;i++) {
            repitition[(last_initialized+1+i) % 6] =
                    crazy(repitition[(last_initialized+i) % 6],
                        repitition[(last_initialized-1+i) % 6]);
        }
        unsigned int offset = (59049*d.high) % 6;
        i = 0;
        while (1){
            ((mem[d.area])[d.high])[i] = repitition[(i+offset)%6];
            if (i == 59048) {
                break;
            }
            i++;
        }
    }
    return &(((mem[d.area])[d.high])[d.low]);
}

unsigned int get_instruction(Word** mem[], Word c,
        unsigned int last_initialized,
        int ignore_invalid) {
    Word* instr = ptr_to(mem, c, last_initialized);
    unsigned int instruction = instr->low;
    instruction = (instruction+c.low + 59049 * c.high
            + (c.area==1?52:(c.area==2?10:0)))%94;
    return instruction;
}

int main(int argc, char* argv[]) {
    Word** memory[3];
    int i,j;
    for (i=0; i<3; i++) {
        memory[i] = (Word**)malloc(59049 * sizeof(Word*));
        if (!memory) {
            fprintf(stderr,"not enough memory.\n");
            return 1;
        }
        for (j=0; j<59049; j++) {
            (memory[i])[j] = 0;
        }
    }
    Word a, c, d;
    unsigned int result;
    FILE* file;
    if (argc < 2) {
        // read program code from STDIN
        file = stdin;
    }else{
        file = fopen(argv[1],"rb");
    }
    if (file == NULL) {
        fprintf(stderr, "File not found: %s\n",argv[1]);
        return 1;
    }
    a = zero();
    c = zero();
    d = zero();
    result = 0;
    while (!feof(file)){
        unsigned int instr;
        Word* cell = ptr_to(memory, d, 0);
        (*cell) = zero();
        result = fread(&cell->low,1,1,file);
        if (result > 1)
            return 1;
        if (result == 0 || cell->low == 0x1a || cell->low == 0x04)
            break;
        instr = (cell->low + d.low + 59049*d.high)%94;
        if (cell->low == ' ' || cell->low == '\t' || cell->low == '\r'
                || cell->low == '\n');
        else if (cell->low >= 33 && cell->low < 127 &&
                (instr == 4 || instr == 5 || instr == 23 || instr == 39
                    || instr == 40 || instr == 62 || instr == 68
                    || instr == 81)) {
            d = increment(d);
        }
    }
    if (file != stdin) {
        fclose(file);
    }
    unsigned int last_initialized = 0;
    while (1){
        *ptr_to(memory, d, 0) = crazy(*ptr_to(memory, decrement(d), 0),
                *ptr_to(memory, decrement(decrement(d)), 0));
        last_initialized = d.low + 59049*d.high;
        if (d.low == 59048) {
            break;
        }
        d = increment(d);
    }
    d = zero();

    unsigned int step = 0;
    while (1) {
        unsigned int instruction = get_instruction(memory, c,
                last_initialized, 0);
        step++;
        switch (instruction){
            case 4:
                c = *ptr_to(memory,d,last_initialized);
                break;
            case 5:
                if (!a.area) {
                    printf("%c",(char)(a.low + 59049*a.high));
                }else if (a.area == 2 && a.low == 59047
                        && a.high == 59048) {
                    printf("\n");
                }
                break;
            case 23:
                a = zero();
                a.low = getchar();
                if (a.low == EOF) {
                    a.low = 59048;
                    a.high = 59048;
                    a.area = 2;
                }else if (a.low == '\n'){
                    a.low = 59047;
                    a.high = 59048;
                    a.area = 2;
                }
                break;
            case 39:
                a = (*ptr_to(memory,d,last_initialized)
                        = rotate_r(*ptr_to(memory,d,last_initialized)));
                break;
            case 40:
                d = *ptr_to(memory,d,last_initialized);
                break;
            case 62:
                a = (*ptr_to(memory,d,last_initialized)
                        = crazy(a, *ptr_to(memory,d,last_initialized)));
                break;
            case 81:
                return 0;
            case 68:
            default:
                break;
        }

        Word* mem_c = ptr_to(memory, c, last_initialized);
        mem_c->low = translation[mem_c->low - 33];

        c = increment(c);
        d = increment(d);
    }
    return 0;
}

यह काम कर रहा है!

यह काम कर रहा है!


6
मुझे आशा है कि आपने वह सब नहीं लिखा है।
संयोजिका

5
जब मैं अपने कार्यक्रम खोला, क्रोम पॉलिश से इसका अनुवाद करने का प्रयास किया
Tharwen

@Tharwen एक नज़र में, यह बता पाना मुश्किल है कि यह पोलिश है या सिर्फ मालबोज़। दुख की बात है कि मेरी भाषा सीखने के लिए पृथ्वी पर नरक है।
Krzysztof Szewczyk

7

PHP , 65 64 61 58 बाइट्स

एक का उपयोग करके -1 बाइट b बजाय ''(खाली स्ट्रिंग) का । चूंकि "बी" की छंटनी की जाती है, इसलिए यह इस विशिष्ट मामले में एक खाली स्ट्रिंग के समान होगा।

-3 बाइट्स का उपयोग करके substrexplodeइनपुट के पहले भाग को प्राप्त करने के बजाय ।

पता लगाने के लिए बेहतर तरीकों का उपयोग करके -3 बाइट्स 1और -1

<?=($n=substr($argn,0,-2))?trim($n+1?$n-1?$n:b:'-',b).b:0;

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

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

यदि "/" से पहले इनपुट का पहला भाग (हम इसे कहते हैं $n ) 0, प्रिंट 0 है।

इसके $nअंत में छंटनी के साथ ही कोई भी "बी" के साथ प्रिंट करता है और -1 और 1 के विशेष मामलों को संभाला जाता है, इसलिए "1" अंक मुद्रित नहीं होता है। और अंत में एक एकल "बी" जोड़ता है। ट्रिमिंग भाग यह सुनिश्चित करने के लिए है कि हमें "3bb" की तरह अंत में एक डबल "बी" न मिले।


बहुत अच्छी तरह से किया!
Lyxal

जगह $n==-1के साथ $n>0(-2 बाइट्स) काम करने लगता है। आप कोशिश कर सकते हैं।
इस्माइल मिगुएल

@IsmaelMiguel, यह काम नहीं कर रहा है, अगर आपका मतलब है $n<0, वह भी काम नहीं करेगा, क्योंकि हमारे पास इनपुट हैं -8/0
Night2

@IsmaelMiguel, लेकिन क्या आप मुझे एक विचार, प्रतिस्थापित दिया $n==-1?'-':$nसाथ $n+1?$n:'-'2 बाइट्स को बचाने के लिए!
Night2

1
: / जब मैंने परीक्षण किया, तो यह काम करने लगा। लेकिन अच्छी तरह से, अच्छी बात है कि आप एक और रास्ता मिल गया।
इस्माईल मिगुएल


4

जेली , 18 बाइट्स

मैंने एरिक के ṾṖ$İƑ¡ लिए चोरी करना समाप्त कर दिया (अन्यथा मेरे पास भी 19 होंगे) ...

ṖṖv0ḢṾṖ$İƑ¡,Ạ¡”boḢ

एक पूर्ण कार्यक्रम जो परिणाम प्रिंट करता है।

इसे ऑनलाइन आज़माएं! या परीक्षण-सूट देखें

कैसे?

ṖṖv0ḢṾṖ$İƑ¡,Ạ¡”boḢ - Main Link: list of characters S
Ṗ                  - discard right-most (of S)
 Ṗ                 - discard right-most
   0               - literal zero
  v                - evaluate as Jelly code with right argument (0)
                   - ... b is covert-to-base, so "nb0" gives [n]
    Ḣ              - head ([n]->n or n->n)
          ¡        - repeat...
         Ƒ         - ...# of times: is invariant under:
        İ          -   reciprocation (n->1/n)
       $           - ...action: last two links as a monad:
     Ṿ             -   un-evaluate (-1->"-1" or 1->"1")
      Ṗ            -   discard right-most ("-1"->"-" or "1"->"")
             ¡     - repeat...
            Ạ      - ...# of times: all?
           ,  ”b   - ...action: pair with a 'b' character
                o  - logical OR with:
                 Ḣ -   head (S)  (i.e. if we end with 0 use the 1st character of the input)
                   - implicit print

1
आह, और मैं उन तरीकों के बारे में सोच रहा था, जिनका मैं दुरुपयोग कर सकता था v...: D
Eg the Outgolfer

4

पर्ल 6 , 32 बाइट्स

{~m/^0/||S/[(\-|^)1|b]?\/0/$0b/}

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

रीगेक्स की एक जोड़ी, एक यह जांचने के लिए कि इनपुट क्या है 0/0, और दूसरा अनुगामी /0को केवल b(और पुराने को हटाने के लिए b,)1 और / या -1)

स्पष्टीकरण (पुराना)

{                          }  # Anonymous codeblock
 ~m/^0/     # Return 0 if the input starts with 0
       ||   # Otherwise
         S/             / /  # Substitute
                     \/0       # The /0
          (        )?          # Optionally starting with
           <wb>1               # 1 or -1
                |b             # Or b
                         b   # With just b

3

रेटिना , 28 24 बाइट्स

b?/0
b
^0b
0
(^|-)1b
$1b

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

पहले रेटिना का उपयोग करने का प्रयास करें, इसलिए गोल्फिंग के लिए शायद काफी जगह है।



क्या शिकार करने के बाद \bकरता है (मैं कर रहा हूँ कि regex के साथ अनुभवहीन), मैं थोड़ा लगता है कि यह गंदा बैकस्पेस चरित्र के लिए छोटा नहीं किया जा सकता निराश था। किसी भी तरह, धन्यवाद
असंबंधित स्ट्रिंग

1
@UnrelatedString बेशक इसे बैकस्पेस में छोटा नहीं किया जा सकता है, आखिरकार, \bसामान्य स्ट्रिंग्स में बैकस्पेस कैरेक्टर का केवल ASCII प्रतिनिधित्व है: P
ASCII-only

2

पायथन 3 , 68 बाइट्स

import re
print(re.sub('^0b$','0',re.sub(r'(^1)?b?/0','b',input())))

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


अच्छा समाधान! लेकिन import reकरने के लिए 64 bytecount बढ़ जाता है
movatica

1
@Movatica अच्छा बिंदु, यहाँ नया तो महसूस नहीं किया गया था कि आयात विवरण को शामिल किया गया था (हालांकि निश्चित रूप से यह है)। संपादित।
काजिम

स्वागत हे! :) आप अभी भी छोटे lambda संस्करण रख सकते हैं! इसे पूरा कार्यक्रम बनाने की आवश्यकता नहीं है। और आयात विवरण लंबोदा परिभाषा के बाद रखा जा सकता है, इसलिए 64 बाइट संभव हैं !
movatica

1
@movatica आह, अच्छा! मुझे आयात और लंबोदर के साथ काम करने का कोई तरीका नहीं मिला। धन्यवाद
Kazim

1

केजी , 18 बी

सभी श्रेय जोनो को 2906 है।

__:b=;[b]^:\1=[_]^

व्याख्या

__                 # Take implicit input and remove the "trash" (/0).
  :b=              # Is the last character equal to b?
     ;             # Negate(decrement) this value.
      [b]          # If the last character is not b, append b.
         ^         # Reverse the stack.
          :\1=     # Is the first character equal to 1?
              [_]  # If so, reduce the value.
                 ^ # Reverse the stack back and implicit output.

TIO!



1

जावास्क्रिप्ट (ईएस 6), 45 बाइट्स

s=>+(n=s.split`/`[0])?[n*n-1?n:'-'[~n]]+'b':n

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

टिप्पणी की गई

s =>                  // s = input: "numerator/0"
  +(                  //
    n = s.split`/`[0] // n = numerator, as a string
  ) ?                 // if n coerced to a Number is neither equal to 0 nor NaN:
    [ n * n - 1 ?     //   if abs(n) is not equal to 1:
        n             //     append the numerator
      :               //   else:
        '-'[~n]       //     append '-' if n = -1, or an empty string otherwise
    ] + 'b'           //   append 'b'
  :                   // else:
    n                 //   just output the numerator because it's either "0" or
                      //   an expression that already contains 'b'

1

सी, 209 203 137 बाइट्स

-66 बाइट्स सीटिंगकैट के लिए धन्यवाद

char a[9];main(f){gets(a);f=strlen(a)-3;a[f+1]=0;printf((*a==55&a[1]==49&f==1?a[1]=98:*a==49&!f?*a=98:a[f]==98|*a==48&!f)?"%s":"%sb",a);}

TIO


-0/0 में डालना -0b देता है, लेकिन यह उदाहरण इनपुट या परीक्षण मामलों में कभी नहीं था, इसलिए यह सही है।
जिरोबुज़

1

नाज़ , 64 बाइट्स

6a8m1s2x1v2m4a2x2v1x1f1r3x1v2e3x2v3e1o1f0x1x2f2m4a1o0x1x3f1o0x1f

स्पष्टीकरण ( 0xहटाए गए आदेशों के साथ )

6a8m1s2x1v             # Set variable 1 equal to 47 ("/")
2m4a2x2v               # Set variable 2 equal to 98 ("b")
1x1f                   # Function 1
    1r                 # Read a byte of input
      3x1v2e           # Jump to function 2 if it equals variable 1
            3x2v3e     # Jump to function 3 if it equals variable 2
                  1o1f # Otherwise, output it and jump back to the start of the function
1x2f2m4a1o             # Function 2
                       # Set the register equal to 98 and output once
1x3f1o                 # Function 3
                       # Output once
1f                     # Call function 1

0

ब्रेनफक, 25 बाइट्स

>,[>,]<[-<+>]<+++[<]>[.>]

व्याख्या

>,[>,]        read from stdin
<[-<+>]<+++   add last two cells and add three ( ascii('/') + ascii('0') + 3 = ascii('b')
[<]>          move pointer to first char to output
[.>]          output until cell w/ value 0

1
b/0अपेक्षित b, मिला bb; 0/0अपेक्षित 0, मिला 0b; -1/0उम्मीद है -b, मिल गया -1b

हाँ, मूल रूप से यह केवल विकल्प /0के लिए bऔर के लिए मामलों के किसी भी खाते में नहीं ले करता है 0b, 1b, -1bया किसी आदानों कि पहले से ही एक को शामिलb
जो राजा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.