打印真实的不可见文本


15

我以前的挑战是“ 打印不可见文本”非常流行,这可能是因为它太琐碎了。

但是,那些更细心的人可能已经注意到您并不是真正在打印不可见的文本,因为仅给出输出就无法读取输入的内容。

因此,我想到了真正的隐形文本挑战。

给出只由可打印的ASCII字符(串0x20-0x7E),每个字符转换为一个不同的Unicode字符(以UTF-8编码)不属于95个可打印的ASCII字符中的一个(任UTF-8字符以外0x20-0x7E的范围)

输入值

一串可打印的ASCII字符,可以是字符串,也可以是字符数组/列表

输出量

每个字符的输入字符串均替换为不同的不可打印字符。每个给定字符都必须具有一个相应的不可打印字符,该字符不可替代任何其他字符。

如果无法打印不可打印的字符,则可以输出字符值。

例如,如果您的代码将所有小写字母替换a0x01,则您不能将其0x01用作其他任何字符的替换。

您的代码也必须是确定性的。这意味着,如果给定string Hello,所有小写字母l都替换为0x03,则您的代码也必须l使用0x03给定的任何其他字符串替换所有小写字母。

测试用例

为此挑战编写测试用例有些困难,因此我将输出显示为十六进制代码列表

input     -> output
"Hello"   -> [0x01, 0x02, 0x03, 0x03, 0x04]
"Hi!"     -> [0x01, 0x05, 0x06]
""        -> []
"   H   " -> [0x07, 0x07, 0x07, 0x01, 0x07, 0x07, 0x07]
"yo! "    -> [0x08, 0x04, 0x06, 0x07]

排行榜

这是一个堆栈片段,用于按语言生成常规排行榜和获胜者概述。


9
没有UTF-8字符这样的东西:UTF-8是Unicode的序列化,而不是字符集。而且,如果“不可打印的”在Unicode上下文中有意义,那么它肯定比“成百上千的已分配代码点中的只有95个” 窄得多。
彼得·泰勒

11
@PeterTaylor鉴于我们在这里使用字符十六进制代码进行交谈,我认为很明显,当我说UTF-8字符时,我的意思是UTF-8编码中的Unicode字符。ASCII也是一种编码标准,而不是字符集,但是人们对“ ASCII字符”一词没有任何疑问。无论如何,我将对措辞进行澄清。
Skidsdev

3
需要UTF-8的任何特殊原因吗?
CalculatorFeline

输入可以为空吗?
丹尼斯,

1
为“如果您无法打印不可打印的字符” +1
罗伯特·弗雷泽

Answers:


13

果冻,3个字节

O²Ọ

在线尝试!

平方每个代码点。


与我想到的Japt解决方案非常相似,希望我将代码点放入多维数据集而不是平方-您可以将其发布吗?
毛茸茸的

2
@Shaggy Japt≠Jelly,所以您可以发布它。
暴民埃里克(Erik the Outgolfer)'17年

聪明的解决方案,没想到平方。
Skidsdev

1
盛大的,只是想确定一下,以免您以为我只是在剥夺您的解决方案:)
毛茸茸的

4
@Shaggy没有针对将解决方案移植到另一种语言的准则;如果有的话,那将是可怕的,因为通常有一个最优算法可以在大多数语言中实现最优实现,只有第一个发布者无法证明自己是该算法附带的。当然,如果您确实移植了其他人的解决方案,那么提及他们的答案只是公平的做法。
亚伦

13

空格39 36字节


  
   	  
 
  
 	
	 				  
	
  
 


在线尝试!

说明

nssn  ; label 'loop'
ssstssn ; push 4 to use as a multiplication operand
sns   ; dup 4 to use as a heap address
sns   ; dup 4 to use as a heap address
tnts  ; getchar and store at address 4
ttt   ; retrieve the value at address 4
tssn  ; multiply the character value by 4
tnss  ; putchar output the new character
nsnn  ; jmp 'loop'

最初,我想乘以-0或-1,因为它们将是在空格中声明的最短数字。TIO不会在-0和+0之间进行区分,所以可以了。不幸的是,尽管本教程/规范对如何将负值解释为char TIO模棱两可(正确地)会引发有关无效参数的错误,所以这也不是一个选择。

下一个最短的工作常数是4,因此我们最终执行与Powershell / Pyth解决方案相同的基本方法。


空格56 53字节-映射到标记字符


  
   			                 
 
  
 	
	 				   	
  
 


在线尝试!

说明

与以前的版本实际上有效的方法相同,只是使用0xE0000作为常量并加而不是乘。这会将可见的ASCII字符映射到相应的Unicode标记字符(范围U + E0000-U + E007F)。此范围的预期用途是指示纯文本文件中文本的语言,但是不建议使用。如果为字符串加上0x01字符作为前缀,则此代码将输出有效的标签。

Unicode标准说,在这个字符范围没有明显的渲染,所以我觉得这个迎接挑战的精神比以前的方法更好。


5
使用不可见程序打印不可见文本。我喜欢。
马克

7

Japt5 2字节

cp

在线尝试


说明

     :Implicit input of string U
c    :Map over the character codes of the string.
p    :Square them.
     :Implicit output of result.

嗯,仔细检查后,似乎126 ** 3 == 2000376不在[0..1114111]范围内。您仍然可以摆正:)那是因为UTF-8结束于此,而UTF-16继续。
暴民埃里克(Erik the Outgolfer)'17年

1
@EriktheOutgolfer嗯。根据定义,UTF-8的范围与UTF-16完全相同。(理论上,UTF-8可以存储更高的代码点,每个代码点使用5或6个字节,但这是非法的。)
Lister先生,

5

脑爆裂,33个字节

包括+1的 -c

{((({}){}){}<>)<>}<>{({}<>)<>}<>

在线尝试!

# For each character
{
  # Multiply by 4 and move to the other stack
  ((({}){}){}<>)

# End loop
<>}

# For each character on the other stack
<>{

  # Copy it back (reverse the stack)
  ({}<>)<>

# End loop
}<>

4

Braingolf v0.6,17个字节

VRl1-M[R.*>v]R&@

平方每个char值,然后打印。

-1字节归功于Outgolfer的平方解决方案Erik

Braingolf v0.7,6个字节[非竞争]

{.*}&@

也对每个值求平方然后打印,但是v0.7具有“ foreach” {}循环


4

Mathematica,48个字节

FromCharacterCode[4Mod[Hash/@Characters@#,978]]&

说明:

                             Characters@#      & - Convert string to array of characters
                       Hash/@                    - Hash them all using default hash
                   Mod[                  ,978]   - apply a modulus which uniquely transforms each potential character's hash into a number
                  4                              - times by 4 to move values out of 0x20-0x7E.
FromCharacterCode[                            ]  - Convert array of numbers back to string

有趣的是,在两个小于1000的模数选项中,将96个字符更改为96个唯一值,模数为978,最低的两个值是7,然后是33。幸运的是,乘以4会将其转换为28和132,这两个值均落在可见范围之外。如果使用其他模数784,则需要乘以18才能将数字移出范​​围。

测试用例。

注意:有额外的反斜杠作为转义字符"\。另外,字符0x7E似乎也不想正确粘贴。

Input: "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"

输出: enter image description here

使用的Hash是约的ToCharacterCode是很长的。但是散列它几乎是昂贵的。最简单的数学方法是49个字节:

FromCharacterCode[4ToCharacterCode@Characters@#]&



2

电源外壳, 32岁 31字节

-1感谢neil, 99+4*

[char[]]"$args"|%{[char](4*$_)}

每个字符代码乘以9并打印回去。


出于兴趣,乘以少量(4-9)会起作用吗?
尼尔

最小可打印时间4大于最大可打印时间-1,谢谢!
colsw



1

十进制,37字节

91D31030030012255D412D590D543D301291D

说明:

91D             ; declare jump 1
    310         ; push user input to stack
    300         ; duplicate
    300         ; duplicate
    12255D      ; push EOF to stack
    412D        ; compare top two values, pop, push result
    5 90D 5     ; if result == true, quit
    43D         ; multiply top two values, pop, push result
    301         ; print
    2           ; pop
91D             ; goto jump 1

在线尝试!


所以跳到零(90D)会终止?
Skidsdev

@Mayube正是。
MD XF

1

Google表格,68个字节

=ArrayFormula(Join("",IfError(Char(Code(Mid(A1,Row(A:A),1))^2),"")))

我想发布此内容以显示在Sheets中执行一些基本功能有多么尴尬。您是否要对单元格中的每个字符进行操作并取出连接的结果?你在42个字节之前,你甚至行为上的这些字符。

=ArrayFormula(Join("",Mid(A1,Row(A:A),1)))

否则,这与其他解决方案相同:将每个字符的代码点平方。



0

C,42个字节

c;f(){while(~(c=getchar()))putwchar(c*c);}

假定使用UTF-8语言环境。输入为平方。

在线尝试!


0

干净,25个字节

import StdEnv

map((+)'~')

部分函数文字。

在线尝试!

实际上:

f s = {# c+'~' \\ c <-: s}

对相同类型({#Char} -> {#Char})的未装箱数组的未装箱数组理解。Clean将能够确定唯一性是可转移的(!u:{#Char} -> u:{#Char}),并且大小与输入大小相同。这意味着,如果传递a *String,则每个字符都将使用输出中的相应字符进行破坏性的更新,这意味着不会进行任何内存分配或移动,并且图形节点将被完全重用。

在线尝试!

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.