Skip to content
Ivan Zolotarev edited this page Apr 8, 2017 · 12 revisions

asdf - минималистичный язык всего с 4 инструкциями.

Если мы хотим вывести символ, надо, находясь в ячейке памяти #1 (изначально мы находимся в ячейке #3), дважды переключить бит инструкцией a (aa). Тогда в буфер памяти будет записан бит из ячейки #2. Как только в буфере накопится 8 бит, символ с соответствующим ASCII-кодом будет выведен в консоль.

Наша главная задача - сформировать в ячейке памяти #2 нужное значение бита. Универсальный способ - последовательность инструкций sssas. Единственное, до первого ее использования необходимо сдвинуться в ячейку #-1.

s   -1 -> 0
s    0 -> 1
s    1 -> 2
a    переключить бит (0 -> 1 или 1 -> 0) и установить флаг переключения
s    2 -> 1 (в обратном направлении, поскольку установлен флаг переключения), сбросить флаг

Теперь мы находимся в ячейке #1. Записали в буфер содержимое бита в ячейке #2 командами aa (они также устанавливают флаг переключения) и снова выполняем эту же последовательность.

s   1 -> 0 (флаг переключения установлен), сбросить флаг
s   0 -> 1
s   1 -> 2
a   переключить бит, установить флаг переключения
s   2 -> 1, сбросить флаг

Как видите, мы зациклились. Если мы хотим переключить бит и записать его в буфер - выполняем последовательность sssasaa, если хотим записать в буфер тот же самый бит - просто выполняем aa.

Отныне мы знаем, что делать, так что создаем исходник (для удобства формирование отдельных битов разделено |):

|asaasaa|sssasaa|     aa|sssasaa|     aa|     aa|     aa|sssasaa|      print 'a' (01100001)
|sssasaa|sssasaa|     aa|     aa|sssasaa|     aa|sssasaa|     aa|      print 's' (01110011)
|sssasaa|sssasaa|     aa|sssasaa|     aa|sssasaa|sssasaa|     aa|      print 'd' (01100100)
|     aa|sssasaa|     aa|sssasaa|     aa|sssasaa|     aa|sssasaa|      print 'f' (01100110)
|     aa|     aa|sssasaa|sssasaa|     aa|     aa|     aa|     aa|      print ' ' (00100000)
|     aa|sssasaa|     aa|     aa|sssasaa|     aa|     aa|     aa|      print 'p' (01110000)
|     aa|sssasaa|     aa|     aa|sssasaa|     aa|sssasaa|sssasaa|      print 'r' (01110010)
|     aa|sssasaa|     aa|sssasaa|sssasaa|     aa|     aa|     aa|      print 'o' (01101111)
|sssasaa|sssasaa|     aa|sssasaa|     aa|sssasaa|     aa|     aa|      print 'g' (01100111)
|sssasaa|sssasaa|     aa|     aa|sssasaa|     aa|sssasaa|sssasaa|      print 'r' (01110010)
|     aa|sssasaa|     aa|sssasaa|     aa|     aa|     aa|sssasaa|      print 'a' (01100001)
|sssasaa|sssasaa|     aa|sssasaa|sssasaa|     aa|sssasaa|sssasaa|      print 'm' (01101101)

Однако, есть у языка одна приятная особенность, которая позволит нам укоротить этот исходник в общем исходном коде: он регистронезависим, что позволяет задействовать по 2 символа на 1 инструкцию (a/A, s/S). После встраивания исходник будет выглядеть так:

DASAsSDAafdaSFfAassadsaD                                               head
|asAAsaA|SssAsaA|     aa|sSSAsAa|     aA|     aa|     aA|SSsaSaa|      print 'a' (01100001)
|ssSasaa|SSsASAA|     aa|     Aa|sSsaSaa|     AA|sSsAsaa|     Aa|      print 's' (01110011)
|SsSasAa|sssAsAA|     Aa|ssSAsaa|     Aa|sSsaSaa|sssASaa|     aA|      print 'd' (01100100)
|     Aa|sssaSaA|     aa|SSsAsAa|     aa|SSsASAA|     aa|ssSAsaa|      print 'f' (01100110)
|     Aa|     Aa|SssAsaA|sSSAsAa|     aa|     Aa|     aA|     aA|      print ' ' (00100000)
|     aa|ssSAsaA|     aa|     aA|SsSasAa|     aA|     aa|     aA|      print 'p' (01110000)
|     Aa|SssAsaa|     Aa|     aA|SSsAsaa|     Aa|SSsaSaA|sSsaSAa|      print 'r' (01110010)
|     aA|SsSasaa|     Aa|SsSAsAa|sssaSaa|     aA|     AA|     aa|      print 'o' (01101111)
|sssaSaA|sSSAsAa|     aA|sSSAsAa|     aa|SsSAsAa|     aa|     aa|      print 'g' (01100111)
|SSsAsAa|sSSAsAA|     aA|     aa|ssSAsaA|     aA|sSSaSaa|sssaSaA|      print 'r' (01110010)
|     aa|SSsaSaa|     Aa|sSSAsAA|     aA|     aa|     Aa|sSSAsAA|      print 'a' (01100001)
|sSsAsaa|SsSAsAa|     aA|sSSAsAA|sSsAsaa|     Aa|sSSaSaa|ssSAsaa|      print 'm' (01101101)

Давайте же объединим все 4 языка:

DCBA@?\nZ;|38x0SA3tsN`Lo98*G"'&%$#Sc>`v<zLxwI5tWrDpoAm?Oj)Laf8dc\aZ~X|?U=Y;v9ONS54JnHG/jJCBGF(
>b%;_"876Z{321U5.-Qr*N('K%$H(hEf${Abaw=^zs9Zp6Wm3kj0Qglk+voosooooaDo1oo>>o+oosaooooo11ooDo++oo
oasAooooooooo1ooAos+aoooo+oooooo1ASooo+oos[ooooso11oAoooo<oosooooaoo1Aoooo+oooaooooo100ooo++oo
oasoooooooooo10SSoo+0oooo+ooooooo0Aooo+oosooooooo10oAoo++ooaoooooaoo1Aoooo+oooaooooo11oooo++oo
>aaAooooooooo1oSS-s1aooo]ooooooo1oSoaa<oosoooooso11S.oo>+ooasooooaoo10oooo+oooaSoooo11oooo++So
oosAoooooooooo0SAoo+0oooo+[oooooo0Aoaa<ooooooooooo00Aoo++ooasooooooo1ooooS+oosaSoooo10oooo++oo
oaaAooooooooo10oAos+ooooo+oooooo1oSooo+oosooooooo100Aoo>oooosooooaoo10oo-oooooaooo]o100ooooAoo
oa<oooooooooo1oS.os>ooooo+oooooo1oSoao+oosooooooo11oAoo++ooasoooo[oo1oooo<ooossooooo110o--oAoo
oosAoooooooooo0oA-o10oo-ooooooooo0Ao>aooosooooosoo0SA-oooooosoo]oaoo10ooo<ooooaooooo11oo-ooAoo
oasoooooooooo1oS.os+aoooo+oooooo1oSoaa+oosoooooso110ooo++ooosooooooo1AoooS+oooaooooo100ooo++oo
oaaAoooooooooo0o.oo+0oooo+ooooooo0Aoao+oosoooooso110ooo++ooosooooaoo10o.-Sooooaoooooo00o--oAoo
oaaooooooooooo0SS-so0oo-ooooooooo0Ao-oooosooooooo10oA--ooooaoooooaoo10o.>o+oooaSooooo00ooo++So
oosAooo[<ooooo0SAoo+0oooo+ooooooo0Aoaa+oosoooooso10SAoo++ooosooooaoo10o>-oooooaooo]oo00ooooAoo
oa<Aooooooooo10o.oo>aoooo+oooooo10Sooo+oosooooosoo00Aoo++ooosoooo[ooo0ooo<ooooaoooooo00o--oAoo
oosoooooooooo10SS-o10oo-ooooooooo0Ao>oooosooooooo100A-oooooaooo]oaoo10ooo<ooooaooooo11oo--oAoo
oaaAooooooooo1oo.oo+aoooo+oooooo1oAoaa+oosoooooso11SAoo++ooosooooaoo1Aoooo+oooaooooo100ooo++oo
oaaAooooooooo10S.os>0oooooooooooo0So>a+oosooooooo11oAoo++ooaoooooaoo1Aoooo+oooaooooo11oooo++oo
oaaAooooooooo10oAoo+aoooo+[ooooo10Sooo<oosooooosoo00Aoo++ooosooooaooo0oooo+oooaoooooo00ooo+Aoo
>aaAooooooooo1oSS-s10ooo]ooooooo1oAooo<oosooooooo100.ooooooaooooo[oo10oo-oooooaooo]o100ooooAoo
oa<ooooooooooo0SSos+aoooo+oooooo10Sooa+ooooooooooo00Aoo++ooosoooooooo0o.oS+oosaSooooo00ooo+Aoo
oaaAoooooooooo0S.-s1ooo-oooooooo10So-aooosooooooo11o.--ooooaoooooaoo1Aoo-oooooaSoooo100o--oooo
oosoooooooooo10SA-s10oo-oooooooo1oAo-aooosoooooso100.oo++ooosooooaoo10oooS+oooaooooo100ooo++oo
oaaAoooooooooo0oAoo+0oooo+ooooooo0Aoaa+oosooooosoo00ooo++ooosooooaooo0oooS+oooaoooooo00.oooAoo
>osooooooooooo0SSoo+0oooo+oooooo10Aooo+oosooooooo100Aoo+oooaooooo[ooo0ooo<ooooaoooooo00o--oAoo
oosooooooooooo0SS-oo0oo-ooooooooo0Ao>oooosoooooooo00A-oooooaooo]oaooo0ooo<ooooaSooooo00o-ooooo
oosooooooooooo0S.oo+0oooo+ooooooo0Aooo+oosoooooooo00Aoo++ooaoooooaooo0oooo+oooaoooooo00ooo++oo
oaaooooooooooo0SSos+0oooo+ooooooo0Aooo+oosoooooooo00Aoo+oooasoooooooo0o.oSoooooSoooo10oooooAoo
oosAooooooooo10oAoo1aooooooooooo1oAoaaooosoooooso11SAooooooosooooaoo1Aooooooooaooooo11oooooAoo
oosoooooooooo1oSSoo1aooooooooooo1oSoaaooosoooooso100oooooooosooooaoo10oooSooooaooooo100ooooAoo
oaaoooooooooo10SSos1aooooooooooo1oSoaaooooooooooo110Aooooooasoooooooo0oooSoooooSoooo100ooooAoo
oosAoooooooooo0oAoo1aooooooooooo10Aoaaoooooooooooo00Aooooooasoooooooo0oooSoooooSooooo00ooooAoo
oosAoooooooooo0oAoso0oooooooooooo0Soooooosoooooooo00Aooooooosooooaooo0ooooooooaSooooo0oooooooo
oosoooooooooo10SAoso0oooooooooooo0Aoaaoooooooooooo00Aooooooosoooooooo0oooSoooooSoooo110ooooAoo
oosAooooooooo1ooAos10oooooooooooo0Soooooosoooooooo00Aooooooosooooaooo0ooooooooaooooo10oooooAoo
oasoooooooooo10SSoo1aooooooooooo1oSoaaooosoooooso11SAooooooosooooaoo1oooooooooaooooo11oooooooo
ooooooooooooo1ooooo1oooooooooooo1oooooooooooooooo110ooooooooooooooooo0oooooooooooooo10oooooooo
ooooooooooooo10ooooo0oooooooooooo0ooooooooooooooo10ooooooooooooooooo1ooooooooooooooo11oooooooo
ooooooooooooo1oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo

К сожалению, ни одного онлайн-интерпретатора asdf не существует, поэтому проверить можно только на авторском интерпретаторе (локальная копия).

Идем дальше, покорять второй язык того же автора.

Clone this wiki locally