Imprimer les caractères manquants

18

Défi simple inspiré par la popularité de mes précédents textes invisibles imprimés et imprimés de vrais textes invisibles , et le même défi de chaîne de longueur différente .

Étant donné une chaîne composée uniquement de caractères imprimables ( 0x20 to 0x7E), imprimez chaque caractère imprimable non présent dans la chaîne.

Contribution

Une chaîne ou un tableau de caractères, composé uniquement de caractères ASCII imprimables

Production

Chaque caractère ASCII imprimable n'est pas présent dans la chaîne d'entrée, dans n'importe quel ordre.

Cas de test

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

Notation

C'est du golf de code donc le moins d'octets dans chaque langue gagne

Skidsdev
la source
Si vous retournez un tableau, pouvons-nous inclure des éléments vides à la place des caractères utilisés?
Shaggy
@Shaggy bien sûr, ça va
Skidsdev
@Rod ne dévoile pas mes plans D:
Skidsdev
La sortie peut-elle être un objet Set de chaînes de caractères? set( 'a', 'b', 'c' )
Brad Gilbert b2gills
1
@MikhailV uniquement si votre langue n'est pas en mesure de produire des caractères ASCII
Skidsdev

Réponses:

11

GS2 , 2 octets

ç7

Essayez-le en ligne!

Comment ça fonctionne

    (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
la source
6

Perl 6 , 29 octets

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

Notez que le résultat est aléatoire car les ensembles ne sont pas ordonnés.

Essaye-le

Étendu:

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

Il existe également une version ASCII de (-), mais elle nécessiterait un espace avant pour ne pas être analysée comme un appel de sous-routine.

Brad Gilbert b2gills
la source
6

Python 3.5 , 39 octets

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

Essayez-le en ligne!
Transforme l'entrée en un ensemble et le supprime de l'ensemble contenant tous les caractères ascii

Barre
la source
Cela fonctionne uniquement après Python 3.5.
Gábor Fekete
5

Japt , 14 octets

Ho#_dÃf@bX ¥J

Essayez-le en ligne!

4 octets enregistrés grâce à Shaggy et obarakon

À M
la source
1
Pas besoin de drapeau (voir réponse à mon commentaire sur la question). Remplacez 127par #pour enregistrer un octet et supprimez le Upour en enregistrer un autre.
Shaggy
1
Vous pouvez utiliser ¦et réorganiser vos arguments pour économiser quelques octets. Aussi, 127 peut être raccourci TIO
Oliver
1
Je l'ai
Shaggy
1
Non, tu t'en sors, Tom - comme tu l'as déjà dit, j'ai besoin d'apprendre à poster plus vite! : D
Shaggy
1
Une version à 10 octets mais malheureusement non compétitive: ethproductions.github.io/japt/…
Shaggy
4

Haskell, 32 octets

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

Essayez-le en ligne!

Fonction de bibliothèque ennuyeuse pour la différence définie:

Haskell, 31 octets

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

MATL , 5 octets

6Y2X~

Essayez-le en ligne!

Merci à Luis Mendo d'avoir joué au golf à 8 octets!

Explication:

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

La différence d'ensemble symétrique donnera chaque élément présent dans exactement l'un des deux ensembles d'entrée. (mais pas les deux) Cela donnera toujours la bonne réponse, car l'ensemble d'entrée sera toujours un sous-ensemble du deuxième ensemble (tous ASCII imprimables).

Version originale:

32:126tGom~)c

Explication:

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
la source
3

Brachylog , 5 octets

ẹ;Ṭ↔x

Essayez-le en ligne!

Explication

ẹ          Split the input string into a list of chars
 ;Ṭ↔x      Exterminate the chars from the string Ṭ of printable ASCII chars
Fatalize
la source
3

JavaScript (ES6), 74 octets

Je suis sûr qu'il existe un moyen plus court de le faire!

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

Essayez-le

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>

Hirsute
la source
1
Devrait être Array(95)d'inclure les disparus~
Malivil
C'était toujours là, @Malivil? }J'aurais juré que le dernier personnage était quand j'ai écrit ça. Fixé maintenant, merci.
Shaggy
Je ne peux pas croire que C # soit plus court que JavaScript pour cela, d'autant plus que je dois inclure mes utilisations.
TheLethalCoder
1
@TheLethalCoder, String.fromCharCodeest un git, c'est pourquoi! : D
Shaggy
@Shaggy Je ne sais pas, je regardais simplement votre code pour voir comment cela fonctionnait et j'ai tapé littéralement chaque symbole sur mon clavier et j'ai remarqué ~que rien ne changeait, sauf qu'il était dans la spécification. De plus, la partie "Try It" doit être mise à jour.
Malivil
3

Bash ,47 43 40 octets

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

Essayez-le en ligne!

Génère une plage hexa, inverse le vidage hexadécimal pour char et supprime les caractères présents dans le premier paramètre.

marcosm
la source
3

Octave, 22 20 octets

Merci à @Luis Mendo a sauvé 2 octets.

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

Essayez-le en ligne!

Autre réponse:

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

Essayez-le en ligne!

rahnema1
la source
1
@(s)setxor(' ':'~',s)enregistre 1 octet
Luis Mendo
@LuisMendo Very nice! Mais je pense que c'est autre chose. Je vous suggère de le poster comme une nouvelle réponse :)
rahnema1
1
Non, c'est vraiment juste une amélioration mineure. Je serai heureux que vous le publiiez si vous le souhaitez. BTW @(s)setxor(32:'~',s)semble aussi fonctionner --- et même commentaire pour cela :-)
Luis Mendo
1
@LuisMendo Merci, je suis d'accord parce que (Luis) a dit.
rahnema1
2

PHP, 42 octets

Entrée sous forme de tableau

Sortie sous forme de chaîne

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

Essayez-le en ligne!

PHP, 53 octets

Entrée sous forme de chaîne

Sortie sous forme de chaîne

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

remplacer <?=joinpar print_rpour une sortie en tant que tableau

Essayez-le en ligne!

Jörg Hülsermann
la source
Vous devriez peut-être faire une version golf de PHP: P
CalculatorFeline
@CalculatorFeline Je suis sûr que ça existe mais ce n'est pas vraiment bon
Jörg Hülsermann
Vous devriez peut-être en faire un bon. Étape 1: balise de démarrage automatique.
CalculatorFeline
@CalculatorFeline J'ai recherché le lien pour vous. github.com/barkermn01/PGP-php-CodeGolf Je n'ai aucun intérêt à en faire un
Jörg Hülsermann
1
@CalculatorFeline Faire de PHP un langage de golf détruit ce qui est amusant de jouer avec PHP (du moins pour moi): vous devez constamment équilibrer les fonctions d'appel (qui ont souvent des noms longs), l'utilisation de boucles, différentes méthodes d'entrée, etc. Step 1: automatic starting tagbien php -r... mais par exemple dans cet exemple, il ne paie pas parce que echoc'est plus long que <?=.
Christoph
2

CJam , 8 octets

'␡,32>q^

est un caractère de suppression littéral.

Essayez-le en ligne!

'␡,       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.
Chat d'affaires
la source
Tout comme une note, -fonctionne à la place de ^.
Esolanging Fruit
2

Perl, 39 octets

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

Courez avec perl -pe.

Grimmy
la source
J'obtiens le message d'erreur "Bareword trouvé là où l'opérateur s'attendait à (eval 1) ligne 2, près de" y / Hello World! // dr "'quand je lance ceci ...
Chris
Ligne de commande complète: echo 'Hello World!' | perl -pe 's!.*!"pack(c95,32..126)=~y/$_//dr"!ee'. Cela fonctionne pour moi sur Perl v5.14 et v5.24.
Grimmy
C'est Perl v5.10 qui ne fonctionne pas ... Ce doit être un changement entre 5.10 et 5.14.
Chris
2

brainfuck , 120 octets

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

Essayez-le en ligne!

Enveloppé:

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

Expliqué:

+[+[>+<+<]>]>-         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
]
Poignée de porte
la source
2

Ohm , 3 octets

α@─

Essayez-le en ligne!

Remarque: vous pouvez également saisir votre entrée sous forme de chaîne ( exemple ), mais elle échoue pour le cas d'entrée vide.

FrodCube
la source
2

Rubis, 23 18 17 octets

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

Utilise une fonction lambda selon les commentaires de @ sethrin.

Versions précédentes:

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

(' '..'~').to_a-s.chars
Mark Thomas
la source
Ne doit-il pas sêtre lu à partir de STDIN ou fourni comme argument de fonction? Le défi spécifie également que l'entrée peut être donnée sous forme de tableau de caractères. La conversion en lambda stabby et la suppression charsdonne une solution à 16 octets.
canhascodez
Je n'étais pas vraiment sûr de la façon dont l'entrée devait être adressée, étant donné qu'elle n'était pas explicitement spécifiée. Il y a quelques autres réponses qui supposent l'existence de l'entrée dans une variable. Existe-t-il une convention de codegolf? Je ne fais pas grand chose.
Mark Thomas
@sethrin Avec une lambda stabby, ne serait-ce pas 20 caractères? ->(s){[*' '..?~]-s)}
Mark Thomas
Toutes les parenthèses de votre lambda sont facultatives. Mais j'ai peut-être mal compté un octet. D'autres langues acceptent implicitement l'entrée ou sont stdinliées à une variable globale. En Ruby $<est un raccourci pour stdinmais les lambdas ont tendance à être plus courts. Les conventions d'entrée et de sortie sont ici . Je ne fais pas non plus beaucoup de choses, donc si les règles ne sont pas ce que je pense, faites le moi savoir.
canhascodez
2

APL, 13 octets

⍞~⍨⎕UCS31+⍳95

Simple:

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

R , 50 octets

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

renvoie une fonction anonyme. Convertit la chaîne d'entrée en nombres entiers, calcule la différence définie entre la plage imprimable et les valeurs d'entrée, puis les reconvertit en chaîne et la renvoie.

Essayez-le en ligne!

Giuseppe
la source
1

PHP, 53 octets

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

Exécuter en tant que tuyau avec -r.

Titus
la source
Je n'ai plus de terrain de jeu
Jörg Hülsermann
@ JörgHülsermann Oui. Vous n'avez qu'à le partager.
Titus
1

C #, 74 71 octets

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

Ancienne version avec création d'une plage de 74 octets:

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

05AB1E , 5 4 octets

-1 grâce à Emigna

žQsK

Essayez-le en ligne!

ž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
la source
@FrodCube Oups ... J'ai oublié de mettre à jour le lien. Ça devrait marcher maintenant. TIO (entrée vide)
Riley
1

V , 20 octets

òiÎflax
òcH ¬ ~@"<

Essayez-le en ligne!

Hexdump:

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

C (gcc) , 75 72 70 68 50 octets

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

Essayez-le en ligne!

cleblanc
la source
Pouvez-vous utiliser ||pour faire ce travail sur C "standard"?
Neil
@Neil Oui || fonctionne également. N'est-ce pas?: Fait partie du C "standard"?
cleblanc
J'ai toujours pensé que c'était une extension gcc.
Neil
@Neil C'est exact. ?:est une extension GNU. Cela fonctionne aussi bien en clang qu'en tcc.
Dennis
1

Gelée , 8 octets

Vraiment, 8 octets? S'il vous plaît, dites-moi que j'ai raté quelque chose!

32r126Ọḟ

Essayez-le en ligne!

Comment?

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

Alternativement

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

Depuis ce défi, un nouvel atome qui produit tous les caractères ASCII imprimables ØṖ, a été introduit, ce qui rend le travail suivant sur 3 octets:

ØṖḟ
Jonathan Allan
la source
Non, vous n'avez rien manqué.
Erik the Outgolfer
1

Fusain , 18 15 10 8 octets

Fγ¿¬№θιι

Essayez-le en ligne! Le lien est vers la version détaillée du code. Modifier: enregistré 3 octets en s'étendant sur des caractères au lieu d'entiers. J'ai enregistré 5 octets supplémentaires lorsque j'ai découvert la γvariable non documentée qui contient les caractères ASCII imprimables. Enregistré 2 octets supplémentaires lorsque @ ASCII uniquement des entrées prédéfinies fixes en mode prolixe (la réponse est toujours valable en l'état, ce n'est que le lien d'essayer en ligne qui n'aurait pas fonctionné à l'époque).

Neil
la source
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.

LegionMammal978
la source
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
Blab
la source
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!

MD XF
la source
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!

Jim
la source
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)))%))
NikoNyrh
la source