Gib die fehlenden Zeichen aus


18

Einfache Herausforderung, inspiriert von der Popularität meines vorherigen Drucks von unsichtbarem Text und Drucke echte unsichtbare Textherausforderungen und die gleiche Länge unterschiedlicher Zeichenfolgenherausforderung .

Bei einer Zeichenfolge, die nur aus druckbaren Zeichen ( 0x20 to 0x7E) besteht, wird jedes druckbare Zeichen gedruckt, das nicht in der Zeichenfolge enthalten ist.

Eingang

Eine Zeichenfolge oder ein Zeichenfeld, das nur aus druckbaren ASCII-Zeichen besteht

Ausgabe

Jedes druckbare ASCII-Zeichen, das nicht in der Eingabezeichenfolge enthalten ist, in beliebiger Reihenfolge.

Testfälle

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

Wertung

Dies ist Code-Golf, so dass die wenigsten Bytes in jeder Sprache gewinnen


Können bei der Rückgabe eines Arrays leere Elemente anstelle der verwendeten Zeichen eingefügt werden?
Shaggy

@ Shaggy sicher, das ist in Ordnung
Skidsdev

@ Rod leckt nicht meine Pläne D:
Skidsdev

Kann die Ausgabe ein Set- Objekt von Zeichenketten sein? set( 'a', 'b', 'c' )
Brad Gilbert b2gills

1
@MikhailV nur, wenn Ihre Sprache keine ASCII-Zeichen ausgeben kann
Skidsdev

Antworten:


11

GS2 , 2 Bytes

ç7

Probieren Sie es online!

Wie es funktioniert

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

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

Beachten Sie, dass das Ergebnis zufällig ist, da Mengen ungeordnet sind.

Probier es aus

Erweitert:

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

Es gibt auch eine ASCII-Version von (-), die jedoch ein Leerzeichen benötigt, damit sie nicht als Unterprogrammaufruf analysiert wird.



5

Japt , 14 Bytes

Ho#_dÃf@bX ¥J

Probieren Sie es online!

4 Bytes dank Shaggy und Obarakon gespeichert


1
Keine Notwendigkeit für die Flagge (siehe Antwort auf meinen Kommentar zu der Frage). Ersetzen Sie 127mit #, um ein Byte zu speichern, und entfernen Sie das U, um ein anderes zu speichern.
Shaggy

1
Sie können ¦Ihre Argumente verwenden und neu anordnen, um einige Bytes zu sparen. 127 kann auch gekürzt werden TIO
Oliver

1
Auf 14 Bytes reduziert
Shaggy

1
Nein, du arbeitest dran, Tom - wie du schon sagtest, ich muss lernen, schneller zu posten! : D
Shaggy

1
Eine 10-Byte-Version, aber leider nicht konkurrierend: ethproductions.github.io/japt/…
Shaggy

4

Haskell, 32 Bytes

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

Probieren Sie es online!

Langweilige Bibliotheksfunktion für die eingestellte Differenz:

Haskell, 31 Bytes

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

4

MATL , 5 Bytes

6Y2X~

Probieren Sie es online!

Danke an Luis Mendo für das Golfen mit 8 Bytes!

Erläuterung:

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

Die symmetrische Satzdifferenz gibt jedes Element an, das in genau einem der beiden Eingabesätze vorhanden ist. (aber nicht beides) Dies gibt immer die richtige Antwort, da die Eingabemenge immer eine Teilmenge der zweiten Menge ist (alles druckbare ASCII).

Originalfassung:

32:126tGom~)c

Erläuterung:

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

Ich bin mir sicher, dass es dafür einen kürzeren Weg gibt!

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

Versuch es

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
Sollte Array(95)die vermisste enthalten sein~
Malivil

War das immer da, @Malivil? Hätte schwören können, dass der letzte Charakter war, }als ich das geschrieben habe. Jetzt behoben, danke.
Shaggy

Ich kann nicht glauben, dass C # dafür kürzer ist als JavaScript, zumal ich meine Verwendungen einbeziehen muss.
TheLethalCoder

1
@TheLethalCoder, String.fromCharCodeist ein Idiot, deshalb! : D
Shaggy

@Shaggy Ich weiß nicht, ich habe nur auf Ihren Code geschaut, um zu sehen, wie er funktioniert. Ich habe buchstäblich jedes Symbol auf meiner Tastatur eingegeben und festgestellt, dass ~sich nichts geändert hat, außer dass es in der Spezifikation enthalten war. Außerdem muss der Teil "Try It" aktualisiert werden.
Malivil

3

Bash ,47 43 40 Bytes

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

Probieren Sie es online!

Erzeugt einen Hexa-Bereich, invertiert das Hexa-Dump in ein Zeichen und entfernt Zeichen, die im ersten Parameter enthalten sind.


3

Oktave, 22 bis 20 Bytes

Dank @Luis hat Mendo 2 Bytes gespart.

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

Probieren Sie es online!

Andere Antwort:

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

Probieren Sie es online!


1
@(s)setxor(' ':'~',s)speichert 1 Byte
Luis Mendo

@ LuisMendo Sehr schön! Aber ich denke, das ist etwas anderes. Ich schlage vor, dass Sie es als neue Antwort
posten

1
Nein, es ist wirklich nur eine kleine Verbesserung. Ich freue mich, dass Sie es posten, wenn Sie wollen. BTW @(s)setxor(32:'~',s)scheint auch zu funktionieren --- und der gleiche Kommentar dafür :-)
Luis Mendo

1
@ LuisMendo Danke, ich stimme zu, weil (Luis) sagte.
rahnema1

2

PHP, 42 Bytes

Eingabe als Array

Ausgabe als String

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

Probieren Sie es online!

PHP, 53 Bytes

Eingabe als String

Ausgabe als String

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

Ersetzen Sie <?=joinmit print_rfür eine Ausgabe als Array

Probieren Sie es online!


Vielleicht solltest du eine Golfversion von PHP machen: P
CalculatorFeline

@CalculatorFeline Ich bin mir sicher, dass es das gibt, aber es ist nicht wirklich gut
Jörg Hülsermann

Vielleicht solltest du einen guten machen. Schritt 1: Automatische Startmarke.
CalculatorFeline

@ CalculatorFeline Ich habe den Link für Sie suchen. github.com/barkermn01/PGP-php-CodeGolf Ich habe kein Interesse daran, einen zu machen
Jörg Hülsermann

1
@CalculatorFeline Wenn Sie PHP zu einer Golfsprache machen, wird der Spaß am Golfspielen mit PHP zunichte gemacht (zumindest für mich): Sie müssen ständig zwischen aufrufenden Funktionen (die oft lange Namen haben), Schleifen, verschiedenen Eingabemethoden usw. abwägen. Step 1: automatic starting tagna php -rja ... aber zB in diesem Beispiel zahlt es sich nicht aus, weil echoes länger ist als <?=.
Christoph


2

Perl, 39 Bytes

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

Laufen Sie mit perl -pe.


Ich erhalte die Fehlermeldung "Bareword gefunden, wo der Operator bei (eval 1) Zeile 2 erwartet, in der Nähe von" y / Hello World! // dr "", wenn ich dies ausführe ...
Chris

Volle Befehlszeile: echo 'Hello World!' | perl -pe 's!.*!"pack(c95,32..126)=~y/$_//dr"!ee'. Dies funktioniert sowohl für Perl v5.14 als auch für Perl v5.24.
Grimmy

Es ist Perl v5.10, das nicht funktioniert ... Muss eine Änderung zwischen 5.10 und 5.14 sein.
Chris

2

Brainfuck , 120 Bytes

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

Probieren Sie es online!

Gewickelt:

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

Erklärt:

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

Rubin, 23 18 17 Bytes

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

Verwendet eine Lambda-Funktion gemäß @ sethrins Kommentaren.

Vorherige Versionen:

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

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

Muss nicht sentweder aus STDIN gelesen oder als Funktionsargument angegeben werden? Die Abfrage gibt auch an, dass die Eingabe als Array von Zeichen angegeben werden kann. Das Umwandeln in ein Stabby-Lambda und das Fallenlassen charsergibt eine 16-Byte-Lösung.
canhascodez

Ich war mir nicht sicher, wie der Input angesprochen werden sollte, da er nicht explizit spezifiziert wurde. Es gibt einige andere Antworten, bei denen davon ausgegangen wird, dass die Eingabe in einer Variablen vorhanden ist. Gibt es eine Codegolf-Konvention? Ich mache nicht so viel.
Mark Thomas

@sethrin Mit einem Stabby Lambda wären es nicht 20 Zeichen? ->(s){[*' '..?~]-s)}
Mark Thomas

Alle Klammern in Ihrem Lambda sind optional. Aber ich habe vielleicht ein Byte falsch gezählt. Andere Sprachen akzeptieren entweder implizit Eingaben oder sind stdinan eine globale Variable gebunden. In Ruby $<ist eine Abkürzung dafür, stdinaber Lambdas neigen dazu, kürzer zu sein. Die Konventionen zur Ein- und Ausgabe finden Sie hier . Ich mache auch nicht so viel, also lass es mich wissen, wenn die Regeln nicht meinen Vorstellungen entsprechen.
canhascodez

2

APL, 13 Bytes

⍞~⍨⎕UCS31+⍳95

Einfach:

       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)))

Gibt eine anonyme Funktion zurück. Konvertiert die Eingabezeichenfolge in Ganzzahlen, berechnet die eingestellte Differenz zwischen dem druckbaren Bereich und den Eingabewerten und konvertiert sie dann zurück in eine Zeichenfolge und gibt sie zurück.

Probieren Sie es 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);

Als Rohr mit laufen lassen -r.


Ich habe keinen Spielplatz mehr verlassen
Jörg Hülsermann

@ JörgHülsermann Das tust du. Sie müssen es nur teilen.
Titus

1

C #, 74 71 Bytes

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

Alte Version mit einem Bereich für 74 Bytes:

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



1

C (GCC) , 75 72 70 68 50 Bytes

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

Probieren Sie es online!


Können Sie verwenden ||, um diese Arbeit auf "Standard" C zu machen?
Neil

@Neil Ja || funktioniert auch. Ist nicht?: Teil von "Standard" C?
Cleblanc

Ich dachte immer, es sei eine GCC-Erweiterung.
Neil

@Neil Das stimmt. ?:ist eine GNU-Erweiterung. Es funktioniert aber auch in clang und tcc.
Dennis

1

Gelee , 8 Bytes

Wirklich 8 Bytes? Bitte sag mir, dass ich etwas verpasst habe!

32r126Ọḟ

Probieren Sie es online!

Wie?

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

Alternative

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

Seit dieser Herausforderung wurde ein neues Atom eingeführt, das alle druckbaren ASCII-Zeichen liefert. ØṖDamit funktioniert Folgendes für 3 Bytes:

ØṖḟ

Nein, du hast nichts verpasst.
Erik der Outgolfer

1

Kohle , 18 15 10 8 Bytes

Fγ¿¬№θιι

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Bearbeiten: Speichert 3 Bytes, indem Zeichen anstelle von ganzen Zahlen überstrichen werden. Weitere 5 Bytes wurden gespeichert, als ich die undokumentierte γVariable entdeckte, die die druckbaren ASCII-Zeichen enthält. Weitere 2 Bytes wurden gespeichert, wenn @ ASCII-only vordefinierte Eingaben im ausführlichen Modus festlegte.


8 Bytes (es sei denn, die vorinitialisierten Eingaben funktionierten damals nicht)
Nur ASCII

@ Nur ASCII Sie haben nicht im ausführlichen Modus gearbeitet ... sie hätten wahrscheinlich im kompakten Modus gearbeitet, aber ich mag die ausführlichen Links.
Neil

0

Mathematica, 35 Bytes

20~CharacterRange~126~Complement~#&

Anonyme Funktion. Nimmt eine Liste von Zeichen als Eingabe und gibt eine Liste von Zeichen als Ausgabe zurück.


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

In diesem Programm vorgenommene Konvertierungen:

  • A -> int main(int argc, char **argv) {
  • O -> for(
  • @ -> argv
  • P -> putchar
  • Automatisch eingefügtes Schließen ));}

Das resultierende Programm sieht folgendermaßen aus:

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

Probieren Sie es online!


0

Pyth , 17 Bytes

Vr32 127I!}CNzpCN

Der naive Ansatz.

Erläuterung:

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

Online testen!


0

Clojure, 60 oder 49 Bytes

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

Diese "Apply" s bringen mich um: / Oh, wenn es in Ordnung ist, eine Liste zurückzugeben, ist dies etwas kürzer.

#(sort(apply disj(set(map char(range 32 127)))%))
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.