绘制XNOR数字时序图


12

下面是一个(示意图)数字时序图,对于XNOR逻辑门。

    ┌─┐ ┌─┐ ┌─────┐ ┌─┐ ┌─┐ ┌───┐       
A ──┘ └─┘ └─┘     └─┘ └─┘ └─┘   └──
  ┌───┐ ┌───┐ ┌─┐ ┌─────┐   ┌─┐ ┌─┐ 
B ┘   └─┘   └─┘ └─┘     └───┘ └─┘ └
    ┌─────┐   ┌─┐   ┌─┐   ┌───┐   
X ──┘     └───┘ └───┘ └───┘   └────

您的目标是完全按照图示复制它。

规则:

  • 您可以打印它或返回多行字符串。

  • 允许任意数量的配对和/或前导换行符;

  • 允许尾随空格(但不能开头!);

  • 如果您不能使用扩展的ASCII框绘图字符,则可以用它们代替unicode等效字符(不损失字节数)。

这是因此最短的答案以字节为单位。

二进制表示

为了您的方便,上图的二进制表示如下:

INP A=0101011101010110
INP B=1101101011100101
  ___
X=A⊕B=0111001001001100

样本输出

在此处输入图片说明

边注

在解决这个问题时,我已经为它实现了两种不同的bash解决方案,一个是122个字符/字节长(如上所述),另一个是100个字节长。

我没有发布它们的计划(因为我通常不会发布自己的问题的答案),因此仅供参考。

我也相信至少有一些低于100字节的解决方案是可行的。


2
那是XNOR门,不是吗……
clismique

@ Qwerp-Derp Yep,也许是:)
zeppelin

2
而不是建议(0 == 0)== 0是不是B或X的开始和结束都为1?
Roman Czyborra

@Roman Czyborra不知道我的想法,您能否详细说明一下?
齐柏林飞艇

1
@zeppelin在图案的开头-前几个像素处看。A,B和X都在那儿低。最后也是如此。为什么会这样呢?(我相信这是罗曼的问题)。
isaacg

Answers:


5

05AB1E,101个字节+ 5个UTF-8字节= 116个总字节= 106个字节

(旧版05AB1E版本,不再在TIO上发布)

•=(Ín§Àoà`œ¯_eè8y1ÜŸ,Ú®:¹$:,õKA–x[Âì0ãXÔfz}y×ì¹Ï½uEÜ5äÀTë@ºQÈ™ñó:ò…Eä•6B"102345"" ┌─┐└┘"‡6ävyN" A B X"èì}»

在线尝试!

压缩:

•=(Ín§Àoà`œ¯_eè8y1ÜŸ,Ú®:¹$:,õKA–x[Âì0ãXÔfz}y×ì¹Ï½uEÜ5äÀTë@ºQÈ™ñó:ò…Eä• 
# Pattern, converted to base-6 in base-6=214.

111023102310222223102310231022231112251425142511111425142514251114221022231022231023102222231110231023151114251114251425111114222514251411102222231110231110231110222311111225111114222514222514222511142222
# Actual base-6 pattern.

1110231023102222231023102310222311
1225142514251111142514251425111422
1022231022231023102222231110231023
1511142511142514251111142225142514
1110222223111023111023111022231111
1225111114222514222514222511142222
#Pattern split into chunks of 34.

   ┌─┐ ┌─┐ ┌─────┐ ┌─┐ ┌─┐ ┌───┐  
 ──┘ └─┘ └─┘     └─┘ └─┘ └─┘   └──
 ┌───┐ ┌───┐ ┌─┐ ┌─────┐   ┌─┐ ┌─┐
 ┘   └─┘   └─┘ └─┘     └───┘ └─┘ └
   ┌─────┐   ┌─┐   ┌─┐   ┌───┐    
 ──┘     └───┘ └───┘ └───┘   └────
# Pattern after replacing 0,1,2,3,4,5 with appropriate blocks.

转换:

6B                                   # Convert back to base-6.
  "102345"" ┌─┐└┘"‡                  # Replace numbers with appropriate counterparts.
                   6ä                # Split into 6 equal parts (the rows).
                     vy           }  # For each row (chunk).
                       N" A B X"èì   # Push label at index [i], prepend to line.
                                   » # Print all separated by newlines.

使用CP-1252编码。


出于此挑战的目的,您可以将每个unicode框绘图字符仅计为1个字节(请参阅“规则”),因此根据此答案,您的答案是106个字节长。理由是,这些Unicode字符可以用1个字节的字符替换,例如在CP437或IBM850中,但是显示起来会比较棘手。
Zeppelin

我同意齐柏林飞艇。鉴于规则中给出的让步,因此这将是106个字节。
圣约翰河

仅在使用内置功能的新版本05AB1E中有效的替代方法Åв(我还用此方法更新了ASCII艺术生成器提示):106字节
Kevin Cruijssen

4

泡泡糖,76个字节

00000000: 92d6 3000 5431 1505 1403 50e8 4e0a aafc  ..0.T1....P.N...
00000010: 9f62 15e6 a3ff 61fa dc05 e06d 8b66 cbc7  .b....a....m.f..
00000020: e6b6 cff8 519a b85a 3eb6 b67d 95c0 0feb  ....Q..Z>..}....
00000030: 35b5 521d 7f7e 68af a916 fa20 d999 564d  5.R..~h.... ..VM
00000040: 1f03 d559 59ed 265c f243 42be            ...YY.&\.CB.

在线尝试!

使用VT100备用字符集中的框式绘图字符,TIO无法演示这些字符。在UNIX终端上运行可获得最佳结果。我的终端在复制和粘贴时将ACS转换为UTF-8,因此您可以在此处看到效果。

anders@change-mode:/tmp$ bubblegum xnor.zlib
    ┌─┐ ┌─┐ ┌─────┐ ┌─┐ ┌─┐ ┌───┐
A ──┘ └─┘ └─┘     └─┘ └─┘ └─┘   └──
  ┌───┐ ┌───┐ ┌─┐ ┌─────┐   ┌─┐ ┌─┐
B ┘   └─┘   └─┘ └─┘     └───┘ └─┘ └
    ┌─────┐   ┌─┐   ┌─┐   ┌───┐
X ──┘     └───┘ └───┘ └───┘   └────
▒┼␍␊⎼⎽@␌␤▒┼±␊-└⎺␍␊:/├└⎻$ 

好吧,挑战并不是说我们需要在返回外壳之前使终端退出 ACS模式。祝你好运。


3

Ruby,113个字节

根据挑战授权将打印的符号计数为一个字节(我很惊讶地发现它们实际上是3个字节。)

6.times{|i|s=' A B X'[i]
'D]zunIWkF]nIRukFH'.bytes{|b|s+='   ┌─┐───┘ └'[(b*2>>i/2*2&6)-i%2*6,2]}
s[1]=' '
puts s}

6行输出适用于魔术字符串的每个字符6位编码。但是魔术字符串实际上是为每个过渡编码的,因此:

least significant bit 0 New value for A  
                      1 Current value for A
                      2 New value for B
                      3 Current value for B
                      4 New value for X
                      5 Current value for X
most significant bit  6 Always 1 (to remain in printable range)

对其进行解码以找到每个过渡都必须打印的2个字符(第一个是空格或水平线。)上排和下排的8个字符字符串重叠:上排的后两个字符11是两条水平线,与下面一行的前两个字符所需的水平线匹配00。下一行的8个字符回绕:它们是符号字符串的后6个字符和前2个字符。

非高尔夫代码

6.times{|i|s=' A B X'[i]               #iterate through 6 lines of output. Set s to the 1st character.
  'D]zunIWkF]nIRukFH'.bytes{|b|        #for each byte in the magic string
     s+='   ┌─┐───┘ └'[(b*2>>i/2*2&6)- #add 2 bytes to s, index 0,2,4, or 6 of the symbol string depending on relevant 2 bits of the magic string.
     i%2*6,2]                          #if the second (odd) row of a particular graph, modify index to -6,-4,-2, or 0 
  }                                    #(ruby indices wrap around. mystring[-1] is the last character of the string.)
  s[1]=' '                             #replace intitial ─ of the curve with space to be consistent with question
  puts s                               #output line
}

这实际上是129个字节(113个字符)。
Magic Octopus Urn

1
@carusocomputing我看到您对这里的大多数答案都发表了相同的评论。请参考分析工具的第一行和OP的规则4:If you can not use the extended ASCII box-drawing characters, you may substitute them for the unicode equivalents (at no byte penalty)我们都根据规则对答案进行了评分。
Level River St

2

PowerShell,255个字符,265个字节(UTF-8)

$a='    012 012 0111112 012 012 01112
A 113 413 413     413 413 413   411
  01112 01112 012 0111112   012 012
B 3   413   413 413     41113 413 4
    0111112   012   012   01112
X 113     41113 41113 41113   41111'
0..4|%{$a=$a-replace$_,('┌─┐┘└'[$_])};$a

这适用于我的计算机,但似乎无法正确解析TIO上的字节...

屏幕截图

设置$a为由数字和空格填充的多行字符串,然后循环0..4|%{...}。每次迭代时,我们-replace将使用$_具有适当字符的适当数字并将其'┌─┐┘└'[$_]存储回$a。然后,我们只剩$a下流水线,输出是隐式的。


根据挑战,您可以将unicode字符计为单个字节
FlipTack

2

的JavaScript(ES6),163个 158 154字节

注意:根据挑战授权,将UTF-8字符计数为字节。

_=>[..." A B X"].map((c,i)=>c+" "+[...Array(33)].map((_,j)=>j%2?" ─"[p^i&1]:" ┐┌─└┘ "[p+(p=[27370,42843,12878][i>>1]>>j/2&1)*2+i%2*3]).join``,p=0).join`
`

演示版

感谢Neil,节省了4个字节


j%2?" ─"[p^i&1]:" ┐┌─└┘ "[p+(p=[27370,42843,12878][i>>1]>>j/2&1)*2+i%2*3]节省3个字节。
尼尔

哦,也将17更改为33。
尼尔

再次是152个字符,164个字节。
Magic Octopus Urn

2

C,213205字节

对于更改,与其他语言相比,面对这一挑战的C程序大小并不完全荒谬。

#define X(a) u[i]=C[a],l[i++]=C[(a)+4]
p(n,c){char u[34],l[34],*C=" ┐┌──└┘ ",i=0;while(i<34)X(n&3),n>>=1,X((n&1)*3);printf("  %.33s\n%c %.33s\n",u,c,l);}main(){p(0xD5D4,'A');p(0x14EB6,'B');p(0x649C,'X');}

取消高尔夫,定义展开并评论:

p(n,c){
    // u is the upper line of the graph, l the lower line
    char u[34],l[34],*C=" ┐┌──└┘ ",i=0;
    while(i<34)
        u[i]=C[n&3],            // using the two LSBs to set the transition char depending on the current and next state
        l[i++]=C[(n&3)+4],      // do for both upper and lower lines
        n>>=1,                  // shift bits right to go to next state
        u[i]=C[(n&1)*3],        // using only the LSB to set the "steady" char depending on current state only
        l[i++]=C[((n&1)*3)+4];  // do for both upper and lower lines
    printf("  %.33s\n%c %.33s\n",u,c,l);
}
main() {
    // Call p for each graph
    // Constants are chosen so the display is consistent with the request.
    // Each bit represents a state, but the order is reversed
    // (leftmost is put on lowest significant bit, after a 0)
    p(0xD5D4,'A');p(0x14EB6,'B');p(0x649C,'X');
}

注意:C字符串不得包含Unicode字符。所有可显示字符必须是普通的旧8位字符(但可以在扩展范围内选择)。因此,基本上,输出的有效性取决于您的代码页。


1

tcl,221个字符,299字节

lmap {b _ n u A V} {"   " ┌─────┐ ┌───┐ └───┘ ┌─┐ └─┘} {puts "[set S \ $b][set m $A\ $A] $_ $m $n
A ──┘ [set w $V\ $V][set s \ $S]$w $V$b└──
  $n $n $A $_$b$m
B ┘$b$V$b$w$s$u $V └
$S$_$b$A$b$A$b$n
X ──┘$s$u $u $u$b└────"}

可以在以下网址上运行:http//rextester.com/live/VVQU99270


228个字符,但是为306个字节。
Magic Octopus Urn

@carusocomputing:您使用哪种在线工具来计数字节而不是字符?提前TKS。
sergiol

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.