盯着位


9

用椭圆和棍棒打印二进制值不是一件容易的事...为了帮助实现这一点,您必须编写一个以自定义二进制表示形式打印数字的函数(或程序)。
因此,我想取一个数字,例如3(00000011),并以用户定义的格式输出位,例如以空格分隔的对:

00 00 00 11

或者说,以相反的顺序并带有一些装饰器,例如:

11_00_00_00

此外,必须有可能将“ 0”和“ 1”显示为自定义字符,以更好地区分它们,例如:

XX oo oo oo

因此,面临的挑战是编写在以下规范中做到这一点的代码。

规格

该函数接受如下输入: f(A,mask,zeros,one)

参数:

A-输入数字-0-255范围内的任何(无符号)整数。
mask-一个字符串参数,用于定义输出的结构。
-长度相同的字符串,为每个输出插槽定义``零''字形。
那些 -的长度相同的字符串,对于每个输出时隙定义“一”字形。

输出构造规则:

仔细查看该图像,并结合示例了解如何生成输出:

在此处输入图片说明

因此,仅解析掩码中的单个数字,并用A的相应位代替,其他字符则保持原样。此外,如果采用位的值为1,则在最终输出中显示为“ X”,如果为0,则显示为“ o”。在上面的示例中,所有四个位均为“ 1”,因此我们在所有时隙中看到“ X”。

如果输入数字为128,则在逻辑上输出为X foo bar ooo。参数“零”和“一”中的字符:任何可打印的ASCII字符,假定它们始终与掩码字符对齐。

注意事项

  • 位从0开始索引:第0位是MSB。
  • 假定掩码字符串中不允许使用数字8,9。
  • 输入字符串包括任何可打印的ASCII字符。
  • “零”和“一个”与遮罩对齐。
  • 对于您语言中的特殊字符/修饰符:我们可以假定它们不会出现在输入字符串中。

为了清楚起见,请参见更多示例。

输入->输出示例

用空格定界符以通用顺序输出所有8位,并以普通的椭圆和棍子符号表示:

mask  =  "0123 4567"  
zeros =  "0000 0000"  
ones  =  "1111 1111"  

A=1 ->    0000 0001


以颠倒的顺序输出,以破折号和字形表示法:

mask =    "| 7654 3210 |"
zeros=    "  ---- ----  "
ones =    "  ssss ssss  "

A=1  ->    | s--- ---- |
A=3   ->   | ss-- ---- |
A=128->    | ---- ---s |


一个输出中的各种符号,例如打包数据:

mask =       "0 | 123 4567"
zeros=       "    --- ----"
ones =       "X   kkk ssss"

A= 15  ->       | --- ssss
A= 16  ->       | --k ----
A= 32  ->       | -k- ----
A= 128 ->     X | --- ----
A= 255 ->     X | kkk ssss


重复模式:

mask =    "| 7 66 555 4444 |"
zeros=    "  . .. ... ....  "
ones =    "  0 00 000 0000  "

A= 0 ->    | . .. ... .... |
A= 1 ->    | 0 .. ... .... |
A= 2 ->    | . 00 ... .... |
A= 3 ->    | 0 00 ... .... |
A= 4 ->    | . .. 000 .... |

更新资料

规则已稍作简化-程序只能打印一个数字(而不是最初建议的数字数组/数字列表)。


我们还可以提交接受四个输入的程序吗?某些语言的功能不太好。
斯蒂芬

@StephenS我想是的,但是我不确定我会理解那些:/
Mikhail V

2
在大多数语言中,最后两个参数似乎完全不相关,为什么不只要求1和0?第一个参数是列表,除了使常规语言添加简单的循环/递归,同时使更深奥的语言竞争变得困难之外,似乎没有多大作用。
FryAmTheEggman's

@MikhailV如果您想了解所有对你的挑战的意见书,好运气的:/大多有TryItOnline链接,以便你可以看到他们的作品,但他们大多数高尔夫球语言看起来像废话,直到你知道他们在做什么
斯蒂芬·

@FryAmTheEggman我也不知道该怎么A做,因为在所有测试用例中都是一样的
Stephen

Answers:


2

JavaScript(ES6),57个字节

(A,M,O,I)=>M.replace(/[\d]/g,(d,i)=>(A>>7-d)%2?I[i]:O[i])


2

红宝石,48个字节

->a,f,*b{f.gsub(/\d/){b[a[55-$&.ord]][$`.size]}}

零和一参数被视为数组(*b),零参数被存储在中b[0],一参数被存储在中b[1]

mask参数的f每个数字(/\d/)都替换为适当数组中的字符。特殊变量$`这里(ab)使用,该保存导致当前匹配的文本,以跟踪位置。

Ruby的位索引将0称为最低有效位,而质询则将0称为最高有效位。55的ASCII减法(“ 7”字符)产生可用的Ruby位索引。

在线尝试!



1

Python,97个字节

lambda A,M,Z,O:"".join([[Z,O][1&(A>>7-int(d))][i] if d.isdigit() else d for i,d in enumerate(M)])

1

Mathematica,131个字节

""<>Table[(f/@{##2})[[x[[i]],i]],{i,Length[x=(f=Characters)@#2/.Table[ToString@i->2+Floor[#/2^(7-i)]~Mod~2,{i,0,7}]/._String->1]}]&

Length[x]可以Length@x并且{#2,#3,#4}可以{##2}
CalculatorFeline

此外,StringJoin@@可以仅仅是StringJoin@#1仅仅是#
CalculatorFeline

我已经略微简化了规则,请参见更新。
米哈伊尔五世

1

q / kdb +,86 64字节

解:

f:{[A;M;Z;O]@[M;m;:;((-8#0b vs A)"I"$'M m)(Z;O)'m:(&)M in .Q.n]}

例子:

q)f[1;"0123 4567";"0000 0000";"1111 1111"]
"0000 0001"
q)f[1;"| 7654 3210 |";"  ---- ----  ";"  ssss ssss  "]
"| s--- ---- |"
q)f[15;"0 | 123 4567";"    --- ----";"X   kkk ssss"]
"  | --- ssss"
q)f [0;"| 7 66 555 4444 |";"  . .. ... ....  ";"  0 00 000 0000  "]
"| . .. ... .... |"

说明:

在输入掩码M为数字的地方拉出索引,称其m为我们将修改输入掩码的地方。从字符串中取出数字,转换为整数,然后索引到我们的8位数组中以获取正确的顺序。使用此8位数组索引到O(如果设置为1)或Z(如果设置为0),然后在给出的索引处索引到这些列表m。最后,:将此新列表应用于(index)原始掩码m

{[A;M;Z;O]                                                   } / lambda function with 4 parameters
          @[ ; ; ;                                          ]  / apply, applies 3rd parameter to 1st parameter at indexes from parameter 2 with parameter 4 :)
                   (-8#0b vs A)                                / convert input number to binary (64 bit), take the last 8 items
                                              m:(&)M in .Q.n   / returns indices where mask is in "0123..789", stores in variable m
                               "I"$'M m                        / index into mask at indices m, then cast these numbers to an integer array
                  (                    )                       / we then index into our 8 bits a these offsets to get the output order
                                        (Z;O)                  / 2-item list of the zeroes and ones mask
                                             '                 / take each item on the left and right and apply them to (Z;O) (ie index in at 0 / 1 and then 123..67)
            M m :                                              / apply *this* list to M at each index given by m

笔记:

如果允许我们以以下形式提供参数,可以再减少14个字节:

[A;M;(Z;O)]

为q允许多达3个参数被传递给函数而不被明确命名(他们是xyz分别地):

f:{@[y;m;:;((-8#0b vs x)"I"$'y m)z'm:(&)y in .Q.n]}
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.