Teilen Sie die Zahlen durch 0

16

Irgendwann in unserem Leben wurde uns allen gesagt, dass es unmöglich ist, sich durch 0 zu teilen. Und zum größten Teil ist diese Aussage wahr. Aber was , wenn es war ein Weg , um die verbotene Operation auszuführen? Willkommen zu meiner neuesten Kreation: b-Nummern.

b-Zahlen sind ein bisschen wie imaginäre Zahlen: Das Hauptpronumer repräsentiert einen Ausdruck, der mathematisch nicht unmöglich ist ( irepräsentiert -1 ). In diesem Fall sollbden Ausdruck. Von hier aus ist es einfach zu bestimmen, was x10x0 wäre gleich:

x0=x110=xb

Die Aufgabe

Bei einem Ausdruck, der eine Division durch 0 beinhaltet, wird der vereinfachte Wert in Form von b ausgegeben . Beachten Sie, dass die Eingabe in der Form erfolgt, in der n/0n eine beliebige rationale Zahl oder eine bbeliebige dezimale Zahl ist . Führende und nachfolgende Nullen werden nicht berücksichtigt.

Beispiel Eingabe

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

Beispielausgabe

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

Ergebnis

Dies ist Codegolf, so dass nur wenige Bytes gewinnen. Standardlücken sind verboten.

Bestenlisten

Hier ist ein Stack-Snippet, um sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache zu generieren.

Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:

# Language Name, N bytes

Wo Nist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:

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

Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:

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

Sie können den Namen der Sprache auch als Link festlegen, der dann im Leaderboard-Snippet angezeigt wird:

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

Jono 2906
quelle
7
Ich vermute, dass ich etwas falsch mache, aber wenn b/0 = bdann, wenn ich beide Teile bis bdahin teile 1/0 = 1. Brauche ich c-Zahlen, um so zu teilen?
Mein Pronomen ist monicareinstate
4
@Erik auf diese Weise, b/b = 0wenn es normalerweise (und ich bin mir ziemlich sicher, dass es aus all den verschiedenen Axiomen leicht zu beweisen ist) erwartet wird, dass es 1 ist (andernfalls scheint das multiplikative Inverse von b nicht das multiplikative Inverse zu sein). Ich bin mir ziemlich sicher, dass Sie einfach keine Lücke gegen die Division durch Null durch Addition b=1/0oder ähnliches schließen können.
Mein Pronomen ist monicareinstate
30
Es gibt einen Grund, warum die Division durch Null undefiniert ist ... . Sie sollten also in der Lage sein, alle Beispiele (mit Ausnahme des dritten von 0) zu vereinfachen, um nurbb=1b=11b=33b=3130=30=310=3bb
Mostly Harmless
8
Sollte das 3. Beispiel nicht 0blieber ausgegeben haben als 0? Wenn die beiden Ausdrücke gleich wären, hätte die Frage keine Prämisse
Trichoplax
4
Vorgeschlagener Testfall:3.1b/0
jimmy23013

Antworten:

19

Malbolge Unshackled (20-Trit-Rotationsvariante), 3,62e6 Bytes

Die Größe dieser Antwort überschreitet die maximal verfügbare Programmgröße (eh), sodass sich der Code in meinem GitHub-Repository befindet (Hinweis: Kopieren Sie den Code nicht mit STRG + A und STRG + C, sondern klicken Sie mit der rechten Maustaste und klicken Sie auf "Zielelement speichern unter". .. ").

Wie führe ich das aus?

Dies könnte ein schwieriger Teil sein, da naive Haskell-Interpreter eine Ewigkeit brauchen, um dies auszuführen. TIO hat einen anständigen Malbogle Unshackled-Interpreter, aber leider kann ich ihn nicht verwenden (Einschränkungen).

Das Beste, was ich finden konnte, ist die Variante mit fester Rotationsbreite von 20 Trit, die sehr gut funktioniert und (fast ) sofort berechnet .

Um den Dolmetscher ein bisschen schneller zu machen, habe ich alle Checks von Matthias Lutters Malbolge Unshackled-Dolmetscher entfernt.

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

Es funktioniert!

Es funktioniert!

Krzysztof Szewczyk
quelle
6
Ich hoffe, Sie haben das nicht alles eingegeben.
connectyourcharger
5
Als ich Ihr Programm öffnete, versuchte Chrome, es vom Polnischen
Tharwen,
@Tharwen auf einen Blick, es ist schwer zu sagen, ob es polnisch oder nur Malbolge ist. Leider ist meine Sprache die Hölle auf Erden, um zu lernen.
Krzysztof Szewczyk
7

PHP , 65 64 61 58 Bytes

-1 Byte mit einem banstelle von ''(leere Zeichenfolge). Da "b" gekürzt werden, entspricht dies in diesem speziellen Fall einer leeren Zeichenfolge.

-3 Bytes durch Verwenden von substranstelle von explode, um den ersten Teil der Eingabe zu erhalten.

-3 Bytes durch Verwendung besserer Methoden zum Erkennen 1und -1.

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

Probieren Sie es online!

Tests: Online ausprobieren!

Wenn der erste Teil der Eingabe vor "/" (wir nennen es $n) 0 ist, wird 0 ausgegeben.

Andernfalls wird $nein "b" am Ende und Sonderfälle von -1 und 1 behandelt, sodass die Ziffer "1" nicht gedruckt wird. Und am Ende hängt ein einzelnes "b" an. Der Zuschnitt soll sicherstellen, dass am Ende kein doppeltes "b" wie "3bb" angezeigt wird.

Night2
quelle
sehr schön gemacht!
Jono 2906
Das Ersetzen $n==-1durch $n>0(-2 Bytes) scheint zu funktionieren. Sie könnten das versuchen.
Ismael Miguel
@IsmaelMiguel, das funktioniert nicht, wenn du meintest, das wird auch nicht funktionieren $n<0, da wir Eingaben wie haben -8/0.
Night2
@IsmaelMiguel, aber du hast mir eine Idee gegeben, ersetzt $n==-1?'-':$ndurch $n+1?$n:'-', um 2 Bytes zu sparen!
Night2
1
: / Als ich getestet habe, schien es zu funktionieren. aber gut, dass du einen anderen weg gefunden hast.
Ismael Miguel
4

Jelly , 18 Bytes

Am Ende habe ich Eriks ṾṖ$İƑ¡ für diesen gestohlen (sonst hätte ich auch 19) ...

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

Ein vollständiges Programm, das das Ergebnis druckt.

Probieren Sie es online! Oder sehen Sie sich die Testsuite an .

Wie?

ṖṖ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
Jonathan Allan
quelle
1
Ahhh, und ich dachte darüber nach, wie ich missbrauchen könnte v...: D
Erik der Outgolfer
4

Perl 6 , 32 Bytes

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

Probieren Sie es online!

Ein paar regulären Ausdrücke, ein zu prüfen , ob der Eingang 0/0und die anderen die nachgestellten zu ersetzen /0mit nur b(und zu entfernen , dem alten b, 1und / oder -1)

Erklärung (alt)

{                          }  # 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
Scherzen
quelle
3

Retina , 28 24 Bytes

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

Probieren Sie es online!

Versuchen Sie zunächst, Retina zu verwenden, damit Sie wahrscheinlich genügend Platz zum Golfen haben.

Nicht verwandte Zeichenfolge
quelle
2
18 Bytes: Probieren Sie es online!
Jimmy23013
Nach der Suche nach dem, was zu tun \bist (ich bin so unerfahren mit Regex), war ich etwas enttäuscht, dass es sich nicht auf das nicht druckbare Backspace-Zeichen verkürzen lässt. Wie auch immer, danke
Unrelated String
1
@UnrelatedString kann natürlich nicht auf die Rücktaste gekürzt werden, schließlich \bist es nur eine ASCII-Darstellung des Rücktastenzeichens in normalen Zeichenfolgen: P
Nur ASCII
2

Python 3 , 68 Bytes

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

Probieren Sie es online!

Kazim
quelle
Schöne lösung! Dafür import resteigt der bytecount auf 64.
movatica
1
@movatica guter Punkt, neu hier, also habe ich nicht bemerkt, dass eine Importerklärung enthalten war (obwohl es natürlich ist). Bearbeitet
Kazim
Herzlich willkommen! :) Die kürzere Lambda-Version kannst du trotzdem behalten! Es muss kein vollständiges Programm sein. Und die import-Anweisung kann nach der Lambda-Definition platziert werden, sodass 64 Byte möglich sind !
Movatica
1
@ Movatica ah, schön! Ich habe keine Möglichkeit gefunden, es mit Import und Lambda zum Laufen zu bringen. Vielen Dank
Kazim
1

Keg , 18B

Alle Kredite gehen an Jono 2906.

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

Erläuterung

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

ein'_'
quelle
1

JavaScript (ES6), 45 Byte

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

Probieren Sie es online!

Kommentiert

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'
Arnauld
quelle
1

C, 209 203 137 Bytes

-66 bytes dank ceilingcat

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

girobuz
quelle
Wenn Sie -0/0 eingeben, erhalten Sie -0b, dies war jedoch nie in der Beispieleingabe oder in Testfällen der Fall, sodass es korrekt ist.
Girobuz
0

Brainfuck, 25 Bytes

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

Erläuterung

>,[>,]        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
Michael
quelle
1
b/0erwartet b, bekam bb; 0/0erwartet 0, bekam 0b; -1/0erwartet -b, bekommen -1b.
3.
Ja, im Grunde nur diese ersetzt die /0für bund nicht berücksichtigt nicht jedem der Fälle für 0b, 1b, -1boder alle Eingänge , die bereits enthaltenb
Jo König