Dividi i numeri per 0


16

Ad un certo punto della nostra vita ci è stato detto che è impossibile dividere per 0. E per la maggior parte, questa affermazione è vera. E se ci fosse un modo per eseguire l'operazione proibita? Benvenuti nella mia ultima creazione: b-numeri.

b-numeri sono un po 'come numeri immaginari: il pronumeral principale coinvolto rappresenta un'espressione che non è matematicamente impossibile ( irappresenta ). In questo caso si dirà che rappresenta l'espressione . Da qui, è facile determinare cosa sarebbe uguale a :1b10x0

x0=x110=xb

L'obiettivo

Data un'espressione che coinvolge una divisione per 0, genera il valore semplificato in termini di . Si noti che l'input avrà la forma di dove n è un numero razionale o qualsiasi numero in forma decimale. Gli 0 iniziali e gli 0 finali non saranno inclusi.Bn/0b

Esempio di input

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

Esempio di output

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

Punto

Questo è il golf del codice, quindi vince meno byte. Sono vietate le scappatoie standard.

Classifiche

Ecco uno snippet di stack per generare sia una classifica regolare che una panoramica dei vincitori per lingua.

Per assicurarti che la tua risposta venga visualizzata, ti preghiamo di iniziare la risposta con un titolo, usando il seguente modello Markdown:

# Language Name, N bytes

dov'è Nla dimensione del tuo invio. Se si migliora il punteggio, è possibile mantenere i vecchi punteggi nel titolo, colpendoli. Per esempio:

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

Se si desidera includere più numeri nell'intestazione (ad es. Perché il punteggio è la somma di due file o si desidera elencare separatamente le penalità del flag dell'interprete), assicurarsi che il punteggio effettivo sia l' ultimo numero nell'intestazione:

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

Puoi anche rendere il nome della lingua un collegamento che verrà quindi visualizzato nello snippet della classifica:

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


7
Ho il sospetto che sto facendo qualcosa di sbagliato, ma se b/0 = bpoi divido entrambe le parti per ballora 1/0 = 1. Ho bisogno di cnumeri da dividere in questo modo?
mio pronome è monicareinstate il

4
@Erik in quel modo, b/b = 0quando è normalmente (e sono abbastanza sicuro che sia facilmente dimostrato da tutti i vari assiomi) dovrebbe essere 1 (altrimenti, l'inverso moltiplicativo di b sembra non essere il suo inverso moltiplicativo). Sono abbastanza sicuro che non puoi scappare a zero contro la divisione aggiungendo b=1/0o qualcosa di simile.
mio pronome è monicareinstate il

30
C'è una ragione per cui la divisione per zero non è definita ... . Quindi dovresti essere in grado di semplificare tutti gli esempi (tranne il terzo di 0) a solobB=1B=11B=33B=3130=30=310=3BB
Mostly Harmless

8
Il terzo esempio non dovrebbe avere un output 0banziché 0? Se le due espressioni fossero equivalenti, la domanda non avrebbe alcuna premessa
tricoplax del

4
Caso di prova suggerito:3.1b/0
jimmy23013

Risposte:


19

Malbolge Unshackled (variante a rotazione da 20 trit), 3,62e6 byte

La dimensione di questa risposta supera la dimensione massima del programma disponibile (eh), quindi il codice si trova nel mio repository GitHub (nota: non copiare il codice usando CTRL + A e CTRL + C, basta fare clic con il tasto destro e fare clic su "Salva elemento di destinazione come. .. ").

Come eseguirlo?

Questa potrebbe essere una parte difficile, perché l'ingenuo interprete di Haskell impiegherà anni e secoli per eseguire questo. TIO ha un discreto interprete Malbogle Unshackled, ma purtroppo non sarò in grado di usarlo (limitazioni).

La migliore che ho trovato è la variante con larghezza di rotazione fissa di 20 trit, che funziona molto bene, calcolando (praticamente) all'istante .

Per rendere l'interprete un po 'più veloce, ho rimosso tutti i controlli dall'interprete Malbolge Unshackled di 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;
}

Sta funzionando!

Sta funzionando!


6
Spero che tu non abbia scritto tutto questo.
connectyourcharger

5
Quando ho aperto il tuo programma, Chrome ha tentato di tradurlo dal polacco
Tharwen il

@Tharwen a colpo d'occhio, è difficile dire che sia polacco o solo Malbolge. Purtroppo la mia lingua è l'inferno sulla terra per imparare.
Krzysztof Szewczyk,

7

PHP , 65 64 61 58 byte

-1 byte usando un binvece di ''(stringa vuota). Poiché le "b" vengono tagliate, in questo caso specifico sarà uguale a una stringa vuota.

-3 byte usando substrinvece di explodeottenere la prima parte dell'input.

-3 byte usando metodi migliori per rilevare 1e -1.

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

Provalo online!

Test: provalo online!

Se la prima parte dell'input prima di "/" (lo chiamiamo $n) è 0, stampa 0.

Altrimenti si stampa $ncon qualsiasi "b" alla fine tagliato da esso e casi speciali di -1 e 1 gestiti, quindi la cifra "1" non viene stampata. E alla fine aggiunge una sola "b". La parte di rifilatura è assicurarsi di non ottenere una doppia "b" alla fine come "3bb".


molto ben fatto!
Lyxal

La sostituzione $n==-1con $n>0(-2 byte) sembra funzionare. Potresti provarlo.
Ismael Miguel,

@IsmaelMiguel, che non funziona, se volevi dire $n<0, non funzionerà troppo, dato che abbiamo input simili -8/0.
Night2

@IsmaelMiguel, ma mi hai dato un'idea, sostituita $n==-1?'-':$ncon $n+1?$n:'-'per salvare 2 byte!
Night2

1
: / Quando ho provato, sembrava funzionare. ma bene, cosa buona che hai trovato in un altro modo.
Ismael Miguel,


4

Gelatina , 18 byte

Ho finito per rubare Erik ṾṖ$İƑ¡ per questo (altrimenti ne avrei anche 19) ...

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

Un programma completo che stampa il risultato.

Provalo online! Oppure vedi la suite di test .

Come?

ṖṖ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, e stavo pensando a modi in cui potrei abusare v...: D
Erik the Outgolfer

4

Perl 6 , 32 byte

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

Provalo online!

Un paio di regex, uno per verificare se l'ingresso è 0/0, e l'altro per sostituire il trascinamento /0con solo b(e per rimuovere il vecchio b, 1e / o -1)

Spiegazione (vecchia)

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

Retina , 28 24 byte

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

Provalo online!

Prima prova ad usare Retina, quindi probabilmente c'è molto spazio per giocare a golf.



Dopo aver cercato ciò che \bfa (sono così inesperto con regex), sono rimasto un po 'deluso nello scoprire che non può essere abbreviato con il carattere non stampabile del backspace. Comunque, grazie
Unrelated String

1
@UnrelatedString ovviamente non può essere abbreviato in backspace, dopo tutto, \bè semplicemente una rappresentazione ASCII del carattere backspace in stringhe normali: P
ASCII

2

Python 3 , 68 byte

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

Provalo online!


Bella soluzione! Ma import reaumenta il byte a 64.
movatica

1
@movatica buon punto, nuovo qui quindi non ho realizzato che la dichiarazione di importazione era inclusa (anche se ovviamente lo è). Modificato.
Kazim,

Benvenuto! :) Puoi comunque mantenere la versione lambda più corta! Non deve essere un programma completo. E l'istruzione import può essere posizionata dopo la definizione lambda, quindi sono possibili 64 byte !
movatica,

1
@movatica ah, bello! Non ho trovato il modo di farlo funzionare con import e lambda. Grazie
Kazim,

1

Keg , 18B

Tutto il merito è di Jono 2906.

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

Spiegazione

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

Provalo online!

Commentate

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 grazie a 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


Inserendo -0/0 si ottiene -0b, ma non è mai stato nell'esempio di esempio o nei casi di test, quindi è corretto.
Girobuz,

1

naz , 64 byte

6a8m1s2x1v2m4a2x2v1x1f1r3x1v2e3x2v3e1o1f0x1x2f2m4a1o0x1x3f1o0x1f

Spiegazione (con 0xcomandi rimossi)

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 byte

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

Spiegazione

>,[>,]        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/0previsto b, ottenuto bb; 0/0previsto 0, ottenuto 0b; -1/0previsto -b, ottenuto -1b.
a'_ '

Già, in fondo questo sostituisce solo il /0per be non prende in considerazione nessuno dei casi per 0b, 1b, -1bo qualsiasi input che contengono già unab
Jo Re
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.