挑战
在这个挑战中,你必须以一个非负整数作为输入,将其转换为以 128 为基数的字节(0 → 0x00
、127 → 0x7F
、5,732 →0x2C 0x64
等),并输出结果是否仅使用可打印 ASCII(0x20
包括0x7E
在内)。
测试用例
0 --> false (␀)
9 --> false (␉)
10 --> false (␊)
13 --> false (␍)
27 --> false (␛)
32 --> true (␠)
59 --> true (;)
87 --> true (W)
126 --> true (~)
127 --> false (␡)
128 --> false (␁␀)
300 --> false (␂,)
2201 --> false (␑␙)
5732 --> true (,d)
134711010 --> false (@␞␍b)
157061374 --> true (Jr!~)
157061375 --> false (Jr!␡)
规格
- 您将收到的最大输入是 4,294,967,295。
- 您可以使用一个函数或一个完整的程序。
- 、和适用。
评分
这是,因此字节数最少的获胜。
\endgroup
16
18 个解决方案
18
JavaScript (ES6),30 字节
非常相似。
表示可打印,返回0;表示不可打印,返回true。
f=n=>-~n%128<33||(n>>=7)&&f(n)
JavaScript (ES6),27 字节
-2 感谢
对于可打印,返回0;对于不可打印,返回真值。
f=n=>-~n%128<33||f(n>>=7)*n
\endgroup
1
-
2\begingroup
f=n=>-~n8<33||f(n>>=7)*n
(27)
\endgroup
–
|
,7字节
bØ⁷ỌḟØṖ
bØ⁷ỌḟØṖ main link
b convert to base
Ø⁷ 128
Ọ convert to characters
ḟ filter to remove
ØṖ printable ASCII
如果过滤器后还有剩余(即返回值是非空列表),则情况就是这样false
。如果过滤器删除了所有内容(即返回值是空列表),则情况就是这样true
。页脚使用Ṇ
(逻辑非)来映射[] -> true
和[...] -> false
。
\endgroup
2
-
\begingroup
由于挑战已更新为允许使用决策问题的默认值,因此您可以输出真值/假值反转fƑ
->ḟ
\endgroup
– -
\begingroup
@JonathanAllan 哦,太好了,谢谢
\endgroup
–
♦
|
,44 43 40 字节
编辑:-3 字节,感谢 pajonk
f=\(x)(x+1)%%128>31&(!(y=x%/%128)||f(y))
\endgroup
2
-
2\begingroup
通过使用惰性||
\endgroup
– -
\begingroup
@pajonk – 很好,谢谢!我会(尽量)记住这一点……
\endgroup
–
|
3,36 字节
f=lambda n:-~n%128<33or f(n>>7)*n>>7
输出真值与假值互换
-2 字节,感谢 Themoonisacheese
-2 字节,感谢 squareroot12621
-2 字节,感谢 Albert.Lang
-1 字节,感谢 Jonathan Allan
\endgroup
5
-
\begingroup
f(n>>7) 短了 2 个字节:)
\endgroup
– -
1\begingroup
f=lambda n:32<-~n8and(n<128)|f(n>>7)
\endgroup
– -
\begingroup
交换真与假。
\endgroup
– -
\begingroup
使用 truthy 与 falsey (仍然交换),您可以切换顺序并(有效地)使用乘法<0>
–
\endgroup
–
-
\begingroup
@JonathanAllan 聪明!
\endgroup
–
|
,14 个半字节(7 个字节)
程序字节:
d9 87 12 08 3a dd 3b
人类可读的表示:
,|`@128$\ch$P
对于仅可打印的 ASCII 输入,输出零 (falsy);对于包含不可打印的 128 进制数字的输入,输出正整数 (truthy)。
解释:
,|`@128$\ch$P
, # length of
| # keep
\ P # only unprintable ASCII
ch$ # from character representations of
$ # input
`@128 # as base-128 digits
注意:
通常,Nibbles 程序是使用代表单字节或双字节元素的人类可读(类似)标记编写的。然后,Nibbles 解释器应将它们编码到最终可运行的程序代码中。
但是,在这种情况下,由于未知(对我来说)的原因,Nibbles 解释器会输出警告并拒绝编码此程序,即使它可以正确运行。尽管如此,也可以手动将 7 个程序字节d9 87 12 08 3a dd 3b
直接写入文件并运行它,如下所示。
这不是编写或运行 Nibbles 程序的正常方式,但它有效。
\endgroup
|
,75 68 字节
func f(n int)bool{for k:=n;k>0;k>>=7{if -^k%128<33{n=0}}
return n>0}
根据。
不交换真假。
- -7 字节由@ovs 提供,返回第一个
return
带有 的n=0
,强制将最后一个return
改为false
。
\endgroup
1
-
\begingroup
我认为你可以return
用n=0
\endgroup
–
|
APL+WIN,36字节
提示输入整数。索引原点=0。1=真,0=假
(+/v∊32+⍳95)=⍴v←((⌈128⍟2⌈n)⍴128)⊤n←⎕
\endgroup
|
,10 9字节
7W_YA6Y2m
输出一个由 1 组成的向量(即)或一个至少包含一个零的向量(即,具体取决于结果是否仅使用可打印 ASCII。
或者(代码包括真假测试)。
解释
% Implicit input
7W % 7, base-2 exponentiation: gives 128
_YA % Convert to base 128
6Y2 % Push ASCII range (predefined literal): ' ':'~'
m % Ismember (element-wise)
% Implicit display
\endgroup
|
,30 字节
f=n=>-~n%128<33?n<!!n:f(n/128)
与 Arnauld 的长度相同,但输出效果更佳
,26 字节
f=n=>-~n%128<33?!n:f(n>>7)
更糟糕的输入
\endgroup
|
,54 44字节
-10 字节,作者:Dominic van Essen 和 GammaFunction
(($1%128%127>31))&&((($1<128))||$0 $[$1>>7])
用作 bash 脚本。以数字作为第一个参数,返回 1 表示错误,0 表示正确(bash 惯例)。ATO
链接假定函数已命名,f
因为 $0 在 ATO 中不起作用,但硬编码脚本名称的惩罚将是一个字节,因此分数将相同。
的移植,但我独立想出了它。
\endgroup
3
-
1\begingroup
…?
\endgroup
– -
1\begingroup
@DominicvanEssen 抓得好!由于函数名称惩罚,因此应该是 46。您可以使用$[ ]
而不是 来节省更多字节$(( ))
。
\endgroup
–
-
\begingroup
你们俩都打得很好!
\endgroup
–
|
,6字节
₇τCkQF
如果为真则输出一个空列表,如果为假则输出一个非空列表。
\endgroup
|
,11字节
⌊⍘N⭆¹²⁸№γ℅ι
链接是代码的详细版本。实际上输出1
或0
一次。说明:
N Input as a number
⍘ Convert to custom string base
¹²⁸ Literal integer `128`
⭆ Map over implicit range and join
№ Count of
ι Current value
℅ Convert to Unicode
γ In printable ASCII
⌊ Take the minimum
Implicitly print
如果输出为真,则为 10 个字节,0
正如 @xnor 建议的那样:
⬤↨N¹²⁸№γ℅ι
链接为代码的详细版本。输出 Charcoal 布尔值,即,1
如果所有字符都是可打印 ASCII,则不输出任何内容。说明:
N Input as a number
↨ Converted to base
¹²⁸ Literal integer `128`
⬤ All values satisfy
№ Count of
ι Current value
℅ Convert to Unicode
γ In printable ASCII
Implicitly print
\endgroup
|
,9个
žQÇIžyвåP
或。
解释:
žQ # Push printable ASCII constant: " !"...|}~"
Ç # Convert it to a list of codepoint integers: [32,126]
I # Push the input-integer
žyв # Convert the (base-10) input to a base-128 list
å # Check for each value if it's in the [32,126]-list
P # Check if all are truthy
# (which is output implicitly as result)
\endgroup
|
x86-64 机器代码函数,18 字节
ECX 中的整数参数,bool
AL 中的返回值(实际上零扩展到 RAX)。如果我对参数使用 EDI,这将与 x86-64 System V 调用约定兼容。按原样,它是 Windows x64。
NASM 列表经过修剪以显示机器代码和源代码的十六进制转储。
; takes a string of ASCII digits packed into a 32-bit integer
packedascii_is_printable:
.loop:
8D4101 lea eax, [rcx+1] ; wrap 0x7f to 0x80 = -128 if we use a signed compare. Or to 0 since this is before AND
; 32-bit alternative mov eax, ecx (2 bytes) ; inc eax (1 byte) before or after AND
247F and al, 0x7F ; isolate low 7 bits - one ASCII character
3C21 cmp al, 0x21 ; increment by one mapped the printable range to 0x21 - 0x7f from the usual 0x20 - 0x7e
0F9DC0 setge al ; set return value according to most recent character checked
7C05 jl .found_false ; early out on first false, else keep checking
C1E907 shr ecx, 7
75EF jnz .loop ; leave the loop after processing all the set bits, since our input numbers aren't actually fixed-width in bits.
.found_false:
C3 ret
; return value in AL (zero extended to EAX, actually, since we don't exit the loop until high bits of ECX are clear)
我们加 1,并将低 7 位字符复制到 AL,并用 AND 隔离它。然后检查它是否为 0x21 到 0x7f,即原始值是否为 0x20 到 0x7e。由于每个 7 位值都 <= 0x7f,我们只需检查范围的低端,因此加 1。
这不像我希望的那样紧凑,感觉应该有一种方法可以避免分支和 3 字节setcc
。如果我可以使用无符号比较,也许我可以使用 32 位模式salc
。(未记录的操作码,根据 CF 设置 AL)。我认为我可以,因为我们cmp
在清除高位之后。
\endgroup
|
,24字节
f:{&/(a<127),31<a:128\x}
\endgroup
|
Desmos,105字节(105+10字节?)
B(x)=\left\{x<128:[x],join(B(floor(x/128)),mod(x,128))\right\}
f(x)=total(\left\{31<B(x)<127:0,1\right\})
解释
B(x)
返回 的 128 进制数字列表x
。例如,返回 4,294,967,295 (如果转换为 10 进制而不是 128 进制,[15,127,127,127,127]
则会返回)[4,2,9,4,9,6,7,2,9,5]
B(x)
f(x)
检查每个字符的可打印性并将其相加以返回不可打印字符的数量,对于可打印文本返回 0,对于不可打印文本返回正数。
如果需要符合真实性和虚假性f(x)
(1 表示可打印,0 表示不可打印),请使用f(x)=1-sign(what it was before)^2
105 +10 字节。
如果您要将其粘贴进去自己尝试,则必须通过单击它并按下键盘或内置 Desmos 键盘上的左箭头或右箭头键来
“激活”每个方程式(B(x)
和)。或者您可以逐行粘贴,因为我想这样可行f(x)
\endgroup
|
,16字节
1~&/~32 127'128\
128\ /decode in base 128
32 127' /-1 if <32, 0 if 32<=x<127, 1 if 127<x
&/~ /all 0?
1~ /is 1? (since the unit element for & is 9223372036854775807
\endgroup
|
,41 字节
{$_&&!grep !(127>*>31),.polymod(128 xx*)}
\endgroup
|
0 --> false
在这里似乎有一个特殊,因为它应该转换为空字符串,而空字符串中没有不可打印的字符。\endgroup
–
@xnor 因为挑战要求将输入转换为 base-128 […] 并输出结果是否仅使用可打印 ASCII(0x20 到 0x7E 包括在内),
0 --> false
所以对我来说完全没问题。我根本不认为这是一个极端情况。挑战没有提到转换为字符串\endgroup
–
@xnor 可能
0
是一个只包含空字节 ( ) 的字符串0x00
,而不是空字符串。而且空字节不可打印,因此为 false 是合理的。\endgroup
–
@xnor,Jitse:这并不像将 0 转换为不同的基数会使其消失或出现其他情况……
\endgroup
–
@squareroot12621 并不是说改变基数会使它消失,而是十进制表示也是空字符串/列表,只是按照惯例,我们同意在它前面加一个零(前导),因为不写任何内容很难传达数字。
\endgroup
–
|