我正在尝试编写一个尽可能遵守俄罗斯方 block 指南的迷你版俄罗斯方 block :
准确地说,我希望完整的游戏由尽可能少的 140 字节 javascript 构建。第一个 140 字节的脚本应返回一个包含 112 个整数值的数组,这些整数值表示 4 个旋转位置中每个位置的 7 个四联骨牌的 4 行。旋转的确切位置顺序非常重要。
我把数据放在 16 位 unicode 字符中(尽管它们算作 2 个字节)并在 140 多个字节中解包。
有谁知道构造这个数组的巧妙方法吗?
var s="ༀ∢ð䑄࣠لâьˠцèౄ٠٠٠٠ۀѢlࣄӠѤäӄౠɤÆӈ",m=[];for(i=0;i<28;i++){c=s.charCodeAt(i);for(j=4;j>0;){m.push(c>>(4*--j)&15)}return m}
I tetrimino
Spawn Rotate90 Rotate180 Rotate270
┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐
│ │ │ │ │ │ │ │■│ │ │ │ │ │ │ │ │■│ │ │
├─┼─┼─┼─┤ ├─┼─┼─┼─┤ ├─┼─┼─┼─┤ ├─┼─┼─┼─┤
│■│■│■│■│ │ │ │■│ │ │ │ │ │ │ │ │■│ │ │
├─┼─○─┼─┤ ├─┼─○─┼─┤ ├─┼─○─┼─┤ ├─┼─○─┼─┤
│ │ │ │ │ │ │ │■│ │ │■│■│■│■│ │ │■│ │ │
├─┼─┼─┼─┤ ├─┼─┼─┼─┤ ├─┼─┼─┼─┤ ├─┼─┼─┼─┤
│ │ │ │ │ │ │ │■│ │ │ │ │ │ │ │ │■│ │ │
└─┴─┴─┴─┘ └─┴─┴─┴─┘ └─┴─┴─┴─┘ └─┴─┴─┴─┘
Hex: 0F00 Hex: 2222 Hex: 00F0 Hex: 4444
J tetrimino
Spawn Rotate90 Rotate180 Rotate270
┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
├─┼─┼─┼─┤ ├─┼─┼─┼─┤ ├─┼─┼─┼─┤ ├─┼─┼─┼─┤
│■│ │ │ │ │ │■│■│ │ │ │ │ │ │ │ │■│ │ │
├─┼─┼─┼─┤ ├─┼─┼─┼─┤ ├─┼─┼─┼─┤ ├─┼─┼─┼─┤
│■│●│■│ │ │ │●│ │ │ │■│●│■│ │ │ │●│ │ │
├─┼─┼─┼─┤ ├─┼─┼─┼─┤ ├─┼─┼─┼─┤ ├─┼─┼─┼─┤
│ │ │ │ │ │ │■│ │ │ │ │ │■│ │ │■│■│ │ │
└─┴─┴─┴─┘ └─┴─┴─┴─┘ └─┴─┴─┴─┘ └─┴─┴─┴─┘
Hex: 08E0 Hex: 0644 Hex: 00E2 Hex: 044C
L tetrimino
Spawn Rotate90 Rotate180 Rotate270
┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
├─┼─┼─┼─┤ ├─┼─┼─┼─┤ ├─┼─┼─┼─┤ ├─┼─┼─┼─┤
│ │ │■│ │ │ │■│ │ │ │ │ │ │ │ │■│■│ │ │
├─┼─┼─┼─┤ ├─┼─┼─┼─┤ ├─┼─┼─┼─┤ ├─┼─┼─┼─┤
│■│●│■│ │ │ │●│ │ │ │■│●│■│ │ │ │●│ │ │
├─┼─┼─┼─┤ ├─┼─┼─┼─┤ ├─┼─┼─┼─┤ ├─┼─┼─┼─┤
│ │ │ │ │ │ │■│■│ │ │■│ │ │ │ │ │■│ │ │
└─┴─┴─┴─┘ └─┴─┴─┴─┘ └─┴─┴─┴─┘ └─┴─┴─┴─┘
Hex: 02E0 Hex: 0446 Hex: 00E8 Hex: 0C44
O tetrimino
Spawn Rotate90 Rotate180 Rotate270
┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
├─┼─┼─┼─┤ ├─┼─┼─┼─┤ ├─┼─┼─┼─┤ ├─┼─┼─┼─┤
│ │■│■│ │ │ │■│■│ │ │ │■│■│ │ │ │■│■│ │
├─┼─○─┼─┤ ├─┼─○─┼─┤ ├─┼─○─┼─┤ ├─┼─○─┼─┤
│ │■│■│ │ │ │■│■│ │ │ │■│■│ │ │ │■│■│ │
├─┼─┼─┼─┤ ├─┼─┼─┼─┤ ├─┼─┼─┼─┤ ├─┼─┼─┼─┤
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
└─┴─┴─┴─┘ └─┴─┴─┴─┘ └─┴─┴─┴─┘ └─┴─┴─┴─┘
Hex: 0660 Hex: 0660 Hex: 0660 Hex: 0660
S tetrimino
Spawn Rotate90 Rotate180 Rotate270
┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
├─┼─┼─┼─┤ ├─┼─┼─┼─┤ ├─┼─┼─┼─┤ ├─┼─┼─┼─┤
│ │■│■│ │ │ │■│ │ │ │ │ │ │ │ │■│ │ │ │
├─┼─┼─┼─┤ ├─┼─┼─┼─┤ ├─┼─┼─┼─┤ ├─┼─┼─┼─┤
│■│●│ │ │ │ │●│■│ │ │ │●│■│ │ │■│●│ │ │
├─┼─┼─┼─┤ ├─┼─┼─┼─┤ ├─┼─┼─┼─┤ ├─┼─┼─┼─┤
│ │ │ │ │ │ │ │■│ │ │■│■│ │ │ │ │■│ │ │
└─┴─┴─┴─┘ └─┴─┴─┴─┘ └─┴─┴─┴─┘ └─┴─┴─┴─┘
Hex: 06C0 Hex: 0462 Hex: 006C Hex: 08C4
T tetrimino
Spawn Rotate90 Rotate180 Rotate270
┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
├─┼─┼─┼─┤ ├─┼─┼─┼─┤ ├─┼─┼─┼─┤ ├─┼─┼─┼─┤
│ │■│ │ │ │ │■│ │ │ │ │ │ │ │ │ │■│ │ │
├─┼─┼─┼─┤ ├─┼─┼─┼─┤ ├─┼─┼─┼─┤ ├─┼─┼─┼─┤
│■│●│■│ │ │ │●│■│ │ │■│●│■│ │ │■│●│ │ │
├─┼─┼─┼─┤ ├─┼─┼─┼─┤ ├─┼─┼─┼─┤ ├─┼─┼─┼─┤
│ │ │ │ │ │ │■│ │ │ │ │■│ │ │ │ │■│ │ │
└─┴─┴─┴─┘ └─┴─┴─┴─┘ └─┴─┴─┴─┘ └─┴─┴─┴─┘
Hex: 04E0 Hex: 0464 Hex: 00E4 Hex: 04C4
Z tetrimino
Spawn Rotate90 Rotate180 Rotate270
┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
├─┼─┼─┼─┤ ├─┼─┼─┼─┤ ├─┼─┼─┼─┤ ├─┼─┼─┼─┤
│■│■│ │ │ │ │ │■│ │ │ │ │ │ │ │ │■│ │ │
├─┼─┼─┼─┤ ├─┼─┼─┼─┤ ├─┼─┼─┼─┤ ├─┼─┼─┼─┤
│ │●│■│ │ │ │●│■│ │ │■│●│ │ │ │■│●│ │ │
├─┼─┼─┼─┤ ├─┼─┼─┼─┤ ├─┼─┼─┼─┤ ├─┼─┼─┼─┤
│ │ │ │ │ │ │■│ │ │ │ │■│■│ │ │■│ │ │ │
└─┴─┴─┴─┘ └─┴─┴─┴─┘ └─┴─┴─┴─┘ └─┴─┴─┴─┘
Hex: 0C60 Hex: 0264 Hex: 00C6 Hex: 04C8
最佳答案
您可能要记住,对该数组更巧妙的编码方案将导致更长的解码逻辑,因此尝试对其进行过多优化可能会因小失大。然而,我自己曾用 JavaScript 编写过一个俄罗斯方 block 游戏(虽然没有进行大小优化),我知道编写一个函数来将每个形状旋转 n 次并不难。假设您没有严重的速度限制,为什么不仅在默认方向上为每个形状设置一个 LUT 条目,并以编程方式旋转它们?您可能会发现这会导致使用的总体空间减少(特别是,如果旋转/转置代码大小小于数组大小的 3/4)。
编辑:这样做的另一个好处是您不必跟踪网格上形状的旋转状态,您只需要跟踪其当前数组。当有人旋转时,用你的函数旋转数组。这消除了进行检查的需要(例如,如果旋转 > 3,旋转 = 0)。
关于javascript - 微型 Javascript 俄罗斯方 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18000959/
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
我在理解Enumerator.new方法的工作原理时遇到了一些困难。假设文档中的示例:fib=Enumerator.newdo|y|a=b=1loopdoy[1,1,2,3,5,8,13,21,34,55]循环中断条件在哪里,它如何知道循环应该迭代多少次(因为它没有任何明确的中断条件并且看起来像无限循环)? 最佳答案 Enumerator使用Fibers在内部。您的示例等效于:require'fiber'fiber=Fiber.newdoa=b=1loopdoFiber.yieldaa,b=b,a+bendend10.times.m
我没有理解以下行为(另请参阅inthisSOthread):defdef_testputs'def_test.in'yieldifblock_given?puts'def_test.out'enddef_testdoputs'def_testok'endblock_test=procdo|&block|puts'block_test.in'block.callifblockputs'block_test.out'endblock_test.calldoputs'block_test'endproc_test=procdoputs'proc_test.in'yieldifblock_gi
我需要尝试一些AES片段。我有一些密文c和一个keyk。密文已使用AES-CBC加密,并在前面加上IV。不存在填充,纯文本的长度是16的倍数。所以我这样做:aes=OpenSSL::Cipher::Cipher.new("AES-128-CCB")aes.decryptaes.key=kaes.iv=c[0..15]aes.update(c[16..63])+aes.final它工作得很好。现在我需要手动执行CBC模式,所以我需要单个block的“普通”AES解密。我正在尝试这个:aes=OpenSSL::Cipher::Cipher.new("AES-128-ECB")aes.dec
我在使用自定义RailsFormBuilder时遇到了问题,从昨天晚上开始我就发疯了。基本上我想对我的构建器方法之一有一个可选block,以便我可以在我的主要content_tag中显示其他内容。:defform_field(method,&block)content_tag(:div,class:'field')doconcatlabel(method,"Label#{method}")concattext_field(method)capture(&block)ifblock_given?endend当我在我的一个Slim模板中调用该方法时,如下所示:=f.form_field:e
我从用户Hirolau那里找到了这段代码:defsum_to_n?(a,n)a.combination(2).find{|x,y|x+y==n}enda=[1,2,3,4,5]sum_to_n?(a,9)#=>[4,5]sum_to_n?(a,11)#=>nil我如何知道何时可以将两个参数发送到预定义方法(如find)?我不清楚,因为有时它不起作用。这是重新定义的东西吗? 最佳答案 如果您查看Enumerable#find的文档,您会发现它只接受一个block参数。您可以将它发送两次的原因是因为Ruby可以方便地让您根据它的“并行赋
我明白了defa(&block)block.call(self)end和defa()yieldselfend导致相同的结果,如果我假设有这样一个blocka{}。我的问题是-因为我偶然发现了一些这样的代码,它是否有任何区别或者是否有任何优势(如果我不使用变量/引用block):defa(&block)yieldselfend这是一个我不理解&block用法的具体案例:defrule(code,name,&block)@rules=[]if@rules.nil?@rules 最佳答案 我能想到的唯一优点就是自省(introspecti
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
考虑一下:现在这些情况:#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2我需要用其他字符串输出URL。我如何保证&符号不会被转义?由于我无法控制的原因,我无法发送&。求助!把我的头发拉到这里:\编辑:为了澄清,我实际上有一个像这样的数组:@images=[{:id=>"fooid",:url=>"http://
有没有办法在sinatra的beforedoblock中停止执行并返回不同的值?beforedo#codeishere#Iwouldliketo'return"Message"'#Iwouldlike"/home"tonotgetcalled.end//restofthecodeget'/home'doend 最佳答案 beforedohalt401,{'Content-Type'=>'text/plain'},'Message!'end如果你愿意,你可以只指定状态,这里有状态、标题和正文的例子