Розділіть числа на 0


16

Нам всім в певний момент життя сказали, що розділити на 0 неможливо. І здебільшого це твердження вірно. Але що робити, якщо був спосіб виконати заборонену операцію? Ласкаво просимо до мого останнього творіння: - bномери.

b-числа чимось схожі на уявні числа: основне число, яке бере участь, представляє вираз, який не є математично неможливим ( iпредставляє 1 ). У цьому випадкуb, як кажуть, представляє вираз10 . Звідси легко визначити, щоx0 дорівнювало б:

х0=х110=хб

Завдання

Давши вираз, що включає ділення на 0, виведіть спрощене значення у вигляді б . Зауважте, що введення буде у формі n/0де n - будь-яке раціональне число або будь-яке число bу десятковій формі. Провідні 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числа, щоб поділитись так?
мій займенник monicareinstate

4
@ Так, b/b = 0коли це нормально (і я впевнений, що це легко довести з усіх різних аксіом), очікується, що це 1 (інакше, мультиплікативна зворотна величина b, здається, не є його мультиплікативною зворотною). Я впевнений, що ви просто не можете пробити пробіл проти поділу на нуль, додавши b=1/0щось подібне.
мій займенник monicareinstate

30
Існує причина, що поділ на нуль не визначено ... . Отже, ви повинні мати можливість спростити всі приклади (за винятком третини з 0) до простоbб=1б=11б=33б=3130=30=310=3бб
Здебільшого нешкідливих

8
Чи не повинен третій приклад мати вихід, 0bа не 0? Якби два вирази були рівнозначними, тоді питання не мав би передумови
трихоплакса

4
Рекомендований тестовий випадок:3.1b/0
jimmy23013

Відповіді:


19

Мальболж Несхилений (варіант обертання на 20 тріт), 3,62е6 байт

Розмір цієї відповіді перевищує максимальний розмір програми, що може бути розміщений (eh), тому код розташований у моєму сховищі GitHub (зверніть увагу: не копіюйте код за допомогою CTRL + A та CTRL + C, просто клацніть правою кнопкою миші та натисніть «Зберегти елемент призначення як. .. ").

Як це запустити?

Це може бути складним, тому що наївний перекладач Хаскелла віками буде віком для цього. TIO має пристойного перекладача Malbogle Unshackled, але, на жаль, я не зможу ним користуватися (обмеження).

Найкраще, що я міг знайти, - це фіксований варіант ширини обертання на 20 тріт, який працює дуже добре, обчислюючи (в значній ) миттєво .

Щоб зробити перекладача трохи швидшим, я видалив усі чеки з неперевершеного перекладача Мальтіаса Лютера.

#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 з першого погляду, важко сказати, це польська мова чи просто Мальболге. На жаль, моя мова - це пекло на землі.
Krzysztof Szewczyk

7

PHP , 65 64 61 58 байт

-1 байт, використовуючи a b замість ''(порожній рядок). Оскільки "b" s оброблені, то в цьому конкретному випадку воно буде таким же, як і порожній рядок.

-3 байти, використовуючи substrзамістьexplode щоб отримати першу частину введення.

-3 байти, використовуючи кращі методи виявлення 1та -1.

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

Спробуйте в Інтернеті!

Тести: Спробуйте онлайн!

Якщо перша частина вводу перед "/" (ми це називаємо $n ) дорівнює 0, друкується 0.

Else друкує $nсебе з будь-яким "b" в кінці, обрізаним з нього, і особливими справами -1 і 1 обробляються, тому цифра "1" не друкується. І в кінці додається єдине «б». Обрізна частина полягає в тому, щоб ми не отримали подвійного "b" наприкінці типу "3bb".


дуже красиво зроблено!
Lyxal

Заміна $n==-1на $n>0(-2 байти), здається, працює. Ви можете спробувати це.
Ісмаїл Мігель

@IsmaelMiguel, це не працює, якщо ви мали на увазі $n<0, це теж не працюватиме, оскільки у нас є такі дані -8/0.
Ніч2,

@IsmaelMiguel, але ви дали мені ідею, замінити $n==-1?'-':$nз , $n+1?$n:'-'щоб зберегти 2 байти!
Ніч2

1
: / Коли я тестував, здавалося, працює. але добре, що ви знайшли інший шлях.
Ісмаїл Мігель


4

Желе , 18 байт

Я вкрав у цього Еріка ṾṖ$İƑ¡ (інакше мені також було б 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
Ерік Вигнавець

4

Perl 6 , 32 байти

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

Спробуйте в Інтернеті!

Пара регексів, один для перевірки того, чи є вхід 0/0, а другий для заміни останнього /0на просто b(і для видалення старого b,1 і / або -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, тому, можливо, є багато місця для гри в гольф.



Після полювання на те, що \bробить (я, що недосвідчений з регулярним виразом), я трохи розчарувався, виявивши, що його не можна скоротити до недрукованого персонажа задньої області. Так чи інакше, дякую
Непов’язана струна

1
@UnrelatedString, звичайно, його не можна скоротити до простору, зрештою, \bце лише ASCII-представлення символу backspace у звичайних рядках: 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 Добре, нове тут, тому не зрозуміла, що заява про імпорт була включена (хоча, звичайно, так і є). Відредаговано.
Казим

Ласкаво просимо! :) Ти все ж можеш зберегти скорочену версію лямбда! Це не потрібно бути повноцінною програмою. І заяву про імпорт можна розмістити після визначення лямбда, тому можливі 64 байти !
movatica

1
@movatica ах, приємно! Я не знайшов способу змусити це працювати з імпортом та лямбда. Дякую
Казим

1

Кег , 18Б

Вся заслуга в 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.

ТІО!



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, але це ніколи не було в прикладі введення чи тесту, тому це правильно.
гіробуз

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

Так, в основному це замінює тільки /0для bі не бере до уваги будь - якого з випадків , для 0b, 1b, -1bабо будь - яких вихідних даних , які вже міститьb
Джо Кінг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.