明智的数字


18

明智是我前一段时间设计的一种简单的按位语言。它基于Python的按位运算。它有几个操作,其中大多数与Python中的等效符号相同或非常相似。

  • : 复制堆栈顶部

  • ? 将堆栈顶部旋转到底部

  • ! 将堆栈底部旋转到顶部

  • [ ] 在栈顶不为零时循环

  • ~不是栈顶(-(n+1)

  • -否定堆栈顶部(-n

  • >将堆栈顶部向右移一次(n//2

  • <将堆栈顶部向左移一次(n*2

  • ^xor堆栈的前两个项目(与Python相同

  • |或堆栈的前两个项目(与Python相同

  • &和堆栈的前两个项目(与Python相同


用Wise制作整数非常简单,您可以将设为0 ::^并以递增,~-因此您可以设为0并将其递增一堆。但是,如果我们删除-内容,将会变得更加有趣。

我们仍然可以使用剩余的运算来计算每个数字。例如这里是3

~<<~

蒂奥

之所以起作用,是因为~将零(一个无穷大的0位字符串)变成负的一个(一个无穷大的1位字符串),每个都在末尾<附加一个0位,完成后,我们将~其每个都变成一个0s 字符串,然后是一个2 1s。 ,或者像大多数人所说的那样3。


任务

编写一个程序,当给定一个正整数时,将输出一个Wise程序,该程序将创建一个数字n而不-在其源代码中使用数字(输出的源代码,您可以使用-在自己的源中使用)。您可能假设堆栈顶部已经有一个零。

这是 源代码,不是 代码源,因此您应力争将生成的源代码(不一定是输出)最小化。

输出示例

此列表并不详尽,它们只是可能的输出

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

是0包含在内positive integers
colsw '17

4
不,0不包含在正整数中。
扎卡里

显然:,在空堆栈上应用推入0。我认为应该指定该值,因为从空堆栈中复制不应该给出0
Luis Mendo

是其他字符语法错误,还是被忽略?
xnor

@Luismendo您不知道堆栈的内容,如果堆栈为零的话,您也不知道其他内容
Wheat

Answers:


8

Japt,10字节

¤d0'<1"~<~

在线尝试!

基本思路:以数字的二进制表示,并映射0<1~<~。1-10的输出:

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

Metagolfing也很容易。只需~~
脱掉-Draco18s,

7

JavaScript(ES6),34 33字节

f=n=>n?f(n&1?~n:n/2)+'<~'[n&1]:''
<input type=number oninput=o.textContent=f(this.value)><pre id=o>

适用于任何32位整数。


好吧,我明白了。凉!不错的工作。
小麦巫师

7

Haskell,38个字节

我觉得PPCG确实在改善我的Haskell。抚摸白猫。

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

fInt并返回String

在线尝试!

<$f顺便说一句,它保存了一个字符\_->。)

在(类型的函数)的Functor实例中,我们有:。唯一的限制是,最终必须使用相同的源类型。该实例完全是惰性的,因此甚至无法评估。(->) aax <$ f = fmap (const x) f = const x . f = const xfconst xaf

另外,长度相同,但邪恶程度较小((l!!)是一个匿名函数):

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

在线尝试!

两者都使用与@ETHproductions的Japt答案相同的表示形式,尽管尤其是第一个<在开始时可能会给出一些多余的s。

第一个计算的所有组合n "<""~<~"字符串,然后索引到结果列表。

第二个递归计算一个无限列表,该无限列表通过以"",然后通过向列表中已经存在的每个元素附加"<""~<~"字符串来构造新元素,然后构造新元素(实际上,它也略短一些,也""可以将其变成"<"。)。


1
<$f到底如何工作?一些奇怪的函子实例?
xnor

@xnor Mwahahaha我想我应该再添加一个解释。
与Orjan约翰森

3

红宝石118个 116 109 107 105 91字节

感谢cyoce,节省了2个字节!

->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中该整数的字符串。您可以在此处找到一个取消版本的版本,该版本将对所有从1开始的整数进行测试。

基本思想是记录常量的“池”。然后,通过每个“步骤”,将常量添加到每个可能功能的池中。我选择了函数~<>,我相信它们足以代表每个数字。(至少每个数字少于10,000。)


您可以使用dup,而不是cloneIIRC
Cyoce

你甚至需要dup吗?map不会修改其接收者。
Cyoce '17

@Cyoce我认为是的
Conor O'Brien

哦,我明白了。Ruby不喜欢在迭代时进行修改。
Cyoce '17

3

Python2,54个 52 51字节。

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

感谢Wheat Wizard节省了2个字节,而ØrjanJohansen节省了1个字节!这使用了与ETHproduction的Japt答案相同的想法,但是使用了不同的替换字符串(即,使用二进制表示形式)


您不需要[ ]内的发生器joinjoin可以将生成器作为参数。
小麦巫师

我想'>~<~'*int(i)可以为您节省一个字节。
与Orjan约翰森

我相信最新的比分应该排在最后,以利于自动记分牌摘要等。
与Orjan约翰森

在那里,很抱歉迟到了。
扎卡里

2

05AB1E,11个字节

bS'<…~<~‚èJ

在线尝试!

类似于ETHproductions的Japt答案。

@Adnan节省了4个字节!


嘿,真好!实际上,您不需要将数字转换为字符串,因为它们在05AB1E中等于“类型”。与数字文字相同(您可以不使用')。您也可以使用索引,它应该给您11个字节 :)。
阿德南

@Adnan非常感谢!
SparklePony同志

@Adnan一个简单的问题,è在这里如何工作?
“ SparklePony同志” 17年

首先,它交换参数,因为如果正常评估,它将遇到异常。交换后,它映射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

这是ETHproductions的Japt答案的移植版本。说到ETHproductions,他们为我节省了一个字节!


您可以交换字符串并假装索引是基于0的吗?
ETHproductions's

你什么意思?我指的是我必须增加数字的二进制表示形式才能获得可用的索引这一事实。
扎卡里


不工作时,1产生<,这在智者产生0
扎卡里

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.