> <> (Риба), 107 106 103 байт
<v}:{r&" "
1xv+
2<v+
v}<
<~v!?=&:&:
6.>ol2-?!;a
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o-+
^3<v ~}}r]~<
.40<
Спробуйте в Інтернеті!
Це не надвипадково, але випадково. Просто помістіть рядок і ціле число в стек (Приклад: "Привіт, світ!", 5).
Input: "Hello world!", 5
Output: H^\^]^eceeedldcdeclgfffhowhhfggojkkkkrdccedl]]\]\d
Повне пояснення
Це трохи старша версія коду, поки я не оновлюю пояснення. Це здебільшого те саме, просто, можливо, трохи простіше читати:
< v}:{r&" "
+1xv
+2<v
}
:&:<~ v!?=&
?!;a6.>ol2-
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o+*
^3<v ~}}r]~<
.43<
Ми зробимо вигляд, що параметр string є, s
а параметр integer є i
.
< v}:{r&" "
<
Каже рибу негайно рухатися вліво, який обертає навколо " "
, який додає простір characted в стек. Потім риба подорожує &
, що додає місця до реєстру. r
повертає стек і {:}
зміщує стек вліво (ставлячи i
на кінець стека), копіює значення на кінець стека, а потім зміщує його вправо. v
каже рибі почати рухатися вниз.
+1xv
+2<v
}
x
вказує рибі рухатися у випадковому напрямку, в кінцевому підсумку в результаті риба рухається праворуч і продовжується вниз, або проходить над 1+
або 2+
попередньо. Вони додають відповідно 1 або 2 до числа на кінці стеку. Якщо риба рухається вгору, вона б’є v
знову і рухається назад вниз. }
зміщує стек вправо, після чого, перебуваючи i
в позиції 1 на стеку, і ця нова змінна в позиції 0 (ми називаємо це m
).
:&:<~ v!?=&
Цей розділ є функцією, назвемо його whitespaceTrimmer . Починається там, де <
є. Він просто знімає пробіли, які знаходяться на кінці стека (так це початок рядка), поки він не перетвориться на непробільний символ.
Тож риба одразу запливає в a <
і повинна подорожувати зліва. Потім він запускає, в :&:&
який копіює значення на кінці стека, розміщує простір з регістра на кінець стека, копіює його, а потім повертає його назад до регістра.
Потім риба потрапляє =?!v ~
, а точніше, =
яка вискакує останні два значення (два, що ми тільки що створили) зі стека, порівнює їх, ставить 1 на кінці стеку, якщо вони рівні, і 0 на кінець стека, якщо вони різні. ?
Вискакує нове значення з кінця стека, якщо 0 воно не виконує таку інструкцію, яка в даному випадку !
, замість цього він виконує v
, який замовляє рибу рухатися вниз (вихід з функції).
Якщо це 1, то він знайшов пробіл, тому він виконує !
батут, і це змушує рибу пропустити наступну інструкцію, яка є v
, тому риба продовжується. Перед рибою він бачить, ~
яке вказує їй вивести останнє значення зі стека (підтверджено пробіл), потім риба продовжує і знову запускає функцію.
?!;a6.>ol2-
Рибі негайно кажуть плавати прямо, а >
потім виводити останнього символу на стек o
(який, вперше це запускається, є першим символом s
). Він отримує довжину стека від l
, розміщує a 2
на кінці стека, а потім -
призводить до віднімання 2 l
. Це вражає, ?!;
що, пам’ятаючи, що ?
це робить, змушує рибу пропускати, !
якщо стек порожній, і приземляється ;
, що закінчує програму.
Слідом за тим, якщо на стеку є ще символи, ми виконуємо, !
що змушує рибу підстрибувати над ;
та виконувати a6.
, що зберігає a
(AKA 10
), і 6
в кінці стека, які є x, y
координатами для .
, що вискакує на них у кінці стека, потім телепортує рибу до 10, 6
та виконує інструкцію праворуч від цього пози (як риба плаває правильно).
Це менш складно, ніж це звучить, коли ви усвідомлюєте, що y
позиція 6 - це рядок нижче цього. x
позиція 10 - то v
, і праворуч від того
, що є неоператором. Це змушує рибу продовжувати плавати правильно і насправді починати виконання на початку рядка ...
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o+*
^3<v ~}}r]~<
.43<
Отже, це функція, яка додає випадковий текст між символами. Це трохи рот, але це лише тому, що я намагався зробити це трохи зайвим випадковим чином. Назвемо цей genRandomChars .
Це :{{:}l1-[rv
насправді налаштування для функції, і менш того, частина фактичної самої функції. Спочатку риба плаває, над :{{
якою копіює значення на кінці стеку, потім двічі зміщує її вліво. Якщо ви пам'ятаєте, що це i
було в позиції 1 на стеку, то ви знаєте i
, що зараз на кінці стека.
Потім риба плаває над тими, :}
хто копіює i
, і зміщує стопку вправо, розміщуючи i
як на початку, так і в кінці стека. l1-[
має риба розмістити довжину на кінці стеку, відняти 1 від неї, потім [
створити новий стек, перемістивши l-1
(довжина стека мінус 1) значення на новий стек (так що просто залишивши i
на старій стеці). Тоді риба просто потрапляє, rv
що повертає стек знову (я думаю, що створення нового стека відміняє його чомусь), і наказує рибі ще раз плисти вниз, справді запускаючи функцію <
внизу.
Таким чином, на даний момент кінець стека має m
і наше тимчасове i
, яке ми будемо називати ti
. Одразу риба перепливає 1-}
, яка віднімає 1 від ti
і переміщує її до початку стека. Потім він :}
просто копіює m
і переміщує його до початку стека (ставлячи ti
в позицію 1 стека).
Це коли ми потрапили на цю дрібницю:
v2<
<1x|!
^3<
Це насправді мертве просто. !
Змушує рибу пропустити |
і виконати x
. Пам'ятаючи, що x
робить, ми пам’ятаємо, що це змушує рибу рухатися в будь-яких 4 напрямках. |
просто дзеркало, і змушує рибу плавати назад x
. Отже, риба розмістить 1, 2 або 3 на кінці штабеля і продовжить рух вліво, обернувшись навколо.
Потім риба виконує, *+o
що спричиняє спливання останніх двох значень у стеку, множення разом, а результат відштовхується назад, потім те саме, що додається, потім кінцеве значення вискакує з стека і виводиться за допомогою o
. Наш стек тепер відносно нормально знову , що містить тільки [ m
, ti
, s
].
:}}:
викликає s
копіювання значення на кінці стека (в основному положення 0), потім стек двічі зміщується вправо (знову розміщується ti
на передній панелі), потім ti
копіюється. ?!v
На даний момент це має бути досить легко зрозуміти. В основному, якщо ti
це 0, тоді ми виходимо з функції v
, в іншому випадку виконуємо !
і пропускаємо v
(робимо інший цикл).
Якщо ti
0 і ми виводимо трохи випадкові символи, то виконуємо v
і бачимо:
v ~}}r]~<
.43<
Тут нічого надто фантазійного. Видаляємо ti
зі стека через ~
. Тоді ]
новий, він вискакує всі наші цінності зі стека та розміщує їх на старій стеці! З - за це питання розвороту ми зі зворотним r
, то зрушувати стек вправо двічі }}~
, shufting стек справа, що дає нам [ m
, i
, s
], то ~
є , щоб видалити зайву дубльовані s[0]
раніше в функції , як ми повинні були б, якщо ми робили цикл (але це не так, ми виходимо). v
говорить рибі плавати вниз і в >34.
(перевернутий, щоб показати порядок виконання), який говорить рибі просто плавати ліворуч 3, 4
(тому що .
це стрибок!). 3, 4
насправді просто праворуч від початкуwhitespaceTrimmer
, що ідеально, тому що ми подорожуємо ліворуч.
Дотримуючись усієї цієї логіки, ми можемо слідувати за рибою до тих пір, поки стек остаточно не порожній і програма не завершиться після whitespaceTrimmer
виконання.