หารตัวเลขด้วย 0


16

เราทุกคนได้รับการบอกเล่า ณ จุดหนึ่งในชีวิตของเราว่าการหารด้วย 0 นั้นเป็นไปไม่ได้ และส่วนใหญ่ข้อความนั้นเป็นจริง แต่ถ้ามีก็เป็นวิธีการที่จะดำเนินการต้องห้ามหรือไม่? ยินดีต้อนรับสู่การสร้างใหม่ล่าสุดของฉัน: b-number

b- ตัวเลขเป็นตัวเลขเหมือนจำนวนเล็กน้อย: ตัวเลขหลักที่เกี่ยวข้องหมายถึงนิพจน์ที่ไม่สามารถคำนวณทางคณิตศาสตร์ได้ ( iหมายถึง1 ) ในกรณีนี้จะได้รับการกล่าวถึงเป็นตัวแทนการแสดงออก{0} จากที่นี่เป็นเรื่องง่ายที่จะระบุว่าจะเท่ากัน:10x0

x0=x110=x

งาน

ได้รับการแสดงออกที่เกี่ยวข้องกับการแบ่งโดย 0 ผลผลิตมูลค่าง่ายในแง่ของขโปรดทราบว่าการป้อนข้อมูลจะอยู่ในรูปแบบของการที่ n เป็นจำนวนตรรกยะหรือใด ๆจำนวนในรูปแบบทศนิยม 0s นำหน้าและต่อท้าย 0s จะไม่ถูกรวมn/0b

ตัวอย่างอินพุต

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

คะแนน

นี่คือรหัสกอล์ฟดังนั้นจำนวนน้อยที่สุดที่ชนะ ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม

ลีดเดอร์

นี่คือตัวอย่างข้อมูลเพื่อสร้างทั้งกระดานผู้นำปกติและภาพรวมของผู้ชนะตามภาษา

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

# 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-number เพื่อหารเช่นนี้?
สรรพนามของฉันคือ monicareinstate

4
@ เอริคแบบนั้นb/b = 0เมื่อเป็นปกติ (และฉันค่อนข้างแน่ใจว่ามันพิสูจน์ได้อย่างง่ายดายจากสัจพจน์ต่าง ๆ ทั้งหมด) ที่คาดว่าจะเป็น 1 (มิฉะนั้นอินเวอร์สคูณของ b ดูเหมือนจะไม่ใช่อินเวอร์สคูณคูณ) ฉันค่อนข้างแน่ใจว่าคุณไม่สามารถหลบหนีจากการหารด้วยศูนย์โดยการเพิ่มb=1/0หรืออะไรที่คล้ายกัน
สรรพนามของฉันคือ monicareinstate

30
มีการหารเหตุผลด้วยศูนย์ไม่ได้กำหนด ... ดังนั้นคุณควรจะสามารถทำให้ตัวอย่างทั้งหมดง่ายขึ้น (ยกเว้นที่สามจาก 0) เป็นเพียงb=1=11=33=3130=30=310=3
ไม่เป็นอันตรายส่วนใหญ่

8
ตัวอย่างที่ 3 ไม่ควรมีผลลัพธ์0bมากกว่า0? หากการแสดงออกทั้งสองนั้นเท่ากันคำถามจะไม่มีหลักฐาน
trichoplax

4
กรณีทดสอบที่แนะนำ:3.1b/0
jimmy23013

คำตอบ:


19

Malbolge Unshackled (ตัวแปรการหมุน 20 trit), 3,62e6 ไบต์

ขนาดของคำตอบนี้เกินขนาดโปรแกรมที่โพสต์ได้สูงสุด (eh) ดังนั้นรหัสคือ อยู่ในที่เก็บ GitHub ของฉัน (หมายเหตุ: อย่าคัดลอกรหัสโดยใช้ CTRL + A และ CTRL + C เพียงคลิกขวาแล้วคลิก "บันทึกองค์ประกอบปลายทางเป็น .. ")

วิธีการใช้งานได้อย่างไร

นี่อาจเป็นส่วนที่ยุ่งยากเนื่องจากล่ามที่ไร้เดียงสาของ Haskell จะใช้เวลานานในการรันสิ่งนี้ TIO มีล่าม Malbogle Unshackled ที่ดี แต่น่าเศร้าที่ฉันไม่สามารถใช้งานได้ (ข้อ จำกัด )

สิ่งที่ดีที่สุดที่ฉันสามารถหาได้คือตัวแปรความกว้างการหมุน 20 trit คงที่ซึ่งทำงานได้ดีมากการคำนวณ (ค่อนข้างมาก) ทันทีทันที

เพื่อให้ล่ามเร็วขึ้นฉันได้ลบเช็คทั้งหมดจาก Matthias Lutter's Malbolge Unshackled interpreter

#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
ฉันหวังว่าคุณจะไม่ได้พิมพ์ทุกอย่าง
connectyourcharger

5
เมื่อฉันเปิดโปรแกรมของคุณ Chrome พยายามแปลจากภาษาโปแลนด์
Tharwen

@ ธาร์เวนอย่างรวดเร็วมันยากที่จะบอกว่ามันโปแลนด์หรือแค่ Malbolge น่าเศร้าที่ภาษาของฉันคือนรกบนโลกที่จะเรียนรู้
Krzysztof Szewczyk

7

PHP , 65 64 61 58 ไบต์

-1 ไบต์โดยใช้bแทน'' (สตริงว่าง) เนื่องจาก "b" s ถูกตัดแต่งมันจะเหมือนกับสตริงว่างในกรณีนี้โดยเฉพาะ

-3 ไบต์โดยใช้substrแทนexplodeรับส่วนแรกของอินพุต

-3 ไบต์โดยใช้วิธีการที่ดีในการตรวจสอบและ1-1

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

ลองออนไลน์!

การทดสอบ: ลองออนไลน์!

หากส่วนแรกของอินพุตก่อน "/" (เราเรียกมันว่า$n) คือ 0 ให้พิมพ์ 0

อื่นพิมพ์$nตัวเองด้วย "b" ที่ท้ายถูกตัดออกจากมันและกรณีพิเศษของการจัดการ -1 และ 1 ดังนั้นหลัก "1" จะไม่ถูกพิมพ์ และท้ายที่สุดจะผนวก "b" เดี่ยว ส่วนการตัดแต่งคือการทำให้แน่ใจว่าเราจะไม่ได้รับ "b" สองเท่าในตอนท้ายเช่น "3bb"


ทำได้ดีมาก!
Lyxal

ดูเหมือนว่าการแทนที่$n==-1ด้วย$n>0(-2 ไบต์) คุณลองได้
Ismael Miguel

@IsmaelMiguel ที่ไม่ทำงานถ้าคุณหมายถึง$n<0มันจะไม่ทำงานเหมือนกันเพราะเรามีอินพุตเหมือน-8/0กัน
กลางคืน

@IsmaelMiguel แต่คุณให้ความคิด$n==-1?'-':$nกับฉันแทนด้วย$n+1?$n:'-'การบันทึก 2 ไบต์!
Night2

1
: / เมื่อฉันทดสอบดูเหมือนว่าจะทำงาน แต่ดีสิ่งที่ดีที่คุณพบวิธีอื่น
Ismael Miguel


4

เยลลี่ขนาด 18 ไบต์

ฉันลงเอยด้วยการขโมยErik ṾṖ$İƑ¡สำหรับอันนี้ (ไม่เช่นนั้นฉันก็มี 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
Ahhh และฉันกำลังคิดหาวิธีที่ฉันสามารถล่วงละเมิดv... : D
Erik the Outgolfer

4

Perl 6 , 32 ไบต์

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

ลองออนไลน์!

คู่ของ regexes หนึ่งเพื่อตรวจสอบว่าเข้าเป็น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 28ไบต์

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

ลองออนไลน์!

ลองใช้ Retina เป็นครั้งแรกดังนั้นอาจมีห้องสำหรับเล่นกอล์ฟ



หลังจากที่การล่าสัตว์สำหรับสิ่งที่\bไม่ (ฉันว่าไม่มีประสบการณ์กับ regex) ผมผิดหวังนิดหน่อยที่จะพบว่ามันไม่สามารถลงไปตัวละคร Backspace unprintable อย่างไรก็ตามขอบคุณ
สตริงที่ไม่เกี่ยวข้อง

1
@ UnrelatedString แน่นอนว่ามันไม่สามารถย่อให้เป็น backspace ได้\bเป็นเพียงการแสดง ASCII ของอักขระ backspace ในสตริงปกติ: P
ASCII เท่านั้นเท่านั้น

2

Python 3 , 68 ไบต์

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

ลองออนไลน์!


เป็นทางออกที่ดี! แต่import reเพิ่มจำนวน bytecount เป็น 64.
movatica

1
@movatica จุดที่ดีใหม่ที่นี่จึงไม่ได้ตระหนักถึงคำสั่งการนำเข้ารวมอยู่ (แม้ว่าแน่นอนมันเป็น) แก้ไข
Kazim

ยินดีต้อนรับ! :) คุณยังสามารถเก็บแลมบ์ดาเวอร์ชั่นที่สั้นกว่าได้! ไม่จำเป็นต้องเป็นโปรแกรมเต็มรูปแบบ และสามารถวางคำสั่งการนำเข้าหลังจากการนิยามแลมบ์ดาได้ดังนั้น 64 ไบต์จึงเป็นไปได้ !
movatica

1
@movatica อาดี! ฉันไม่พบวิธีที่จะทำให้มันใช้ได้กับการนำเข้าและแลมบ์ดา ขอบคุณ
Kazim

1

ถัง 18B

เครดิตทั้งหมดคือ Jono 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

JavaScript (ES6), 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

C, 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 แต่มันไม่เคยอยู่ในตัวอย่างอินพุตหรือกรณีทดสอบดังนั้นจึงถูกต้อง
girobuz

1

naz , 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

Brainfuck, 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
a'_ '

ใช่พื้นนี้ทดแทน/0สำหรับbและไม่ได้คำนึงถึงกรณีใดกรณีหนึ่งสำหรับ0b, 1b, -1bหรือปัจจัยใด ๆ ที่มีอยู่แล้วมีb
โจกษัตริย์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.