将数字除以0


16

我们都被告知人生除以零是不可能的。在大多数情况下,这种说法是正确的。但是,如果有执行禁止操作的方法吗?欢迎使用我的最新作品:- b数字。

b-数字有点像虚数:涉及的主要代词表示一个在数学上不是不可能的表达式(i表示1)。在这种情况下,可以说b代表表达式10。从这里,很容易确定x0等于:

x0=x110=xb

任务

给定一个表达式,该表达式涉及除以0,则输出简化值b。请注意,输入将采用以下形式:n/0其中n是任何有理数或b十进制形式的任何-number。前导0和尾随0将不包括在内。

输入示例

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-numbers这样划分吗?
我的代名词是monicareinstate,

4
@Erik这样,b/b = 0通常情况下(我很确定可以从所有各种公理中很容易地证明)它期望为1(否则,b的乘法逆不是它的乘法逆)。我敢肯定,您不会因添加b=1/0或类似方法而被零除漏洞。
我的代名词是monicareinstate,

30
有部门的原因被零是未定义... 。因此,您应该能够将所有示例(0的第三个除外)简化为bb=1b=11b=33b=3130=30=310=3bb
多数无害,

8
第三个示例不应该输出0b而不是0?如果两个表达式相等,那么该问题将没有前提
trichoplax

4
建议的测试用例:3.1b/0
jimmy23013 '19

Answers:


19

Malbolge Unshackled(20次旋转的变体形式),3,62e6字节

该答案的大小超过了可发布的最大程序大小(eh),因此代码为 位于我的GitHub存储库中(注意:请勿使用CTRL + A和CTRL + C复制该代码,只需右键单击并单击“将目标元素另存为。 ..”)。

如何运行呢?

这可能是一个棘手的部分,因为幼稚的Haskell解释器将需要很长的时间才能执行此操作。TIO具有不错的Malbogle Unshackled解释器,但可惜我无法使用它(限制)。

我能找到的最好的是固定的20-trit旋转宽度变体,该变体的性能非常好,可以立即计算(非常多)

为了使口译员更快一些,我从Matthias Lutter的Malbolge Unshackled口译员中删除了所有支票。

#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

@Tharwen一目了然,很难说是波兰语还是Malbolge。可悲的是我的语言在地上学习。
柯尔兹斯托夫·席维奇克

7

PHP65 64 61 58字节

通过使用-1字节b代替''(空字符串)。由于修剪了“ b”,因此在此特定情况下它将与空字符串相同。

通过使用-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”。修整部分是确保最后没有像“ 3bb”那样出现双“ b”。


做得非常好!
Lyxal

替换$n==-1$n>0(-2字节)似乎有效。你可以试试看。
Ismael Miguel

@IsmaelMiguel,这是行不通的,如果您要说的话$n<0,那也行不通,因为我们有类似这样的输入-8/0
2点

@IsmaelMiguel,但是您给了我一个主意,取而代之$n==-1?'-':$n$n+1?$n:'-'是节省2个字节!
2点

1
:/当我测试时,它似乎可以工作。但是,好东西,您发现了另一种方式。
伊斯梅尔·米格尔


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
啊,我在想可以虐待的方式v...:D
乡下人埃里克(Erik the Outgolfer)

4

Perl 6,32个字节

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

在线尝试!

一对夫妇的正则表达式,其中一个检查,如果输入是0/0,另一个替换尾部/0b(和删除旧的b1和/或-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

在线尝试!

首先尝试使用Retina,所以打高尔夫球的空间可能很大。


2
18个字节:在线尝试!
jimmy23013

打猎什么后\b做(我没有经验与正则表达式),我有点失望地发现,它不能缩短到不可打印退格字符。无论如何,谢谢
不相关的字串

1
@UnrelatedString当然不能缩短为退格,毕竟,\b它只是普通字符串中退格字符的ASCII表示形式:P
仅ASCII的

2

Python 3,68个字节

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

在线尝试!


不错的解决方案!但是import re将字节数增加到
64。– movatica

1
@movatica好点,这里是新来的,所以没有意识到包括了import语句(当然是)。编辑。
卡齐姆

欢迎!:)您仍然可以保留较短的lambda版本!它不必是一个完整的程序。而且import语句可以放在lambda定义之后,因此64个字节是可以的
movatica

1
@movatica啊,太好了!我没有找到使它与import和lambda一起使用的方法。谢谢
卡齐姆19'Sep

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

蒂奥


放入-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'_'

是的,基本上这只是替代了/0b,不考虑任何的情况下进行0b1b-1b或者输入已经包含一个b
乔金
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.