Зробіть мудрі номери


18

Wise - це проста розрядна мова, яку я розробляв за часом. Він заснований на бітових операціях Python . У ній є кілька операцій, більшість із них однакові або дуже схожі на еквівалентний символ у Python.

  • : Дублюйте верхню частину стека

  • ? Поверніть верхню частину стека донизу

  • ! Поверніть нижню частину стека вгору

  • [ ] цикл, поки верхня частина стека не дорівнює нулю

  • ~не верхня частина стека ( -(n+1))

  • -заперечувати верхню частину стека ( -n)

  • >двічі змініть верхню частину стека праворуч ( n//2)

  • <двічі змініть верхню частину стека один раз вліво ( n*2)

  • ^xor два найкращі елементи стека (те саме, що і Python )

  • |або два найкращі елементи стека ( Те саме, що і Python )

  • &і два найкращі елементи стека ( Те саме, що і Python )


Зробити ціле число в Мудрому досить просто, ви можете зробити нуль ::^і збільшити його, ~-щоб ви зробили нуль і збільшували його купу разів. Однак якщо ми видалимо -речі, станемо трохи цікавішими.

Ми можемо зробити кожне число за допомогою операцій, що залишилися. Наприклад ось 3

~<<~

ТІО

Це працює, тому що ~перетворює нуль, нескінченну рядок 0бітів, в негативну, нескінченну рядок 1бітів, кожен <додає 0трохи до кінця, коли ми зробимо це, ~який перетворить кожний на рядок 0s, а потім два 1s , або, як це називає більшість людей 3.


Завдання

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

Це не тому ви повинні прагнути мінімізувати генеруючий вихідний код, не обов’язково вихідний.

Приклади виходів

Цей список не є вичерпним, вони просто можливі результати

1  -> ~<~
2  -> ~<~<
3  -> ~<<~
4  -> ~<~<<
5  -> ~<~:<<|
6  -> ~<<~<
7  -> ~<<<~
8  -> ~<~<<<
9  -> ~<~:<<<|
10 -> ~<~:<<|<
11 -> ~<<~:><<<|
12 -> ~<<~<<
13 -> ~<<~:<<<|>
14 -> ~<<<~<
15 -> ~<<<<~
16 -> ~<~<<<<

0 включено вpositive integers
colsw

4
Ні, 0 не включається до натуральних чисел.
Zacharý

Мабуть, :нанесений на порожній стек штовхає a 0. Я думаю, що це слід уточнити, оскільки не очевидно, що дублювання з порожнього стека має дати0
Луїс Мендо

Чи є помилки в синтаксисі інших символів чи вони ігноруються?
xnor

@Luismendo ви не знаєте вмісту стека, крім того, що теж, якщо стек дорівнює нулю
Post Rock Garf Hunter

Відповіді:


8

Japt , 10 байт

¤d0'<1"~<~

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

Основна ідея: візьміть двійкове представлення числа та переведіть 0на <та 1до~<~ . Виходи для 1-10:

 1: ~<~
 2: ~<~<
 3: ~<~~<~
 4: ~<~<<
 5: ~<~<~<~
 6: ~<~~<~<
 7: ~<~~<~~<~
 8: ~<~<<<
 9: ~<~<<~<~
10: ~<~<~<~<

Метагольфінг це теж було б легко. Просто пар смужок~~
Draco18s більше не довіряє SE


7

Haskell , 38 байт

Я відчуваю, що PPCG справді покращує мій Haskell. Погладжує білу кішку.

f n=mapM(["<","~<~"]<$f)[1..n]!!n>>=id

fбере Intі повертає aString .

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

(Я посилаюся на це <$fдо речі. Це економить персонаж \_->.)

У Functorразі для (->) a(функцій від типу a), ми маємо: x <$ f = fmap (const x) f = const x . f = const x. Єдине обмеження полягає в тому, що fі для фіналу const xнеобхідно використовувати один і той же тип джерела a. Екземпляр повністю лінивий, тому це навіть не оцінюється f.

Крім того, однакова довжина, але менше зла ( (l!!)є анонімною функцією):

(l!!)
l=(++)<$>"":tail l<*>["<","~<~"]

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

Обидва вони використовують те саме представлення, що й відповідь Japt @ETHproductions, хоча особливо перший може дати кілька зайвих <s на початку.

Перший обчислює всі комбінації n "<"та"~<~" рядків, а потім індексує в отриманий список.

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


1
Як на землі це <$fпрацює? Якийсь дивний екземпляр функтора?
xnor

@xnor Mwahahaha Я думаю, я повинен тоді додати пояснення.
Ørjan Johansen

3

Рубі , 118 116 109 107 105 91 байт

Збережено 2 байти завдяки cyoce!

->n{o={0=>""}
o.dup.map{|c,k|["~~c","<c*2"].map{|t|o[eval t[1..9]]=k+t[0]}}until o[n]
o[n]}

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

Це функція, яка приймає ціле число як вхідне і повертає рядок, що представляє це ціле число в Wise. Ви можете знайти ungolfed версію тут , яка перевіряє цю програму на всіх цілих чисел від 1 до.

Основна ідея - записати "пул" констант. Потім з кожним «кроком» константи додаються до пулу для кожної можливої ​​функції. Я вибрав функції ~, <і >, які я вважаю достатніми для представлення кожного числа. (Принаймні, кожне число під 10000.)


Ви можете використовувати dupзамість cloneIIRC
Cyoce

Вам навіть потрібно dup? mapне змінює його приймач.
Cyoce

@Cyoce Я думаю, що це робить
Conor O'Brien

О, я бачу зараз. Рубі не подобається змінювати під час ітерації.
Кіос

3

Python2, 54 52 51 байт.

lambda x:'<'.join('>~<~'*int(i)for i in bin(x)[2:])

Завдяки Wheat Wizard за збереження 2 байтів та Ørjan Johansen за один байт! Для цього використовується така ж ідея, як відповідь Japt ETHproduction, але з різними рядками заміни (тобто з використанням двійкового представлення)


Вам не потрібно [ ]навколо генератора всередині join. joinможе взяти генератор як аргумент.
Опублікувати Rock Garf Hunter

Я думаю, що '>~<~'*int(i)може врятувати вас байт.
Ørjan Johansen

Я вважаю, що останній результат повинен бути занесений останнім, на користь автоматизованих фрагментів табло тощо.
Ørjan Johansen

Там, шкода, що запізнився на це.
Zacharý

2

05AB1E , 11 байт

bS'<…~<~‚èJ

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

Подібно до Japt відповіді ETHproductions.

Збережено 4 байти завдяки @Adnan!


Гей приємно! Насправді вам не потрібно перетворювати числа в рядки, оскільки вони рівні "типам" у 05AB1E. Те саме для літералів числа (можна обійтися і без цього '). Ви також можете використовувати індексацію, яка повинна вам дати 11 байт :).
Аднан

@Adnan Дуже дякую!
Товариш SparklePony

@Adnan Лише швидке запитання, як тут працює?
Товариш SparklePony

По-перше, він міняється аргументами, оскільки він би стався винятком, якщо його оцінювали нормально. Після заміни він відображає карти0 на нульовий елемент і 1на перший елемент (тому що він векторизується автоматично). Ось більш чіткий приклад того, як це працює.
Аднан

1

Python 2 , 123 110 байт

def w(x):a=map(int,bin(x)[2:]);return x%2*("~<~:<"+"<".join(":"*e for e in a[-2::-1])+"|"*sum(a))or w(x/2)+"<"

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

Також як lambda

w=lambda x:x%2*("~<~:<"+"<".join(":"*int(e)for e in bin(x)[-2:2:-1])+"|"*sum(map(int,bin(x)[2:])))or w(x/2)+"<"

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

Може бути коротшим, але ось моє рішення. Він бере бінарне подання і перетворює його в код.



0

Желе, 11 10 байт

Bị“~<~“<”F

Це перенесена версія Japt відповіді ETHproductions. Якщо говорити про ETHproductions, вони врятували мені один байт!


Чи можете ви поміняти місцями рядки і зробити вигляд, що індексація заснована на 0?
ETHproductions

Що ви маєте на увазі? Я маю на увазі той факт, що я повинен збільшити двійкове представлення числа, щоб отримати корисні індекси.
Zacharý


Не працює, 1 виробляє <, який у Wise виробляє 0
Zacharý

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.