\begingroup

挑战

在这个挑战中,你必须以一个非负整数作为输入,将其转换为以 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

  • 10
    \begingroup
    0 --> false在这里似乎有一个特殊,因为它应该转换为空字符串,而空字符串中没有不可打印的字符。
    \endgroup


    – 


  • 6
    \begingroup
    @xnor 因为挑战要求将输入转换为 base-128 […] 并输出结果是否仅使用可打印 ASCII(0x20 到 0x7E 包括在内)0 --> false所以对我来说完全没问题。我根本不认为这是一个极端情况。挑战没有提到转换为字符串
    \endgroup


    – 


  • 9
    \begingroup
    @xnor 可能0是一个只包含空字节 ( ) 的字符串0x00,而不是空字符串。而且空字节不可打印,因此为 false 是合理的。
    \endgroup


    – 

  • 4
    \begingroup
    @xnor,Jitse:这并不像将 0 转换为不同的基数会使其消失或出现其他情况……
    \endgroup


    – 

  • 3
    \begingroup
    @squareroot12621 并不是说​​改变基数会使它消失,而是十进制表示也是空字符串/列表,只是按照惯例,我们同意在它前面加一个零(前导),因为不写任何内容很难传达数字。
    \endgroup


    – 



18 个解决方案
18

\begingroup

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


    – 

\begingroup

,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
    由于挑战已更新为允许使用决策问题的默认值,因此您可以输出真值/假值反转->
    \endgroup


    – 

  • \begingroup
    @JonathanAllan 哦,太好了,谢谢
    \endgroup


    – 

\begingroup

44 43 40 字节

编辑:-3 字节,感谢 pajonk

f=\(x)(x+1)%%128>31&(!(y=x%/%128)||f(y))

\endgroup

2

  • 2
    \begingroup
    通过使用惰性||
    \endgroup


    – 

  • \begingroup
    @pajonk – 很好,谢谢!我会(尽量)记住这一点……
    \endgroup


    – 

\begingroup

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


    – 

\begingroup

,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

\begingroup

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
    我认为你可以returnn=0
    \endgroup


    – 

\begingroup

APL+WIN,36字节

提示输入整数。索引原点=0。1=真,0=假

(+/v∊32+⍳95)=⍴v←((⌈128⍟2⌈n)⍴128)⊤n←⎕

\endgroup

\begingroup

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

\begingroup

,30 字节

f=n=>-~n%128<33?n<!!n:f(n/128)

与 Arnauld 的长度相同,但输出效果更佳

,26 字节

f=n=>-~n%128<33?!n:f(n>>7)

更糟糕的输入

\endgroup

\begingroup

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


    – 

\begingroup

,6字节

₇τCkQF

如果为真则输出一个空列表,如果为假则输出一个非空列表。

\endgroup

\begingroup

,11字节

⌊⍘N⭆¹²⁸№γ℅ι

链接是代码的详细版本。实际上输出10一次。说明:

  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

\begingroup

,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

\begingroup

x86-64 机器代码函数,18 字节

ECX 中的整数参数,boolAL 中的返回值(实际上零扩展到 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

\begingroup

,24字节

f:{&/(a<127),31<a:128\x}

\endgroup

\begingroup

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)^2105 +10 字节


如果您要将其粘贴进去自己尝试,则必须通过单击它并按下键盘或内置 Desmos 键盘上的左箭头或右箭头键来
“激活”每个方程式(
B(x)和)。或者您可以逐行粘贴,因为我想这样可行f(x)

\endgroup

\begingroup

,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

\begingroup

,41 字节

{$_&&!grep !(127>*>31),.polymod(128 xx*)}

\endgroup