Cetak karakter yang hilang

18

Tantangan sederhana terinspirasi oleh popularitas teks tak terlihat cetak saya sebelumnya dan mencetak tantangan teks nyata tak terlihat , dan tantangan string berbeda panjang yang sama .

Diberikan string yang hanya terdiri dari karakter yang dapat dicetak ( 0x20 to 0x7E), cetak setiap karakter yang dapat dicetak yang tidak ada dalam string.

Memasukkan

String, atau array karakter, terdiri dari hanya karakter ASCII yang dapat dicetak

Keluaran

Setiap karakter ASCII yang dapat dicetak tidak ada dalam string input, dalam urutan apa pun.

Testcases

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

Mencetak gol

Ini adalah kode-golf sehingga byte paling sedikit di setiap bahasa menang

Skidsdev
sumber
Jika mengembalikan array, dapatkah kami menyertakan elemen kosong sebagai pengganti karakter yang digunakan?
Shaggy
@Shaggy yakin, tidak apa-apa
Skidsdev
@Rod jangan bocorkan rencanaku D:
Skidsdev
Bisakah output menjadi objek Tetapkan string karakter? set( 'a', 'b', 'c' )
Brad Gilbert b2gills
1
@MikhailV hanya jika bahasa Anda tidak dapat menampilkan karakter ASCII
Skidsdev

Jawaban:

11

GS2 , 2 byte

ç7

Cobalah online!

Bagaimana itu bekerja

    (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.
Dennis
sumber
6

Perl 6 , 29 byte

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

Perhatikan bahwa hasilnya acak karena Set s tidak berurutan.

Menguji

Diperluas:

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

Ada juga versi ASCII (-), tetapi akan membutuhkan ruang sebelum itu agar tidak diuraikan sebagai panggilan subrutin.

Brad Gilbert b2gills
sumber
6

Python 3.5 , 39 byte

lambda n:{*map(chr,range(32,127))}-{*n}

Cobalah online!
Mengubah input menjadi satu set, dan menghapusnya dari set yang berisi semua karakter ascii

tongkat
sumber
Ini hanya berfungsi setelah Python 3.5.
Gábor Fekete
5

Japt , 14 byte

Ho#_dÃf@bX ¥J

Cobalah online!

Disimpan 4 byte berkat Shaggy dan obarakon

Tom
sumber
1
Tidak perlu bendera (lihat jawaban untuk komentar saya pada pertanyaan). Ganti 127dengan #untuk menyimpan byte dan hapus Uuntuk menyimpan yang lain.
Shaggy
1
Anda dapat menggunakan ¦dan mengatur ulang argumen Anda untuk menghemat beberapa byte. Juga, 127 dapat disingkat TIO
Oliver
1
Turun hingga 14 byte: ethproductions.github.io/japt/…
Shaggy
1
Tidak, Anda bekerja dengan itu, Tom - seperti yang Anda katakan sebelumnya, saya perlu belajar memposting lebih cepat! : D
Shaggy
1
Versi 10 byte tetapi sayangnya tidak bersaing: ethproductions.github.io/japt/…
Shaggy
4

Haskell, 32 byte

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

Cobalah online!

Fungsi perpustakaan yang membosankan untuk perbedaan set:

Haskell, 31 byte

import Data.List
([' '..'~']\\)
nimi
sumber
4

MATL , 5 byte

6Y2X~

Cobalah online!

Terima kasih untuk Luis Mendo bermain golf dengan 8 byte!

Penjelasan:

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

Perbedaan set simetris akan memberikan setiap elemen yang ada di persis salah satu dari dua set input. (tetapi tidak keduanya) Ini akan selalu memberikan jawaban yang benar, karena set input akan selalu menjadi subset dari set kedua (semua ASCII yang dapat dicetak).

Versi asli:

32:126tGom~)c

Penjelasan:

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
DJMcMayhem
sumber
3

Brachylog , 5 byte

ẹ;Ṭ↔x

Cobalah online!

Penjelasan

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

JavaScript (ES6), 74 byte

Saya yakin ada cara yang lebih singkat untuk melakukan ini!

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

Cobalah

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>

Shaggy
sumber
1
Seharusnya Array(95)termasuk yang hilang~
Malivil
Apakah itu selalu ada, @Malivil? Bisa bersumpah karakter terakhir adalah }ketika saya menulis ini. Tetap sekarang, terima kasih.
Shaggy
Tidak percaya C # lebih pendek dari JavaScript untuk ini, terutama karena saya harus memasukkan usings saya.
TheLethalCoder
1
@TheLethalCoder, String.fromCharCodeadalah git, itu sebabnya! : D
Shaggy
@ Shaggy Saya tidak tahu, saya baru saja melihat kode Anda untuk melihat cara kerjanya dan saya mengetik setiap simbol di keyboard saya dan melihat ~tidak mengubah apa pun kecuali bahwa itu ada dalam spesifikasi. Juga, bagian "Cobalah" perlu diperbarui.
Malivil
3

Pesta ,47 43 40 byte

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

Cobalah online!

Menghasilkan kisaran hexa, membalikkan hex dump untuk menghasilkan karakter yang ada di parameter pertama.

marcosm
sumber
3

Oktaf, 22 20 byte

Terima kasih kepada @Luis Mendo yang menyimpan 2 byte.

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

Cobalah online!

Jawaban lain:

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

Cobalah online!

rahnema1
sumber
1
@(s)setxor(' ':'~',s)menghemat 1 byte
Luis Mendo
@LuisMendo Sangat bagus! Tapi saya pikir itu hal yang berbeda. Saya menyarankan agar Anda mempostingnya sebagai jawaban baru :)
rahnema1
1
Tidak, ini hanya perbaikan kecil. Saya akan senang Anda mempostingnya jika Anda mau. BTW @(s)setxor(32:'~',s)tampaknya bekerja juga --- dan komentar yang sama untuk itu :-)
Luis Mendo
1
@LuisMendo Terima kasih, saya setuju karena (Luis) berkata.
rahnema1
2

PHP, 42 Bytes

Input sebagai array

Keluaran sebagai string

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

Cobalah online!

PHP, 53 Bytes

Input sebagai string

Keluaran sebagai string

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

ganti <?=joindengan print_runtuk output sebagai array

Cobalah online!

Jörg Hülsermann
sumber
Mungkin Anda harus membuat versi golf PHP: P
CalculatorFeline
@ CalculatorFeline Saya yakin itu ada tetapi tidak terlalu bagus
Jörg Hülsermann
Mungkin Anda harus membuat yang bagus. Langkah 1: tag mulai otomatis.
CalculatorFeline
@ CalculatorFeline Saya telah mencari tautannya untuk Anda. github.com/barkermn01/PGP-php-CodeGolf Saya tidak tertarik untuk membuatnya
Jörg Hülsermann
1
@CalculatorFeline Menjadikan PHP bahasa golf menghancurkan apa yang menyenangkan dalam bermain golf dengan PHP (setidaknya untuk saya): Anda harus terus menyeimbangkan antara fungsi panggilan (yang sering memiliki nama panjang), menggunakan loop, metode input berbeda, dan sebagainya. Step 1: automatic starting tagbaik php -r... tetapi misalnya dalam contoh ini tidak membayar karena echolebih lama dari <?=.
Christoph
2

CJam , 8 byte

'␡,32>q^

Di mana karakter hapus literal.

Cobalah online!

'␡,       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.
Kucing Bisnis
sumber
Sama seperti catatan, -berfungsi bukan ^.
Buah Esolanging
2

Perl, 39 byte

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

Jalankan dengan perl -pe.

Grimmy
sumber
Saya mendapatkan pesan kesalahan 'Bareword ditemukan di tempat yang diharapkan operator (eval 1) jalur 2, dekat "y / Hello World! // dr"' ketika saya menjalankan ini ...
Chris
Penuh baris perintah: echo 'Hello World!' | perl -pe 's!.*!"pack(c95,32..126)=~y/$_//dr"!ee'. Ini bekerja untuk saya di Perl v5.14 dan v5.24.
Grimmy
Ini Perl v5.10 yang tidak berfungsi ... Harus ada perubahan yang dibuat antara 5.10 dan 5.14.
Chris
2

brainfuck , 120 byte

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

Cobalah online!

Terbungkus:

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

Dijelaskan:

+[+[>+<+<]>]>-         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
]
Gagang pintu
sumber
2

Ohm , 3 byte

α@─

Cobalah online!

Catatan: Anda juga dapat memasukkan input sebagai string ( contoh ), tetapi gagal untuk case input kosong.

FrodCube
sumber
2

Ruby, 23 18 17 byte

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

Menggunakan fungsi lambda sesuai komentar @ sethrin.

Versi sebelumnya:

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

(' '..'~').to_a-s.chars
Mark Thomas
sumber
Tidak sharus dibaca dari STDIN atau disediakan sebagai argumen fungsi? Tantangan juga menentukan bahwa input dapat diberikan sebagai array karakter. Mengubah ke lambda yang stabil dan menjatuhkan charsmemberikan solusi 16-byte.
canhascodez
Saya tidak begitu yakin bagaimana input harus dialamatkan, mengingat bahwa itu tidak ditentukan secara eksplisit. Ada beberapa jawaban lain yang mengasumsikan keberadaan input dalam suatu variabel. Apakah ada konvensi codegolf? Saya tidak melakukan ini banyak.
Mark Thomas
@sethrin Dengan lambda stabby bukankah itu 20 karakter? ->(s){[*' '..?~]-s)}
Mark Thomas
Semua tanda kurung di lambda Anda adalah opsional. Tapi saya mungkin salah menghitung byte. Bahasa lain menerima input secara implisit atau stdinterikat ke variabel global. Di Ruby $<adalah jalan pintas untuk stdintetapi lambdas cenderung lebih pendek. Konvensi input dan output ada di sini . Saya juga tidak melakukan ini banyak, jadi jika aturannya tidak seperti yang saya pikirkan, beri tahu saya.
canhascodez
2

APL, 13 byte

⍞~⍨⎕UCS31+⍳95

Mudah:

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

R , 50 byte

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

mengembalikan fungsi anonim. Mengubah string input menjadi bilangan bulat, menghitung perbedaan yang ditetapkan antara rentang yang dapat dicetak dan nilai input, dan kemudian mengubahnya kembali menjadi string dan mengembalikannya.

Cobalah online!

Giuseppe
sumber
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);

Jalankan sebagai pipa dengan -r.

Titus
sumber
Saya tidak lagi meninggalkan taman bermain
Jörg Hülsermann
@ JörgHülsermann Anda tahu. Anda hanya perlu membagikannya.
Titus
1

C #, 74 71 byte

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

Versi lama dengan membuat kisaran untuk 74 byte:

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

05AB1E , 5 4 byte

-1 terima kasih kepada Emigna

žQsK

Cobalah 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)
Riley
sumber
@FrodCube Ups ... Saya lupa memperbarui tautan. Itu seharusnya bekerja sekarang. TIO (input kosong)
Riley
1

V , 20 byte

òiÎflax
òcH ¬ ~@"<

Cobalah online!

Hexdump:

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

C (gcc) , 75 72 70 68 50 byte

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

Cobalah online!

Cleblanc
sumber
Bisakah Anda menggunakan ini ||untuk bekerja pada "standar" C?
Neil
@Neil Ya || juga berfungsi. Bukankah?: Bagian dari "standar" C?
cleblanc
Saya selalu berpikir itu adalah ekstensi gcc.
Neil
@ Neil Itu benar. ?:adalah ekstensi GNU. Ini bekerja juga dalam dentang dan tcc.
Dennis
1

Jelly , 8 byte

Benarkah, 8 byte? Tolong, katakan padaku aku melewatkan sesuatu!

32r126Ọḟ

Cobalah online!

Bagaimana?

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

kalau tidak

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

Karena tantangan ini, sebuah atom baru yang menghasilkan semua karakter ASCII yang dapat dicetak ØṖ,, telah diperkenalkan membuat karya berikut ini untuk 3 byte:

ØṖḟ
Jonathan Allan
sumber
Tidak, Anda tidak melewatkan apa pun.
Erik the Outgolfer
1

Arang , 18 15 10 8 byte

Fγ¿¬№θιι

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Sunting: Disimpan 3 byte dengan rentang karakter alih-alih bilangan bulat. Menyimpan 5 byte lebih lanjut ketika saya menemukan γvariabel tidak berdokumen yang menampung karakter ASCII yang dapat dicetak. Menyimpan 2 byte lebih lanjut ketika @ ASCII-satunya input tetap ditetapkan sebelumnya dalam mode verbose (jawabannya masih berlaku seperti itu, itu hanya link online coba yang tidak akan bekerja pada saat itu).

Neil
sumber
8 byte (kecuali input yang diinisialisasi tidak bekerja saat itu)
ASCII-only
@ Hanya ASCII. Mereka tidak bekerja dalam mode verbose ... mereka mungkin akan bekerja dalam mode ringkas, tapi saya suka tautan verbose.
Neil
0

Mathematica, 35 byte

20~CharacterRange~126~Complement~#&

Fungsi anonim. Mengambil daftar karakter sebagai input dan mengembalikan daftar karakter sebagai output.

LegionMammal978
sumber
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
Pengobrol
sumber
0

shortC , 33 byte

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

Konversi yang dilakukan dalam program ini:

  • A -> int main(int argc, char **argv) {
  • O -> for(
  • @ -> argv
  • P -> putchar
  • Penutupan yang dimasukkan secara otomatis ));}

Program yang dihasilkan terlihat seperti:

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

Cobalah online!

MD XF
sumber
0

Pyth , 17 byte

Vr32 127I!}CNzpCN

Pendekatan naif.

Penjelasan:

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

Uji secara online!

Jim
sumber
0

Clojure, 60 atau 49 byte

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

Ini "berlaku" membunuh saya: / Oh, jika mengembalikan daftar baik-baik saja maka ini sedikit lebih pendek.

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