Chia số cho 0


16

Tất cả chúng ta đều được bảo rằng tại một số thời điểm trong cuộc sống của chúng ta rằng chia cho 0 là không thể. Và đối với hầu hết các phần, tuyên bố đó là đúng. Nhưng nếu có một cách để thực hiện các hoạt động bị cấm? Chào mừng bạn đến với sáng tạo mới nhất của tôi: b-numbers.

b-numbers hơi giống với các số tưởng tượng: phát âm chính liên quan đến một biểu thức không thể về mặt toán học ( iđại diện cho ). Trong trường hợp này sẽ được cho là đại diện cho biểu thức . Từ đây, thật dễ dàng để xác định những gì sẽ bằng:1b10x0

x0=x110=xb

Nhiệm vụ

Cho một biểu thức liên quan đến phép chia cho 0, xuất giá trị đơn giản theo b . Lưu ý rằng đầu vào sẽ ở dạng n/0n trong đó bất kỳ số hữu tỷ hoặc bất kỳ bsố nào ở dạng thập phân. Hàng đầu 0 và cuối 0 sẽ không được bao gồm.

Ví dụ đầu vào

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

Ví dụ đầu ra

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

Ghi bàn

Đây là mã golf, vì vậy ít byte nhất sẽ thắng. Sơ hở tiêu chuẩn bị cấm.

Bảng xếp hạng

Dưới đây là Stack Snippet để tạo cả bảng xếp hạng thông thường và tổng quan về người chiến thắng theo ngôn ngữ.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

# Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

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

Nếu ở đó bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ phiên dịch), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

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

Bạn cũng có thể đặt tên ngôn ngữ thành một liên kết mà sau đó sẽ hiển thị trong đoạn trích bảng xếp hạng:

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


7
Tôi nghi ngờ rằng tôi đang làm gì đó sai, nhưng nếu b/0 = bsau đó nếu tôi chia cả hai phần cho bsau đó 1/0 = 1. Tôi có cần những người ckhác để chia như thế này không?
đại từ của tôi là monicareinstate

4
@Erik theo cách đó, b/b = 0khi nó bình thường (và tôi khá chắc chắn rằng nó dễ dàng được chứng minh từ tất cả các tiên đề khác nhau) được dự kiến ​​là 1 (nếu không, nghịch đảo nhân của b dường như không phải là nghịch đảo nhân của nó). Tôi khá chắc chắn rằng bạn không thể kẽ hở chống chia cho số 0 bằng cách thêm b=1/0hoặc bất cứ thứ gì tương tự.
đại từ của tôi là monicareinstate

30
Có một phân chia lý do cho số 0 là không xác định ... . Vì vậy, bạn sẽ có thể đơn giản hóa tất cả các ví dụ (ngoại trừ phần ba của 0) thànhb=1b=11b=33b=3130=30=310=3bb
Chủ yếu là vô hại

8
Không phải ví dụ thứ 3 có đầu ra 0bchứ không phải 0? Nếu hai biểu thức là tương đương thì câu hỏi sẽ không có tiền đề
trichoplax

4
Trường hợp thử nghiệm được đề xuất:3.1b/0
jimmy23013

Câu trả lời:


19

Malbolge Unshackled (biến thể xoay 20 trit), 3,62e6 byte

Kích thước của câu trả lời này vượt quá kích thước chương trình có thể đăng tối đa (eh), do đó mã được đặt trong kho GitHub của tôi (lưu ý: Không sao chép mã bằng CTRL + A và CTRL + C, chỉ cần nhấp chuột phải và nhấp vào "Lưu phần tử đích dưới dạng. .. ").

Làm thế nào để chạy này?

Đây có thể là một phần khó khăn, bởi vì thông dịch viên Haskell ngây thơ sẽ mất nhiều thời gian để điều hành việc này. TIO có trình thông dịch Malbogle Unshackled đàng hoàng, nhưng thật đáng buồn là tôi sẽ không thể sử dụng nó (giới hạn).

Cái tốt nhất tôi có thể tìm thấy là biến thể chiều rộng xoay cố định 20 trit, hoạt động rất tốt, tính toán (khá nhiều) ngay lập tức .

Để làm cho trình thông dịch nhanh hơn một chút, tôi đã xóa tất cả các kiểm tra khỏi trình thông dịch Malbolge Unshackled của Matthias Lutter.

#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;
}

Nó đang hoạt động!

Nó đang hoạt động!


6
Tôi hy vọng bạn đã không gõ tất cả.
Trình kết nối

5
Khi tôi mở chương trình của bạn, Chrome đã cố dịch nó từ tiếng Ba Lan
Tharwen

@Tharwen trong nháy mắt, thật khó để nói đó là tiếng Ba Lan hay chỉ là Malbolge. Đáng buồn là ngôn ngữ của tôi là địa ngục để học.
Krzysztof Szewchot

7

PHP , 65 64 61 58 byte

-1 byte bằng cách sử dụng bthay vì ''(chuỗi trống). Vì "b" được cắt bớt, nó sẽ giống như một chuỗi rỗng trong trường hợp cụ thể này.

-3 byte bằng cách sử dụng substrthay vì explodeđể có phần đầu tiên.

-3 byte bằng cách sử dụng các phương thức tốt hơn để phát hiện 1-1.

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

Hãy thử trực tuyến!

Kiểm tra: Hãy thử trực tuyến!

Nếu phần đầu tiên của đầu vào trước "/" (chúng tôi gọi nó $nlà), in 0.

Khác in $nchính nó với bất kỳ "b" ở cuối được cắt từ nó và các trường hợp đặc biệt của -1 và 1 được xử lý, do đó chữ số "1" không được in. Và cuối cùng sẽ thêm một chữ "b". Phần cắt tỉa là để đảm bảo chúng ta không nhận được một "b" kép ở cuối như "3bb".


hoàn thành rất tốt!
Jono 2906

Thay thế $n==-1với $n>0(-2 byte) dường như làm việc. Bạn có thể thử nó.
Ismael Miguel

@IsmaelMiguel, điều đó không hiệu quả, nếu bạn muốn nói là $n<0nó cũng không hoạt động, vì chúng tôi có đầu vào như thế nào -8/0.
Đêm 2

@IsmaelMiguel, nhưng bạn đã cho tôi một ý tưởng, thay thế $n==-1?'-':$nbằng $n+1?$n:'-'để tiết kiệm 2 byte!
Đêm 2

1
: / Khi tôi kiểm tra, nó dường như hoạt động. nhưng tốt, điều tốt mà bạn tìm thấy một cách khác.
Ismael Miguel


4

Thạch , 18 byte

Cuối cùng tôi đã đánh cắp Erik ṾṖ$İƑ¡ cho cái này (nếu không tôi cũng có 19) ...

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

Một chương trình đầy đủ in kết quả.

Hãy thử trực tuyến! Hoặc xem bộ thử nghiệm .

Làm sao?

ṖṖ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à tôi đã nghĩ đến những cách mà tôi có thể lạm dụng v...: D
Erik the Outgolfer 31/08/19

4

Perl 6 , 32 byte

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

Hãy thử trực tuyến!

Một vài regexes, một để kiểm tra nếu đầu vào là 0/0, và người kia để thay thế cho dấu /0chỉ b(và để loại bỏ cái cũ b, 1và / hoặc -1)

Giải thích (cũ)

{                          }  # 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

Võng mạc , 28 24 byte

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

Hãy thử trực tuyến!

Lần đầu tiên thử sử dụng Retina, vì vậy có lẽ có chỗ đáng kể để chơi gôn.



Sau khi săn bắn cho những gì \bkhông (tôi rằng thiếu kinh nghiệm với regex), tôi là một chút thất vọng khi thấy rằng nó không thể được rút ngắn xuống còn nhân vật BackSpace chưa in ra. Dù sao đi nữa, cảm ơn
Chuỗi không liên quan

1
@UnrelatedString tất nhiên không thể rút ngắn thành backspace, rốt cuộc, \bchỉ đơn thuần là một đại diện ASCII của ký tự backspace trong các chuỗi bình thường: P
ASCII - chỉ

2

Python 3 , 68 byte

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

Hãy thử trực tuyến!


Giải pháp tốt đẹp! Nhưng import retăng số lượng nhân lên tới 64.
Movatica

1
@movatica điểm tốt, mới ở đây vì vậy không nhận ra báo cáo nhập khẩu (mặc dù tất nhiên là vậy). Đã chỉnh sửa.
Kazim

Chào mừng bạn :) Bạn vẫn có thể giữ phiên bản lambda ngắn hơn! Nó không cần phải là một chương trình đầy đủ. Và câu lệnh nhập có thể được đặt sau định nghĩa lambda, vì vậy có thể có 64 byte !
Movatica

1
@movatica ah, tốt đẹp! Tôi đã không tìm ra cách để làm cho nó hoạt động với nhập khẩu và lambda. Cảm ơn bạn
Kazim

1

Keg , 18B

Tất cả tín dụng là dành cho Jono 2906.

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

Giải trình

__                 # 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 byte

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

Hãy thử trực tuyến!

Đã bình luậ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 byte

-66 byte nhờ trần nhà

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


Đưa vào -0/0 sẽ cho -0b, nhưng nó không bao giờ nằm ​​trong ví dụ đầu vào hoặc trường hợp thử nghiệm, vì vậy nó chính xác.
girobuz

0

Brainfuck, 25 byte

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

Giải trình

>,[>,]        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/0mong đợi b, có được bb; 0/0mong đợi 0, có được 0b; -1/0mong đợi -b, có -1b.
a'_ '

Vâng, về cơ bản này chỉ thay thế các /0cho bvà không đưa vào tài khoản bất kỳ trong các trường hợp cho 0b, 1b, -1bhoặc bất kỳ đầu vào mà đã chứa mộtb
Jo vua
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.