Podziel liczby przez 0

16

Wszyscy w pewnym momencie naszego życia powiedziano nam, że dzielenie przez 0 jest niemożliwe. I w przeważającej części to stwierdzenie jest prawdziwe. Ale co, jeśli nie był to sposób, aby wykonać zakazanego operację? Witaj w moim najnowszym bdziele : -liczba.

b-liczba jest trochę podobna do liczby urojonej: główny związany z nią element liczby reprezentuje wyrażenie, które nie jest matematycznie niemożliwe ( ireprezentuje 1 ). W takim przypadkubbędzie reprezentować wyrażenie10 . Stąd łatwo jest ustalić, cox0 byłoby równe:

x0=x110=xb

Zadanie

Biorąc pod uwagę wyrażenie obejmujące dzielenie przez 0, wypisz wartość uproszczoną w kategoriach b . Zauważ, że dane wejściowe będą miały postać, n/0gdzie n jest dowolną liczbą wymierną lub dowolną liczbą bw postaci dziesiętnej. Wiodące 0 i końcowe 0 nie zostaną uwzględnione.

Przykładowe dane wejściowe

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

Przykładowy wynik

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

Wynik

To jest kod golfowy, więc wygrywa najmniej bajtów. Standardowe luki są zabronione.

Liderów

Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

# Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

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

Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

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

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie tabeli wyników:

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

Lyxal
źródło
7
Podejrzewam, że robię coś złego, ale jeśli b/0 = bwtedy podzielę obie części do btego czasu 1/0 = 1. Czy potrzebuję cliczb, aby podzielić w ten sposób?
mój zaimek to monicareinstate
4
@Erik w ten sposób, b/b = 0gdy jest normalnie (i jestem prawie pewien, że łatwo to udowodnić na podstawie wszystkich różnych aksjomatów) ma wynosić 1 (w przeciwnym razie odwrotność multiplikatywna b wydaje się nie być odwrotnością multiplikatywną). Jestem prawie pewien, że po prostu nie możesz zrobić luki przeciwko podziałowi przez zero poprzez dodanie b=1/0lub coś podobnego.
mój zaimek to monicareinstate
30
Przyczyna podziału przez zero jest niezdefiniowana ... . Powinieneś więc być w stanie uprościć wszystkie przykłady (z wyjątkiem trzeciego z 0) do samegobb=1b=11b=33b=3130=30=310=3bb
głównie nieszkodliwy
8
Nie powinny mieć 3rd przykład wyjście 0bzamiast 0? Gdyby te dwa wyrażenia były równoważne, pytanie nie miałoby żadnej przesłanki
trichoplax
4
Sugerowany przypadek testowy:3.1b/0
jimmy23013

Odpowiedzi:

19

Malbolge Unshackled (wariant rotacji 20 trytów), 3,62e6 bajtów

Rozmiar tej odpowiedzi przekracza maksymalny rozmiar programu do wysłania (eh), więc kod znajduje się w moim repozytorium GitHub (uwaga: nie kopiuj kodu za pomocą CTRL + A i CTRL + C, wystarczy kliknąć prawym przyciskiem myszy i kliknąć „Zapisz element docelowy jako. .. ”).

Jak to uruchomić?

Może to być trudna część, ponieważ naiwny tłumacz Haskell będzie wieków na wieki, aby to uruchomić. TIO ma przyzwoitego interpretera Malbogle Unshackled, ale niestety nie będę mógł go używać (ograniczenia).

Najlepszy, jaki udało mi się znaleźć, to stały wariant szerokości rotacji 20-trytów, który działa bardzo dobrze, obliczając (prawie) natychmiast .

Aby nieco przyspieszyć tłumacza, usunąłem wszystkie kontrole z nieskrępowanego tłumacza Matthiasa Luttera.

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

To działa!

It's working!

Krzysztof Szewczyk
źródło
6
Mam nadzieję, że nie wpisałeś tego wszystkiego.
connectyourcharger
5
Kiedy otworzyłem twój program, Chrome próbował przetłumaczyć go z polskiego
Tharwen
@Tharwen w skrócie, Trudno powiedzieć, czy to polski czy tylko Malbolge. Niestety, moim językiem jest nauka piekła na ziemi.
Krzysztof Szewczyk,
7

PHP , 65 64 61 58 bajtów

-1 bajt przy użyciu bzamiast ''(pusty ciąg). Ponieważ „b” są przycięte, w tym konkretnym przypadku będzie on taki sam jak pusty ciąg.

-3 bajty przy użyciu substrzamiast explodedo uzyskania pierwszej części danych wejściowych.

-3 bajty przy użyciu lepszych metod wykrywania 1i -1.

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

Wypróbuj online!

Testy: Wypróbuj online!

Jeśli pierwsza część danych wejściowych przed „/” (nazywamy to $n) to 0, wypisze 0.

W przeciwnym razie drukuje $nsię z każdym przyciętym na końcu „b” i traktowanymi specjalnymi przypadkami -1 i 1, więc cyfra „1” nie jest drukowana. I na końcu dołącza pojedynczy „b”. Częścią przycinania jest upewnienie się, że nie otrzymujemy podwójnego „b” na końcu, jak „3bb”.

Noc 2
źródło
bardzo ładnie wykonane!
Lyxal
Wymiana $n==-1z $n>0(-2 bajtów) wydaje się działać. Możesz tego spróbować.
Ismael Miguel
@ IsmaelMiguel, to nie działa, jeśli miałeś na myśli $n<0, to też nie będzie działać, ponieważ mamy takie dane wejściowe -8/0.
Noc 2
@ IsmaelMiguel, ale dałeś mi pomysł, zastąpiony $n==-1?'-':$nprzez, $n+1?$n:'-'aby zaoszczędzić 2 bajty!
Noc 2
1
: / Kiedy testowałem, wydawało się, że działa. ale dobrze, że znalazłeś inny sposób.
Ismael Miguel
4

Galaretka , 18 lat bajtów

Skończyło się na tym, że ukradłem Erika ṾṖ$İƑ¡ za ten (w przeciwnym razie miałbym również 19) ...

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

Pełny program, który drukuje wynik.

Wypróbuj online! Lub zobacz pakiet testowy .

W jaki sposób?

ṖṖ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
źródło
1
Ahhh, i myślałem o sposobach, w jakie mógłbym nadużyć v...: D
Erik the Outgolfer
4

Perl 6 , 32 bajty

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

Wypróbuj online!

Kilka regexes, jeden, by sprawdzić, czy wejście jest 0/0, a drugi do zastąpienia końcowego znaku /0ze tylko b(i usunąć stary b, 1i / lub-1 )

Wyjaśnienie (stare)

{                          }  # 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
Jo King
źródło
3

Siatkówka , 28 24 bajtów

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

Wypróbuj online!

Najpierw spróbuj użyć Retina, więc prawdopodobnie jest sporo miejsca na grę w golfa.

Niepowiązany ciąg
źródło
2
18 bajtów: Wypróbuj online!
jimmy23013,
Po polowaniu na to, co \brobi (jestem że niedoświadczony z regex), byłem nieco rozczarowani, że nie może on zostać skrócony do niedrukowanego znak cofania. W każdym razie dzięki
Niepowiązany ciąg
1
@UnrelatedString oczywiście, że nie można go skrócić do backspace, w końcu \bjest jedynie reprezentacją ASCII znaku backspace w normalnych ciągach: P
tylko ASCII
2

Python 3 , 68 bajtów

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

Wypróbuj online!

Kazim
źródło
Fajne rozwiązanie! Ale import repodnosi bajt do 64.
movatica
1
@movatica dobry punkt, nowy tutaj, więc nie zdawałem sobie sprawy, że dołączono instrukcję importu (chociaż oczywiście jest). Edytowane.
Kazim
Witamy! :) Nadal możesz zachować krótszą wersję lambda! Nie musi to być pełny program. A instrukcja importu może być umieszczona po definicji lambda, więc możliwe są 64 bajty !
movatica
1
@movatica ah, nice! Nie znalazłem sposobu, aby to działało z importem i lambda. Dziękuję Ci
Kazim
1

Keg , 18 B.

Cały kredyt należy do Jono 2906.

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

Wyjaśnienie

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

za'_'
źródło
1

JavaScript (ES6), 45 bajtów

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

Wypróbuj online!

Skomentował

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
źródło
1

C, 209 203 137 bajtów

-66 bajtów dzięki pułapce cat

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
źródło
Wstawienie -0/0 daje -0b, ale nigdy nie było tego w przykładowych przypadkach wejściowych lub testowych, więc jest poprawne.
girobuz
1

naz , 64 bajty

6a8m1s2x1v2m4a2x2v1x1f1r3x1v2e3x2v3e1o1f0x1x2f2m4a1o0x1x3f1o0x1f

Objaśnienie (z 0xusuniętymi poleceniami)

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
sporeball
źródło
0

Brainfuck, 25 bajtów

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

Wyjaśnienie

>,[>,]        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
źródło
1
b/0oczekiwany b, dostał bb; 0/0oczekiwany 0, dostał 0b; -1/0oczekiwany -b, rozumiem -1b.
a'_ '
Tak, w zasadzie to tylko substytuty /0za bi nie bierze pod uwagę żadnego z przypadków na 0b, 1b, -1blub wszelkie wejścia, które już zawierająb
Jo Król