Pull to refresh

Comments 19

Сколько же у вас свободного времени...
Привезите нам ещё этой херни
Привезите нам ещё этой херни
UFO landed and left these words here

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

Я тоже недавно сделал примерно такой же язык, транслирующийся в whitespace, для написания программ в рамках adventofcode. Выглядит так:

; Push "Hello world\n" to the stack

push '\n'
push 'd'
push 'l'
push 'r'
push 'o'
push 'w'
push ' '
push 'o'
push 'l'
push 'l'
push 'e'
push 'H'

push 12 ; string length

loop:
    swap ; swap length with char
    putchar

    ; length -= 1
    push 1
    sub

    ; if (length == 0) exit
    dup
    jz end
    jmp loop

end:
    exit


Круто! Лаконичнее, чем у меня. Дадите ссылку, если есть?

Решил перед полным прочтением написать аналогичную программу самостоятельно. Вот, что получилось:

; heap[0] - number, heap[1] - last_number

push 0
dup

; [sum, count]
loop:
    push 0
    dup
    getnum
    load

    ; [number, sum, count]
    dup
    jl check_input

    ; [number, sum, count]
    dup
    push 1
    swap
    store ; heap[1] = number

    ; [number, sum, count]
    add
    swap
    push 1
    add
    swap

    ; [sum, count]
    jmp loop

check_input:
    ; [-1, sum, count]
    drop
    swap
    push 2
    sub

    ; [count - 2, sum]
    jl wrong_input

    ; [sum]
    push 1
    load
    dup

    ; [last_number, last_number, sum]
    jz zero_division_error

    ; [last_number, sum]
    sub

    ; [sum - last_number]
    dup
    push 1
    load

    ; [last_number, sum - last_number, sum - last_number]
    mod

    ; [(sum - last_number) % last_number, sum - last_number]
    push 1
    load
    swap

    ; [(sum - last_number) % last_number, last_number, sum - last_number]
    push '('
    push 't'
    push 'n'
    push 'u'
    push 'o'
    push 'm'
    push 'a'
    push ' '
    push 'd'
    push 'e'
    push 'r'
    push 'e'
    push 't'
    push 'n'
    push 'e'
    push 15
    call print_string

    ; [(sum - last_number) % last_number, last_number, sum - last_number]
    jz success

    ; failure [last_number, sum - last_number]
    swap
    putnum

    ; [last_number]
    push ' '
    push 'y'
    push 'b'
    push ' '
    push 'e'
    push 'l'
    push 'b'
    push 'i'
    push 's'
    push 'i'
    push 'v'
    push 'i'
    push 'd'
    push ' '
    push 't'
    push 'o'
    push 'n'
    push ' '
    push 's'
    push 'i'
    push ' '
    push ')'
    push 22
    call print_string

    putnum
    push ' '
    putchar

    call without_remainder
    push '\n'
    putchar
    exit

wrong_input:
    push '\n'
    push 't'
    push 'u'
    push 'p'
    push 'n'
    push 'i'
    push ' '
    push 'd'
    push 'i'
    push 'l'
    push 'a'
    push 'v'
    push 'n'
    push 'i'
    push ' '
    push ','
    push 'r'
    push 'o'
    push 'r'
    push 'r'
    push 'e'
    push 21
    call print_string
    exit

zero_division_error:
    push '\n'
    push 'r'
    push 'o'
    push 'r'
    push 'r'
    push 'e'
    push ' '
    push 'n'
    push 'o'
    push 'i'
    push 's'
    push 'i'
    push 'v'
    push 'i'
    push 'd'
    push ' '
    push 'o'
    push 'r'
    push 'e'
    push 'z'
    push 20
    call print_string
    exit

success:
    ; [last_number, sum - last_number]
    swap
    putnum

    ; [last_number]
    push ' '
    push 'd'
    push 'e'
    push 'd'
    push 'i'
    push 'v'
    push 'i'
    push 'd'
    push ' '
    push 's'
    push 'i'
    push ' '
    push ')'
    push 13
    call print_string

    call without_remainder

    push ' '
    push 'y'
    push 'b'
    push ' '
    push 4
    call print_string

    putnum
    push '\n'
    putchar
    exit

; void without_remainder(void)
without_remainder:
    push 'r'
    push 'e'
    push 'd'
    push 'n'
    push 'i'
    push 'a'
    push 'm'
    push 'e'
    push 'r'
    push ' '
    push 't'
    push 'u'
    push 'o'
    push 'h'
    push 't'
    push 'i'
    push 'w'
    push 17
    call print_string
    ret

; void print_string(int length, char *str)
print_string:
    swap ; swap length with char
    putchar

    ; length -= 1
    push 1
    sub

    ; if (length == 0) return
    dup
    jz end_print_string
    jmp print_string

end_print_string:
    drop
    ret


Вот ссылка на интрепретатор с кодом: https://tio.run/##pVVJDsIwDDyPX@EPcGD5EEJIcEMCieeXZpzFCS4rFarr2BMvE@d@Ot@O18v@cJwmVRU@mv@iEKRfkueXrSnsS5E@BNRkmf5iJpLX@CIQ3Ys0a0E/FFTuBDQbc0eOJ29polY4atG0Taxai1kt4ALgsBpADWfQRvt6A8zZckWyraQ4MOxJnxpTxhlicuHraEpsFykCLQLblqsPpk8KY36dabBXW3c6lsAw@vzTurSeKLJKyJaK8xQaut5EXcCb5roydDUNS/YS1vl7nrTiOW1IJAqFKJY5xsx/wl2oDEKG/MmbOK7uMLiG6pDv4tmIz2PcyK9Y/iF1fWscTz8@vPpM/IHjL4um8Yjp9tRotAW48SFfGpPxQOhqXWvhxpyxt3RTyyVQJzs4/2G3Aa@O5DRNG9nKTlbrBw

Получилось 1635 байт whitespace. А теперь пойду читать

Посмотрел эту статью ради комментариев,

А она всём пофигу.

Автор, потратьте время на что-нибудь более полезное)

Обидно.

Как решение , могу предложить вам не читать такие статьи, если не хотите потреблять такой контент.

А насчет "всем пофигу" - мне после публикации этой и предыдущей статьи писали несколько человек, с благодарностями за интересную тему, мало известную в интернете, и просили разъяснения отдельных моментов.

Так что статья своего читателя нашла, просто это не вы.

Никогда бы не поверил, что у людей бывает настолько много ненужного свободного времени, если бы не увидел эту статью.

Спасибо за 2 великолепнейшие статьи!!! Сам недавно писал похожие задачи на brainfuck, тоже сделал себе генератор для упрощения кодинга, думал после этого взяться за whitespace, но Вы меня опередили ))

Sign up to leave a comment.

Articles