누락 된 문자 인쇄


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

@Shaggy 물론, 괜찮습니다
Skidsdev

@로드 내 계획을 유출하지 않습니다 D :
Skidsdev

출력이 문자 스트링의 Set 오브젝트 일 수 있습니까 ? set( 'a', 'b', 'c' )
브래드 길버트는 b2gills

1
언어가 ASCII 문자를 출력 할 수없는 경우 에만 @MikhailV
Skidsdev

답변:


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

펄 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

apt , 14 바이트

Ho#_dÃf@bX ¥J

온라인으로 사용해보십시오!

Shaggy와 obarakon 덕분에 4 바이트 절약


1
깃발이 필요하지 않습니다 (질문에 대한 내 의견에 대한 답변 참조). 교체 127#바이트를 저장하고 제거 할 U또 다른 사항을 저장합니다.
Shaggy

1
¦인수를 사용 하고 재정렬하여 몇 바이트를 절약 할 수 있습니다 . 또한 127은 TIO를
Oliver

1
14 바이트로 줄였습니다
Shaggy

1
아닙니다. Tom과 함께 해결합니다. 이전에 말했듯이 더 빨리 게시하는 법을 배워야합니다! : D
Shaggy

1
10 바이트 버전이지만 불행하게도 경쟁이 아닙니다
Shaggy


4

MATL , 5 바이트

6Y2X~

온라인으로 사용해보십시오!

8 바이트골프로 해주신 Luis Mendo에게 감사드립니다 !

설명:

   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

자바 스크립트 (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

@Malivil이 항상 거기 있었습니까? }내가 이것을 쓸 때 마지막 인물이 맹세 했을 수 있습니다. 고맙습니다.
Shaggy

C #이 JavaScript보다 짧다는 것을 믿을 수 없습니다. 특히 사용을 포함해야합니다.
TheLethalCoder

1
@ TheLethalCoder String.fromCharCode는 자식이므로 그 이유입니다! : D
Shaggy

@Shaggy I dunno, 방금 코드가 어떻게 작동하는지보고 있었고 키보드의 모든 기호를 문자 그대로 입력하고 ~아무것도 변경하지 않았지만 사양에 있음을 알았 습니다. 또한 "Try It"부분도 업데이트해야합니다.
Malivil


3

옥타브, 22 20 바이트

@Luis Mendo 덕분에 2 바이트가 절약되었습니다.

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

온라인으로 사용해보십시오!

다른 답변 :

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

온라인으로 사용해보십시오!


1
@(s)setxor(' ':'~',s)1 바이트 절약
Luis Mendo

@LuisMendo 아주 좋은! 그러나 나는 그것이 다른 것이라고 생각합니다. 나는 당신이 새로운 답변으로 게시하는 것이 좋습니다 :)
rahnema1

1
아니요, 실제로는 약간만 개선되었습니다. 원하는 경우 게시 해 드리겠습니다. BTW @(s)setxor(32:'~',s)도 작동하는 것 같습니다 ---와 같은 의견 :-)
Luis Mendo

1
@LuisMendo 감사합니다. (Luis)가 말했기 때문에 동의합니다.
rahnema1

2

PHP, 42 바이트

배열로 입력

문자열로 출력

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

온라인으로 사용해보십시오!

PHP, 53 바이트

문자열로 입력

문자열로 출력

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

바꾸다 <?=joinprint_r배열로서 출력

온라인으로 사용해보십시오!


어쩌면 당신은 PHP : P
CalculatorFeline

@CalculatorFeline 그것이 존재한다고 확신하지만 실제로는 좋지 않습니다
Jörg Hülsermann

어쩌면 당신은 좋은 것을 만들어야합니다. 1 단계 : 자동 시작 태그.
CalculatorFeline

@CalculatorFeline 나는 당신을 위해 링크를 검색했습니다. github.com/barkermn01/PGP-php-CodeGolf 저는 하나도 관심이 없습니다
Jörg Hülsermann

1
@CalculatorFeline PHP를 골프 언어로 만드는 것은 PHP로 골프를 즐기는 재미를 없애는 것입니다. Step 1: automatic starting tagphp -r...하지만 예를 들어이 예제에서는 echo보다 길기 때문에 지불하지 않습니다 <?=.
Christoph


2

펄, 39 바이트

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

로 실행하십시오 perl -pe.


이 명령을 실행할 때 'y / Hello World! // dr'근처의 (eval 1) 라인 2에서 운영자가 예상 한 위치에서 오류가 발견되었습니다 ...
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

루비, 23 18 17 바이트

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

@sethrin의 의견에 따라 람다 함수를 사용합니다.

이전 버전:

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

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

Doesn't s have to be either read from STDIN or supplied as a function argument? The challenge also specifies that the input may be given as an array of characters. Converting to a stabby lambda and dropping chars gives a 16-byte solution.
canhascodez

I wasn't really sure how the input was to be addressed, given that it wasn't explicitly specified. There are a few other answers that assume the existence of the input in a variable. Is there a codegolf convention? I don't do this much.
Mark Thomas

@sethrin With a stabby lambda wouldn't it be 20 chars? ->(s){[*' '..?~]-s)}
Mark Thomas

All of the parentheses in your lambda are optional. But I may have miscounted a byte. Other languages either accept input implicitly or have stdin bound to a global variable. In Ruby $< is a shortcut for stdin but lambdas tend to be shorter. The conventions on input and output are here. I also don't do this much, so if the rules aren't what I think do let me know.
canhascodez

2

APL, 13 bytes

⍞~⍨⎕UCS31+⍳95

Straightforward:

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

1

R, 50 bytes

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

returns an anonymous function. Converts the input string to integers, computes the set difference between the printable range and the input values, and then converts them back to a string and returns it.

Try it online!


1

PHP, 53 bytes

for($k=31;$k++<126;)~strstr($argn,$k)?:print chr($k);
# or
for($k=31;$k++<126;)echo~strstr($argn,$k)?"":chr($k);

Run as pipe with -r.


I have left no more playground
Jörg Hülsermann

@JörgHülsermann You do. You just have to share it.
Titus

1

C#, 74 71 bytes

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

Old version with creating a range for 74 bytes:

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

1

05AB1E, 5 4 bytes

-1 thanks to Emigna

žQsK

Try it online!

žQ   # Push all printable characters
  s  # Swap input to the top
   K # Push a with no b's (remove input characters from all printable character)

@FrodCube Oops... I forgot to update the link. It should work now. TIO (empty input)
Riley

1

V, 20 bytes

òiÎflax
òcH ¬ ~@"<

Try it online!

Hexdump:

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

1

C (gcc), 75 72 70 68 50 bytes

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

Try it online!


Can you use || to make this work on "standard" C?
Neil

@Neil Yes || also works. Isn't ?: part of "standard" C?
cleblanc

I always thought it was a gcc extension.
Neil

@Neil That's correct. ?: is a GNU extension. It works as well in clang and tcc though.
Dennis

1

Jelly, 8 bytes

Really, 8 bytes? Please, tell me I missed something!

32r126Ọḟ

Try it online!

How?

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

Alternatively

“ ~‘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

Since this challenge a new atom which yields all printable ASCII characters, ØṖ, has been introduced making the following work for 3 bytes:

ØṖḟ

No you didn't miss anything.
Erik the Outgolfer

1

Charcoal, 18 15 10 8 bytes

Fγ¿¬№θιι

Try it online! Link is to verbose version of code. Edit: Saved 3 bytes by ranging over characters instead of integers. Saved a further 5 bytes when I discovered the undocumented γ variable which holds the printable ASCII characters. Saved a further 2 bytes when @ASCII-only fixed predefined inputs in verbose mode (the answer is still valid as it stands, it's only the try it online link that wouldn't have worked at the time).


8 bytes (unless preinitialized inputs weren't working back then)
ASCII-only

@ASCII-only They weren't working in verbose mode... they would probably have worked in succinct mode, but I like the verbose links.
Neil

0

Mathematica, 35 bytes

20~CharacterRange~126~Complement~#&

Anonymous function. Takes a list of characters as input and returns a list of characters as output.


0

Lua, 78 bytes

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 bytes

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

Conversions made in this program:

  • A -> int main(int argc, char **argv) {
  • O -> for(
  • @ -> argv
  • P -> putchar
  • Auto-inserted closing ));}

The resulting program looks like:

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

Try it online!


0

Pyth, 17 bytes

Vr32 127I!}CNzpCN

The naive approach.

Explanation:

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

Test it online!


0

Clojure, 60 or 49 bytes

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

These "apply"s are killing me :/ Oh, if returning a list is fine then this is a bit shorter.

#(sort(apply disj(set(map char(range 32 127)))%))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.