打印缺少的字符


18

简单的挑战是由我以前的打印无形文本实际的无形文本挑战,以及相同长度的不同字符串挑战的流行所启发。

给定一个仅包含可打印字符(0x20 to 0x7E)的字符串,请打印该字符串中不存在的每个可打印字符。

输入值

字符串或字符数组,仅由可打印的ASCII字符组成

输出量

输入字符串中没有出现的每个可打印ASCII字符(不按任何顺序)。

测试用例

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

计分

这是代码高尔夫球,因此每种语言中的最少字节数获胜


如果返回数组,我们可以在包含的字符中包含空元素吗?
毛茸茸的

@Shaggy肯定,那很好
Skidsdev

@Rod不要泄露我的计划D:
Skidsdev,

输出可以是字符字符串的Set对象吗?set( 'a', 'b', 'c' )
布拉德·吉尔伯特b2gills '17

1
@MikhailV 如果你的语言是无法输出ASCII字符
Skidsdev

Answers:


11

GS2,2个字节

ç7

在线尝试!

怎么运行的

    (implicit) Push the sting of all characters in STDIN on the stack.
ç   Push the string of all printable ASCII characters.
 7  Perform symmetric set difference.
    (implicit) Print the result to STDOUT.

6

Perl 6、29个字节

{[~] keys (' '..'~')∖.comb}

请注意,结果是随机的,因为Set是无序的。

测试一下

展开:

{
  [~]        # reduce using string concatenation
             # (shorter than 「join '',」)

  keys       # get the keys from the Set object resulting from the following

  (' '..'~') # Range of printable characters
            # Set minus (this is not \ )
  .comb      # split the input into individual characters
}

还有的ASCII版本 (-),但是它之前需要有一个空格,这样它就不会被解析为子例程调用。



5

Japt,14个字节

Ho#_dÃf@bX ¥J

在线尝试!

感谢Shaggy和obarakon,节省了4个字节


1
不需要标志(请参阅我对问题的评论的答案)。替换127#保存字节,取下U才能拯救他人。
毛茸茸的

1
您可以使用¦和重新排列参数以节省一些字节。另外,可以缩短127的TIO
奥利弗·奥利弗(Oliver)


1
不,汤姆,您不忙了,正如您之前所说,我需要学习更快地发帖!:D
毛茸茸的

1
一个10字节的版本,但不幸的是没有竞争:ethproductions.github.io/japt/…–
Shaggy

4

Haskell,32个字节

f x=[y|y<-[' '..'~'],all(/=y)x] 

在线尝试!

设置差异的无聊库函数:

Haskell,31个字节

import Data.List
([' '..'~']\\)

4

MATL,5个字节

6Y2X~

在线尝试!

感谢路易斯·门多(Luis Mendo)打高尔夫球8个字节!

说明:

   X~   % The symmetric set difference
6Y2     % Between all printable ASCII
        % And the input string (implicit)
        % Implicitly display

对称集差异将给出恰好存在于两个输入集之一中的每个元素。(但不是全部)这将始终给出正确的答案,因为输入集将始终是第二个集的子集(所有可打印ASCII)。

原始版本:

32:126tGom~)c

说明:

32:126          % Push the range 32-126
      t         % Duplicate it on the stack
       G        % Push the input
        o       % Convert it to character points
         m      % Is member (0 for each char that isn't in input, 1 for each char that is)
          ~     % Logical NOT
           )    % Take the truthy elements of this array from the previous array (All Printable ASCII)
            c   % Display as a string

3

Brachylog,5个字节

ẹ;Ṭ↔x

在线尝试!

说明

ẹ          Split the input string into a list of chars
 ;Ṭ↔x      Exterminate the chars from the string Ṭ of printable ASCII chars

3

JavaScript(ES6),74个字节

我敢肯定有更短的方法可以做到这一点!

s=>[...Array(95)].map((_,y)=>s.includes(c=String.fromCharCode(y+32))?"":c)

尝试一下

let f=
s=>[...Array(95)].map((_,y)=>s.includes(c=String.fromCharCode(y+32))?"":c)
oninput=_=>o.innerText=f(i.value).join``
o.innerText=f(i.value="Hello, World!").join``
<input id=i><pre id=o>


1
应该Array(95)包括失踪者~
马里维(Malivil)'17

@Malivil一直在那里吗?可能发誓最后一个角色是}我写这篇文章时。立即修复,谢谢。
毛茸茸的

不能相信C#比JavaScript短,尤其是因为我必须包括我的用法。
TheLethalCoder

1
@TheLethalCoder String.fromCharCode是一个git,这就是为什么!:D
毛茸茸的

@Shaggy我不知道,我只是在查看您的代码以查看其工作方式,因此我实际上在键盘上键入了每个符号,并注意到~并没有改变任何东西,只是它在规范中。另外,“ Try It”部分需要更新。
马里维(Malivil)'17

3

47 43 40字节

printf %x {32..126}|xxd -r -p|tr -d "$1"

在线尝试!

生成十六进制范围,将十六进制转储转换为char并删除第一个参数中存在的字符。


3

八度,22 20字节

感谢@Luis Mendo节省了2个字节。

@(s)setxor(32:'~',s)

在线尝试!

其他答案:

@(s)setdiff(' ':'~',s)

在线尝试!


1
@(s)setxor(' ':'~',s)保存1个字节
路易斯·门多

@LuisMendo非常好!但是我认为那是另一回事。我建议您将其发布为新答案:)
rahnema17年

1
不,实际上只是一个小改进。如果您愿意,我很高兴您将其发布。BTW @(s)setxor(32:'~',s)似乎也起作用---并对此发表同样评论:-)
Luis Mendo

1
@LuisMendo谢谢,我同意,因为(路易斯)说。
rahnema17年

2

PHP,42字节

输入为数组

输出为字符串

<?=join(array_diff(range(" ","~"),$_GET));

在线尝试!

PHP,53字节

输入为字符串

输出为字符串

<?=join(array_diff(range(" ","~"),str_split($argn)));

替换<?=joinprint_r用于输出作为阵列

在线尝试!


也许您应该制作一个高尔夫版本的PHP:P
CalculatorFeline

@CalculatorFeline我肯定存在,但它是不是真的好
约尔格Hülsermann

也许你应该做一个好人。步骤1:自动启动标签。
CalculatorFeline

@CalculatorFeline我已经为您搜索了链接。github.com/barkermn01/PGP-php-CodeGolf我有没有兴趣做一个
约尔格Hülsermann

1
@CalculatorFeline使PHP成为高尔夫语言会破坏用PHP打高尔夫的乐趣(至少对我而言):您必须在调用函数(通常具有长名称),使用循环,不同的输入方法等之间保持平衡。Step 1: automatic starting tag很好php -r...但是在这个例子中它没有付钱,因为echo比更长<?=
Christoph

2

CJam,8个字节

'␡,32>q^

文字删除字符在哪里。

在线尝试!

'␡,       e# The range of all characters up to ~.
   32>    e# Slice it to be the range of all characters from space to ~.
      q^  e# Symmetric set difference with the input.

只是注意,它-可以代替^
硕果累累

2

Perl,39个字节

s!.*!"pack(c95,32..126)=~y/$_//dr"!ee

用运行perl -pe


运行此命令时,我收到错误消息“在(eval 1)第2行,“ y / Hello World!// dr”附近的操作员期望的位置发现裸字” ...
Chris

完整的命令行:echo 'Hello World!' | perl -pe 's!.*!"pack(c95,32..126)=~y/$_//dr"!ee'。这对Perl v5.14和v5.24都适用。
Grimmy

是Perl v5.10无法正常工作...必须在5.10和5.14之间进行更改。
克里斯(Chris

2

brainfuck,120个字节

+[+[>+<+<]>]>-[[>>]+[<<]>>-],[<+++++[>------<-]>-[>[>>]+[<<]>-]>[>>]<[-]<[-<<]>,]++++++++[->++++<]>[>[-<.>]<[->>+<<]>>+]

在线尝试!

包裹:

+[+[>+<+<]>]>-[[>>]+[<<]>>-],[<+++++[>--
----<-]>-[>[>>]+[<<]>-]>[>>]<[-]<[-<<]>,
]++++++++[->++++<]>[>[-<.>]<[->>+<<]>>+]

解释:

+[+[>+<+<]>]>-         initialize what we will now consider cell 0 to 95
[[>>]+[<<]>>-]         initialize cells 2 4 etc 95*2 to 1; end on cell 0 at 0
,[                     main input loop (for each char of input)
  <+++++[>------<-]>-  subtract 31 from the input
  [>[>>]+[<<]>-]       lay a trail of (input minus 31) ones in the empty spaces
  >[>>]<[-]<[-<<]>     use the trail to clear the appropriate "print" flag
,]                     keep reading input until it ends
++++++++[->++++<]>     initialize the cell directly before flag 1 to 32
[                      we'll let the accumulator overflow; no harm done
  >[-<.>]              print the accumulator if the flag is still set
  <[->>+<<]>>+         shift over the accumulator and increment it
]


2

Ruby,23 18 17字节

->s{[*' '..?~]-s}

根据@sethrin的注释使用lambda函数。

之前的版本:

[*' '..?~]-s.chars

(' '..'~').to_a-s.chars

s不必从STDIN读取,也不必作为函数参数提供?挑战还规定输入可以以字符数组形式给出。转换为稳定的lambda并删除将chars提供16字节的解决方案。
canhascodez

鉴于未明确指定输入,我不确定该如何处理输入。还有其他一些答案假设变量中存在输入。有一个代码高尔夫约定吗?我没有那么做。
马克·托马斯

@sethrin带着脚的lambda会不会是20个字符?->(s){[*' '..?~]-s)}
马克·托马斯

lambda中的所有括号都是可选的。但是我可能误算了一个字节。其他语言则隐式接受输入或已stdin绑定到全局变量。在Ruby中,它$<是的快捷方式,stdin但lambda往往更短。输入和输出约定在这里。我也没有做太多事情,所以如果规则不是我认为的那样,请告诉我。
canhascodez

2

APL,13个字节

⍞~⍨⎕UCS31+⍳95

直截了当:

       31+⍳95  ⍝ A vector 32 .. 126
   ⎕UCS        ⍝ as characters
 ~⍨            ⍝ without
⍞              ⍝ those read from character input.

1

R,50个字节

function(s)intToUtf8(setdiff(32:126,utf8ToInt(s)))

返回一个匿名函数。将输入字符串转换为整数,计算可打印范围和输入值之间的设置差,然后将它们转换回字符串并返回。

在线尝试!



1

C#,74 71字节

using System.Linq;s=>new int[95].Select((n,i)=>(char)(i+32)).Except(s);

创建范围为74字节的旧版本:

using System.Linq;s=>Enumerable.Range(32,95).Select(n=>(char)n).Except(s);


1

V,20字节

òiÎflax
òcH ¬ ~@"<

在线尝试!

十六进制转储:

00000000: f269 ce66 1b6c 6178 0af2 6348 20ac 207e  .i.f.lax..cH . ~
00000010: 1b40 223c                                .@"<

1

C(gcc)75 72 70 68 50字节

i;f(s){for(i=31;++i<127;strchr(s,i)?:putchar(i));}

在线尝试!


您可以||用来在“标准” C上进行这项工作吗?
尼尔

@Neil是|| 也可以。不是吗:是“标准” C的一部分?
cleblanc

我一直以为这是gcc扩展。
尼尔

@Neil是的。?:是GNU扩展。虽然它在clang和tcc中也能正常工作。
丹尼斯

1

果冻,8 字节

真的是8个字节吗?请告诉我我错过了什么!

32r126Ọḟ

在线尝试!

怎么样?

32r126Ọḟ - Main link: list of characters s
32r126   - inclusive range from 32 to 126 = [32,33,...,125,126]
      Ọ  - cast ordinals to characters = list of printable characters
       ḟ - filter discard if in s

或者

“ ~‘r/Ọḟ - Main link
“ ~‘     - code-page indexes = [32,126]
    r/   - reduce by inclusive range = [32,33,...,125,126]
      Ọ  - cast from ordinals to characters = list of printable characters
       ḟ - filter discard if in s

由于这一挑战ØṖ,引入了一个新原子,该原子可产生所有可打印的ASCII字符,从而使3个字节的工作如下:

ØṖḟ

不,您什么都没错过。
暴民埃里克(Erik the Outgolfer)'17年

1

木炭18 15 10 8字节

Fγ¿¬№θιι

在线尝试!链接是详细版本的代码。编辑:通过覆盖字符而不是整数节省了3个字节。当我发现γ包含可打印ASCII字符的未记录变量时,又节省了5个字节。在纯模式下,仅@ASCII的固定预定义输入时,还保存了另外2个字节(答案仍然是正确的,这只是当时的try it在线链接不起作用)。


8个字节(除非预先初始化的输入无法再使用)
仅使用ASCII

@only ASCII它们不是在详细模式下工作……它们可能本来可以在简洁模式下工作,但我喜欢详细链接。
尼尔

0

Mathematica,35个字节

20~CharacterRange~126~Complement~#&

匿名函数。将字符列表作为输入,并返回字符列表作为输出。


0

Lua,78个字节

s=io.read()for i=32,126 do c=string.char(i)io.write(s:find(c,1,1)and""or c)end

0

shortC,33个字节

i;AOi=31;++i<'~';strchr(*@,i)?:Pi

在此程序中进行的转换:

  • A -> int main(int argc, char **argv) {
  • O -> for(
  • @ -> argv
  • P -> putchar
  • 自动插入关闭 ));}

结果程序如下:

i;int main(int argc, char **argv){for(i=31;++i<'~';strchr(*argv,i)?:putchar(i));}

在线尝试!


0

Pyth,17个字节

Vr32 127I!}CNzpCN

天真的方法。

说明:

Vr32 127I!}CNzpCN
Vr32 127             For N in [32, 127[
           CN        Get the ASCII character for the code N
        I!}  z       If it is in the input string...
              pCN    ...then print it

在线测试!


0

Clojure,60或49个字节

#(apply str(sort(apply disj(set(map char(range 32 127)))%)))

这些“应用”正在杀死我:/哦,如果返回列表很好,那么它会短一些。

#(sort(apply disj(set(map char(range 32 127)))%))
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.