In các ký tự bị thiếu


18

Thử thách đơn giản lấy cảm hứng từ sự phổ biến của văn bản in vô hình trước đây của tôi và in thử thách văn bản vô hình thực sự , và cùng thử thách chuỗi khác nhau .

Cho một chuỗi chỉ bao gồm các ký tự có thể in ( 0x20 to 0x7E), in mọi ký tự có thể in không có trong chuỗi.

Đầu vào

Một chuỗi hoặc một mảng các ký tự, chỉ bao gồm các ký tự ASCII có thể in được

Đầu ra

Mỗi ký tự ASCII có thể in không có trong chuỗi đầu vào, theo bất kỳ thứ tự nào.

Tủ thử

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

Chấm điểm

Đây là môn đánh gôn nên ít byte nhất trong mỗi ngôn ngữ sẽ thắng


Nếu trả về một mảng, chúng ta có thể bao gồm các phần tử trống thay cho các ký tự được sử dụng không?
Xù xì

@Shaggy chắc chắn, điều đó tốt
Skidsdev

@Rod đừng rò rỉ kế hoạch của tôi D:
Skidsdev

Đầu ra có thể là một đối tượng Set của chuỗi các ký tự không? set( 'a', 'b', 'c' )
Brad Gilbert b2gills

1
@MikhailV chỉ khi ngôn ngữ của bạn không thể xuất các ký tự ASCII
Skidsdev

Câu trả lời:


11

GS2 , 2 byte

ç7

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

    (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 byte

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

Lưu ý rằng kết quả là ngẫu nhiên vì Set s không có thứ tự.

Kiểm tra nó

Mở rộng:

{
  [~]        # 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
}

Ngoài ra còn có phiên bản ASCII (-), nhưng nó sẽ yêu cầu một khoảng trắng trước nó để nó không được phân tích cú pháp như một lệnh gọi chương trình con.



5

Japt , 14 byte

Ho#_dÃf@bX ¥J

Hãy thử trực tuyến!

Đã lưu 4 byte nhờ Shaggy và obarakon


1
Không cần cờ (xem câu trả lời cho nhận xét của tôi về câu hỏi). Thay thế 127bằng #để lưu một byte và loại bỏ để lưu một byte Ukhác.
Xù xì

1
Bạn có thể sử dụng ¦và sắp xếp lại các đối số của mình để lưu một vài byte. Ngoài ra, 127 có thể rút ngắn TIO
Oliver

1
Giảm xuống còn 14 byte: ethproductions.github.io/japt/,
Shaggy

1
Không, bạn làm việc với nó, Tom - như bạn đã nói trước đây, tôi cần học cách đăng nhanh hơn! : D
Xù xì

1
Phiên bản 10 byte nhưng không may không cạnh tranh: ethproductions.github.io/japt/iêu
Shaggy

4

Haskell, 32 byte

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

Hãy thử trực tuyến!

Chức năng thư viện nhàm chán cho sự khác biệt thiết lập:

Haskell, 31 byte

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

4

MATL , 5 byte

6Y2X~

Hãy thử trực tuyến!

Cảm ơn Luis Mendo vì đã chơi golf 8 byte!

Giải trình:

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

Sự khác biệt của bộ đối xứng sẽ cung cấp cho mọi phần tử có mặt trong chính xác một trong hai bộ đầu vào. (nhưng không phải cả hai) Điều này sẽ luôn đưa ra câu trả lời đúng, vì bộ đầu vào sẽ luôn là tập con của bộ thứ hai (tất cả ASCII có thể in được).

Phiên bản gốc:

32:126tGom~)c

Giải trình:

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

JavaScript (ES6), 74 byte

Tôi chắc chắn có một cách ngắn hơn để làm điều này!

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

Thử nó

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
Nên Array(95)bao gồm những người mất tích~
Malivil

Có phải luôn luôn ở đó, @Malivil? Có thể đã tuyên thệ nhân vật cuối cùng là }khi tôi viết nó lên. Đã sửa bây giờ, cảm ơn.
Xù xì

Không thể tin C # ngắn hơn JavaScript cho điều này, đặc biệt là khi tôi phải đưa vào các ứng dụng của mình.
TheLethalCoder

1
@TheLethalCoder, String.fromCharCodelà một git, đó là lý do! : D
Xù xì

@Shaggy Tôi không biết, tôi chỉ nhìn vào mã của bạn để xem nó hoạt động như thế nào và tôi đã gõ đúng từng ký hiệu trên bàn phím và nhận thấy ~không thay đổi gì ngoài thông số kỹ thuật. Ngoài ra, phần "Dùng thử" cần được cập nhật.
Malivil

3

Bash ,47 43 40 byte

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

Hãy thử trực tuyến!

Tạo phạm vi hexa, đảo ngược kết xuất hex thành char loại bỏ các ký tự có trong tham số đầu tiên.


3

Tháng Mười , 22 20 byte

Nhờ @Luis Mendo đã lưu 2 byte.

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

Hãy thử trực tuyến!

Câu trả lời khác:

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

Hãy thử trực tuyến!


1
@(s)setxor(' ':'~',s)tiết kiệm 1 byte
Luis Mendo

@LuisMendo Rất đẹp! Nhưng tôi nghĩ đó là một điều khác biệt. Tôi đề nghị bạn đăng nó dưới dạng câu trả lời mới :)
rahnema1

1
Không, nó thực sự chỉ là một cải tiến nhỏ. Tôi sẽ rất vui khi bạn đăng nó nếu bạn muốn. BTW @(s)setxor(32:'~',s)dường như cũng hoạt động --- và cùng nhận xét cho điều đó :-)
Luis Mendo

1
@LuisMendo Cảm ơn, tôi đồng ý vì (Luis) nói.
rahnema1

2

PHP, 42 byte

Nhập dưới dạng mảng

Đầu ra dưới dạng chuỗi

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

Hãy thử trực tuyến!

PHP, 53 byte

Nhập dưới dạng chuỗi

Đầu ra dưới dạng chuỗi

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

thay thế <?=joinvới print_rmột đầu ra như mảng

Hãy thử trực tuyến!


Có lẽ bạn nên tạo một phiên bản golf của PHP: P
CalculatorFeline

@CalculatorFeline Tôi chắc chắn rằng nó tồn tại nhưng nó không thực sự tốt
Jörg Hülsermann

Có lẽ bạn nên làm cho một tốt. Bước 1: thẻ bắt đầu tự động.
Máy

@CalculatorFeline Tôi đã tìm kiếm liên kết cho bạn. github.com/barkermn01/PGP-php-CodeGolf Tôi không có hứng thú để tạo một
Jörg Hülsermann

1
@CalculatorFeline Biến PHP thành ngôn ngữ chơi gôn phá hủy những điều thú vị khi chơi golf với PHP (ít nhất là đối với tôi): bạn phải liên tục cân bằng giữa các chức năng gọi (thường có tên dài), sử dụng các vòng lặp, các phương thức nhập khác nhau, v.v. Step 1: automatic starting tagtốt php -r... nhưng ví dụ trong ví dụ này, nó không trả tiền vì echodài hơn <?=.
Christoph


2

Perl, 39 byte

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

Chạy với perl -pe.


Tôi nhận được thông báo lỗi 'Bareword được tìm thấy nơi nhà điều hành dự kiến ​​ở (eval 1) dòng 2, gần "y / Hello World! // dr"' khi tôi chạy này ...
Chris

Dòng lệnh đầy đủ : echo 'Hello World!' | perl -pe 's!.*!"pack(c95,32..126)=~y/$_//dr"!ee'. Điều này làm việc cho tôi trên cả Perl v5.14 và v5.24.
Grimmy

Đó là Perl v5.10 không hoạt động ... Phải là một thay đổi được thực hiện trong khoảng từ 5.10 đến 5.14.
Chris

2

Brainfuck , 120 byte

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

Hãy thử trực tuyến!

Gói:

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

Giải thích:

+[+[>+<+<]>]>-         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 byte

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

Sử dụng chức năng lambda theo nhận xét của @ sethrin.

Những phiên bản trước:

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

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

Không phải sđọc từ STDIN hoặc được cung cấp dưới dạng đối số chức năng? Thách thức cũng xác định rằng đầu vào có thể được đưa ra dưới dạng một mảng các ký tự. Chuyển đổi sang lambda cứng và thả charscho giải pháp 16 byte.
canhascodez

Tôi không thực sự chắc chắn làm thế nào đầu vào được giải quyết, cho rằng nó không được chỉ định rõ ràng. Có một vài câu trả lời khác giả định sự tồn tại của đầu vào trong một biến. Có một quy ước codegolf? Tôi không làm điều này nhiều.
Đánh dấu Thomas

@sethrin Với lambda cứng nhắc sẽ không phải là 20 ký tự? ->(s){[*' '..?~]-s)}
Đánh dấu Thomas

Tất cả các dấu ngoặc trong lambda của bạn là tùy chọn. Nhưng tôi có thể đã nhầm lẫn một byte. Các ngôn ngữ khác chấp nhận đầu vào ngầm hoặc đã stdinràng buộc với một biến toàn cục. Trong Ruby $<là một phím tắt cho stdinnhưng lambdas có xu hướng ngắn hơn. Các quy ước về đầu vào và đầu ra là ở đây . Tôi cũng không làm điều này nhiều, vì vậy nếu các quy tắc không phải là những gì tôi nghĩ hãy cho tôi biết.
canhascodez

2

APL, 13 byte

⍞~⍨⎕UCS31+⍳95

Nói thẳng:

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

1

R , 50 byte

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

trả về một hàm ẩn danh. Chuyển đổi chuỗi đầu vào thành số nguyên, tính toán chênh lệch đã đặt giữa phạm vi có thể in và các giá trị đầu vào, sau đó chuyển đổi chúng trở lại thành một chuỗi và trả về nó.

Hãy thử trực tuyến!


1

PHP, 53 byte

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

Chạy như ống với -r.


Tôi không còn sân chơi nào nữa
Jörg Hülsermann

@ JörgHülsermann Bạn làm. Bạn chỉ cần chia sẻ nó.
Tít

1

C #, 74 71 byte

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

Phiên bản cũ với việc tạo phạm vi cho 74 byte:

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



1

C (gcc) , 75 72 70 68 50 byte

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

Hãy thử trực tuyến!


Bạn có thể sử dụng ||để làm cho công việc này trên "C" tiêu chuẩn?
Neil

@ Không có | | cũng hoạt động. Có phải không ?: Một phần của "tiêu chuẩn" C?
cleblanc

Tôi luôn nghĩ rằng đó là một phần mở rộng gcc.
Neil

@Neil Đúng vậy. ?:là một phần mở rộng GNU. Nó hoạt động tốt trong clang và tcc mặc dù.
Dennis

1

Thạch , 8 byte

Thực sự, 8 byte? Xin vui lòng, cho tôi biết tôi đã bỏ lỡ một cái gì đó!

32r126Ọḟ

Hãy thử trực tuyến!

Làm sao?

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

Hoặc

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

Vì thách thức này một nguyên tử mới mang lại tất cả các ký tự ASCII có thể in được ØṖ, đã được giới thiệu làm cho công việc sau đây có 3 byte:

ØṖḟ

Không, bạn đã không bỏ lỡ bất cứ điều gì.
Erik the Outgolfer

1

Than , 18 15 10 8 byte

Fγ¿¬№θιι

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Chỉnh sửa: Đã lưu 3 byte bằng cách thay đổi các ký tự thay vì số nguyên. Đã lưu thêm 5 byte khi tôi phát hiện ra γbiến không có giấy tờ chứa các ký tự ASCII có thể in được. Đã lưu thêm 2 byte khi các đầu vào được xác định trước chỉ cố định @ ASCII ở chế độ dài dòng (câu trả lời vẫn còn hiệu lực, đó chỉ là liên kết thử trực tuyến không hoạt động vào thời điểm đó).


8 byte (trừ khi đầu vào được khởi tạo trước không hoạt động trở lại)
ASCII - chỉ

Chỉ có ASCII Họ không làm việc ở chế độ dài dòng ... họ có thể đã làm việc ở chế độ cô đọng, nhưng tôi thích các liên kết dài dòng.
Neil

0

Toán học, 35 byte

20~CharacterRange~126~Complement~#&

Chức năng ẩn danh. Lấy danh sách các ký tự làm đầu vào và trả về danh sách các ký tự làm đầu ra.


0

Lua, 78 byte

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 byte

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

Chuyển đổi được thực hiện trong chương trình này:

  • A -> int main(int argc, char **argv) {
  • O -> for(
  • @ -> argv
  • P -> putchar
  • Tự động đóng ));}

Chương trình kết quả trông như sau:

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

Hãy thử trực tuyến!


0

Bình thường , 17 byte

Vr32 127I!}CNzpCN

Cách tiếp cận ngây thơ.

Giải trình:

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

Kiểm tra nó trực tuyến!


0

Clojure, 60 hoặc 49 byte

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

Những "ứng dụng" này đang giết chết tôi: / Ồ, nếu trả về một danh sách là tốt thì cái này ngắn hơn một chút.

#(sort(apply disj(set(map char(range 32 127)))%))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.