不足している文字を印刷する


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

1
@MikhailV 、言語がASCII文字を出力できない場合のみ
-Skidsdev

回答:



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
14バイトになりました:ethproductions.github.io/japt/…–
シャギー

1
いいえ、あなたはそれを取り除いてくれます、トム-前に言ったように、私はより速く投稿することを学ぶ必要があります!:D-
シャギー

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

対称セットの違いは、2つの入力セットのいずれか1つに存在するすべての要素を提供します。(両方ではありません)入力セットは常に2番目のセット(すべて印刷可能な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

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はいつもそこにいましたか?最後のキャラクターが}私がこれを書いたときだったと誓ったかもしれません。今修正しました、ありがとう。
シャギー

特に私の使用を含める必要があるため、C#がJavaScriptより短いとは信じられません。
TheLethalCoder

1
@TheLethalCoder String.fromCharCodeはgitです、だからこそです!:D
シャギー

@Shaggy私は知らない、あなたのコードを見て、それがどのように機能するかを見て、キーボード上のすべての記号を文字通り入力し、~何も変わらないことに気付いたが、それは仕様にあった。また、「Try It」部分を更新する必要があります。
マリビル


3

オクターブ、22 20バイト

@Luis Mendoのおかげで2バイト節約できました。

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

オンラインでお試しください!

その他の答え:

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

オンラインでお試しください!


1
@(s)setxor(' ':'~',s)1バイトを節約
ルイスメンドー

@LuisMendoとても素敵!しかし、それは別のことだと思います。新しい回答として投稿することをお勧めします:)
rahnema1

1
いいえ、それは実際にはほんのわずかな改善です。必要に応じて投稿していただければ幸いです。BTWも機能して@(s)setxor(32:'~',s)いるようです---そして同じコメントがあります:
ルイスメンドー

1
@LuisMendoありがとう、(Luis)が言ったので同意します。
rahnema1

2

PHP、42バイト

配列として入力

文字列として出力

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

オンラインでお試しください!

PHP、53バイト

文字列として入力

文字列として出力

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

配列として出力<?=joinするprint_rために置き換えます

オンラインでお試しください!


たぶん、あなたはゴルフバージョンのPHPを作るべきです:P
CalculatorFeline

@CalculatorFelineそれは確かに存在しますが、実際には良くありません
ヨルグ・ヒュルサーマン

たぶん、あなたは良いものを作るべきです。ステップ1:自動開始タグ。
CalculatorFeline

@CalculatorFelineあなたのリンクを検索しました。github.com/barkermn01/PGP-php-CodeGolf私は1つを作るためには興味がない
イェルクHülsermann

1
@CalculatorFeline PHPをゴルフ言語にすることは、PHPでのゴルフの楽しさ(少なくとも私にとっては)を破壊します。ループ(さまざまな入力メソッドなど)を使用して、呼び出し関数(多くの場合長い名前)を絶えずバランスさせる必要があります。Step 1: automatic starting tagええとphp -r...しかし、例えばこの例でechoは、の長さよりも長いので、お金を払っていません<?=
クリストフ


2

Perl、39バイト

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

で実行しperl -peます。


私は、エラーメッセージが表示されます「裸の単語が見つかったところ、 『Y / Hello Worldの// DR!』に近い(evalの1)2行目で期待演算子、」私はこれを実行する...
クリス・

完全なコマンドライン:echo 'Hello World!' | perl -pe 's!.*!"pack(c95,32..126)=~y/$_//dr"!ee'。これは、Perl v5.14とv5.24の両方で機能します。
グリムミー

動作していないのはPerl v5.10です... 5.10と5.14の間で行われた変更である必要があります。
クリス

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

sSTDINから読み取ったり、関数の引数として提供したりする必要はありませんか?チャレンジは、入力が文字の配列として与えられることも指定します。安定したラムダに変換してドロップcharsすると、16バイトのソリューションが得られます。
canhascodez

入力が明示的に指定されていないことを考えると、入力がどのように扱われるかは本当にわかりませんでした。変数に入力が存在することを前提とする他の回答がいくつかあります。codegolf規約はありますか?私はこれをあまりしません。
マークトーマス

@sethrin安定したラムダでは20文字になりませんか?->(s){[*' '..?~]-s)}
マークトーマス

ラムダ内のすべての括弧はオプションです。しかし、バイトを誤ってカウントした可能性があります。他の言語は、暗黙的に入力を受け入れるかstdin、グローバル変数にバインドされています。Ruby $<のショートカットですstdinが、ラムダは短くなる傾向があります。入力と出力に関する規則はここにあります。私もこれをあまりしませんので、ルールが私が考えているものではない場合、私に知らせてください。
canhascodez

2

APL、13バイト

⍞~⍨⎕UCS31+⍳95

わかりやすい:

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


1

PHP、53バイト

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

でパイプとして実行し-rます。


遊び場はもうありません
ヨルクヒュルサーマン

@JörgHülsermannします。共有するだけです。
タイタス

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

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バイトで次の作業が行われました。

ØṖḟ

いいえ、何も見逃していません。
エリックアウトゴルファー

1

18 15 10 8バイト

Fγ¿¬№θιι

オンラインでお試しください!リンクは、コードの詳細バージョンです。編集:整数ではなく文字を範囲指定することで3バイトを保存しました。γ印刷可能なASCII文字を保持する文書化されていない変数を発見したとき、さらに5バイトを節約しました。詳細モードで@ASCIIのみの事前定義された入力を修正すると、さらに2バイトを節約しました(答えは今でも有効です。現時点では機能しなかったのは、オンラインリンクのみです)。


8バイト(プリ入力は当時働いていなかった場合を除く)
ASCIIのみの

@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

Clojure、60または49バイト

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

これらの「適用」は私を殺している:/ああ、もしリストを返すのが良いなら、これは少し短い。

#(sort(apply disj(set(map char(range 32 127)))%))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.