Imprime los caracteres faltantes

18

Desafío simple inspirado en la popularidad de mi impresión anterior de texto invisible e impresión de desafíos de texto invisible real , y el mismo desafío de cadena diferente .

Dada una cadena que consta de solo caracteres imprimibles ( 0x20 to 0x7E), imprima todos los caracteres imprimibles que no estén presentes en la cadena.

Entrada

Una cadena o conjunto de caracteres, que consta de solo caracteres ASCII imprimibles

Salida

Todos los caracteres ASCII imprimibles no están presentes en la cadena de entrada, en ningún orden.

Casos de prueba

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

Puntuación

Este es el código de golf, por lo que gana menos bytes en cada idioma

Skidsdev
fuente
Si devuelve una matriz, ¿podemos incluir elementos vacíos en lugar de los caracteres utilizados?
Shaggy
@Shaggy seguro, está bien
Skidsdev
@ Rod no pierde mis planes D:
Skidsdev
¿Puede la salida ser un objeto Set de cadenas de caracteres? set( 'a', 'b', 'c' )
Brad Gilbert b2gills
1
@MikhailV solo si su idioma no puede generar caracteres ASCII
Skidsdev

Respuestas:

11

GS2 , 2 bytes

ç7

Pruébalo en línea!

Cómo funciona

    (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
fuente
6

Perl 6 , 29 bytes

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

Tenga en cuenta que el resultado es aleatorio porque los conjuntos s no están ordenados.

Pruébalo

Expandido:

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

También hay una versión ASCII de (-), pero requeriría un espacio antes para que no se analice como una llamada de subrutina.

Brad Gilbert b2gills
fuente
6

Python 3.5 , 39 bytes

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

Pruébalo en línea!
Convierte la entrada en un conjunto y la elimina del conjunto que contiene todos los caracteres ascii.

varilla
fuente
Esto funciona solo después de Python 3.5.
Gábor Fekete
5

Japt , 14 bytes

Ho#_dÃf@bX ¥J

Pruébalo en línea!

Guardado 4 bytes gracias a Shaggy y Obarakon

Tom
fuente
1
No hay necesidad de la bandera (ver respuesta a mi comentario sobre la pregunta). Reemplace 127con #para guardar un byte y elimine Upara guardar otro.
Shaggy
1
Puede usar ¦y reorganizar sus argumentos para guardar algunos bytes. Además, 127 se puede acortar TIO
Oliver
1
Lo bajé a 14 bytes: ethproductions.github.io/japt/…
Shaggy
1
No, trabajas con eso, Tom. Como dijiste antes, ¡necesito aprender a publicar más rápido! : D
Shaggy
1
Una versión de 10 bytes pero desafortunadamente no compite: ethproductions.github.io/japt/…
Shaggy
4

Haskell, 32 bytes

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

Pruébalo en línea!

Función de biblioteca aburrida para establecer la diferencia:

Haskell, 31 bytes

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

MATL , 5 bytes

6Y2X~

Pruébalo en línea!

¡Gracias a Luis Mendo por jugar 8 bytes de descuento!

Explicación:

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

La diferencia de conjunto simétrico dará a cada elemento presente en exactamente uno de los dos conjuntos de entrada. (pero no ambos) Esto siempre dará la respuesta correcta, ya que el conjunto de entrada siempre será un subconjunto del segundo conjunto (todo ASCII imprimible).

Versión original:

32:126tGom~)c

Explicación:

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
fuente
3

Brachylog , 5 bytes

ẹ;Ṭ↔x

Pruébalo en línea!

Explicación

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

JavaScript (ES6), 74 bytes

¡Estoy seguro de que hay una forma más corta de hacer esto!

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

Intentalo

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>

Lanudo
fuente
1
Debería Array(95)incluir a los desaparecidos~
Malivil
¿Siempre estuvo ahí, @Malivil? Podría haber jurado que el último personaje fue }cuando escribí esto. Solucionado ahora, gracias.
Shaggy
No puedo creer que C # sea más corto que JavaScript para esto, especialmente porque tengo que incluir mis usos.
TheLethalCoder
1
@TheLethalCoder, String.fromCharCodees un imbécil, ¡por eso! : D
Shaggy
@Shaggy No lo sé, solo estaba mirando tu código para ver cómo funcionaba y escribí literalmente cada símbolo en mi teclado y noté ~que no cambiaba nada, excepto que estaba en la especificación. Además, la parte "Pruébelo" debe actualizarse.
Malivil
3

Bash ,47 43 40 bytes

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

Pruébalo en línea!

Genera rango hexa, invierte el volcado hexadecimal para eliminar caracteres eliminados presentes en el primer parámetro.

marcom
fuente
3

Octava, 22 20 bytes

Gracias a @Luis Mendo ahorró 2 bytes.

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

Pruébalo en línea!

Otra respuesta:

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

Pruébalo en línea!

rahnema1
fuente
1
@(s)setxor(' ':'~',s)ahorra 1 byte
Luis Mendo
@LuisMendo ¡Muy bien! Pero creo que eso es algo diferente. Sugiero que lo publiques como una nueva respuesta :)
rahnema1
1
No, en realidad es solo una mejora menor. Me alegrará que lo publiques si quieres. Por cierto, @(s)setxor(32:'~',s)parece funcionar también --- y el mismo comentario para eso :-)
Luis Mendo
1
@LuisMendo Gracias, estoy de acuerdo porque (Luis) dijo.
rahnema1
2

PHP, 42 bytes

Entrada como matriz

Salida como cadena

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

Pruébalo en línea!

PHP, 53 bytes

Entrada como cadena

Salida como cadena

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

reemplazar <?=joincon print_runa salida como matriz

Pruébalo en línea!

Jörg Hülsermann
fuente
Tal vez debería hacer una versión de golf de PHP: P
CalculatorFeline
@CalculatorFeline Estoy seguro de que existe pero no es realmente bueno
Jörg Hülsermann
Tal vez deberías hacer una buena. Paso 1: etiqueta de inicio automático.
CalculatorFeline
@CalculatorFeline He buscado el enlace por ti. github.com/barkermn01/PGP-php-CodeGolf No tengo interés en hacer uno
Jörg Hülsermann
1
@CalculatorFeline Hacer de PHP un lenguaje de golf destruye lo divertido de jugar golf con PHP (al menos para mí): tienes que equilibrar constantemente las funciones de llamada (que a menudo tienen nombres largos), el uso de bucles, diferentes métodos de entrada, etc. Step 1: automatic starting tagbueno php -r... pero por ejemplo, en este ejemplo no paga porque echoes más largo que <?=.
Christoph
2

CJam , 8 bytes

'␡,32>q^

Donde es un carácter de eliminación literal.

Pruébalo en línea!

'␡,       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.
Gato de negocios
fuente
Solo como una nota, -funciona en lugar de ^.
Esolanging Fruit
2

Perl, 39 bytes

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

Corre con perl -pe.

Mugriento
fuente
Recibo el mensaje de error 'Bareword encontrado donde el operador esperaba en (eval 1) línea 2, cerca de "y / Hello World! // dr"' cuando ejecuto esto ...
Chris
Línea de comando completa: echo 'Hello World!' | perl -pe 's!.*!"pack(c95,32..126)=~y/$_//dr"!ee' . Esto funciona para mí en Perl v5.14 y v5.24.
Grimmy
Es Perl v5.10 que no funciona ... Debe haber un cambio realizado entre 5.10 y 5.14.
Chris
2

brainfuck , 120 bytes

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

Pruébalo en línea!

Envuelto:

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

Explicado:

+[+[>+<+<]>]>-         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
]
Pomo de la puerta
fuente
2

Ruby, 23 18 17 bytes

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

Utiliza una función lambda según los comentarios de @ sethrin.

Versión anterior:

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

(' '..'~').to_a-s.chars
Mark Thomas
fuente
¿No stiene que leerse desde STDIN o suministrarse como un argumento de función? El desafío también especifica que la entrada se puede dar como una matriz de caracteres. La conversión a una lambda stabby y la caída charsproporciona una solución de 16 bytes.
canhascodez
No estaba realmente seguro de cómo se abordaría la entrada, dado que no se especificó explícitamente. Hay algunas otras respuestas que suponen la existencia de la entrada en una variable. ¿Hay una convención de codegolf? No hago mucho esto.
Mark Thomas
@sethrin Con una lambda stabby, ¿no serían 20 caracteres? ->(s){[*' '..?~]-s)}
Mark Thomas
Todos los paréntesis en su lambda son opcionales. Pero puedo haber contado mal un byte. Otros idiomas aceptan entrada implícitamente o se han stdinvinculado a una variable global. En Ruby $<es un atajo para stdinpero las lambdas tienden a ser más cortas. Las convenciones sobre entrada y salida están aquí . Tampoco hago mucho, así que si las reglas no son lo que creo, hágamelo saber.
canhascodez
2

APL, 13 bytes

⍞~⍨⎕UCS31+⍳95

Sencillo:

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

R , 50 bytes

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

devuelve una función anónima Convierte la cadena de entrada en enteros, calcula la diferencia establecida entre el rango imprimible y los valores de entrada, y luego los vuelve a convertir en una cadena y la devuelve.

Pruébalo en línea!

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

Ejecutar como tubería con -r.

Tito
fuente
No he dejado más juegos infantiles
Jörg Hülsermann
@ JörgHülsermann Lo haces. Solo tienes que compartirlo.
Titus
1

C #, 74 71 bytes

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

Versión antigua con la creación de un rango de 74 bytes:

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

05AB1E , 5 4 bytes

-1 gracias a Emigna

žQsK

Pruébalo en línea!

ž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
fuente
@FrodCube ¡Vaya! Olvidé actualizar el enlace. Debería funcionar ahora. TIO (entrada vacía)
Riley
1

V , 20 bytes

òiÎflax
òcH ¬ ~@"<

Pruébalo en línea!

Hexdump:

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

C (gcc) , 75 72 70 68 50 bytes

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

Pruébalo en línea!

cleblanc
fuente
¿Se puede utilizar ||para hacer que esto funcione en "estándar" C?
Neil
@Neil Sí || También funciona. ¿No es así: parte de la "norma" C?
cleblanc
Siempre pensé que era una extensión de gcc.
Neil
@Neil Eso es correcto. ?:es una extensión de GNU. Sin embargo, funciona tan bien en clang y tcc.
Dennis
1

Jalea , 8 bytes

¿De verdad, 8 bytes? ¡Por favor, dime que me perdí algo!

32r126Ọḟ

Pruébalo en línea!

¿Cómo?

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

Alternativamente

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

Desde este desafío ØṖ, se ha introducido un nuevo átomo que produce todos los caracteres ASCII imprimibles, haciendo que el siguiente trabajo para 3 bytes:

ØṖḟ
Jonathan Allan
fuente
No, no te perdiste nada.
Erik the Outgolfer
1

Carbón , 18 15 10 8 bytes

Fγ¿¬№θιι

Pruébalo en línea! El enlace es a la versión detallada del código. Editar: guardado 3 bytes al pasar por caracteres en lugar de enteros. Guarde otros 5 bytes cuando descubrí la γvariable indocumentada que contiene los caracteres ASCII imprimibles. Se guardaron otros 2 bytes cuando @ ASCII solo fijó entradas predefinidas en modo detallado (la respuesta sigue siendo válida en su estado actual, es solo el enlace en línea probarlo que no hubiera funcionado en ese momento).

Neil
fuente
8 bytes (a menos que las entradas preinicializadas no funcionaran en ese momento)
Solo ASCII
@ Solo ASCII No funcionaban en modo detallado ... probablemente habrían funcionado en modo sucinto, pero me gustan los enlaces detallados.
Neil
0

Mathematica, 35 bytes

20~CharacterRange~126~Complement~#&

Función anónima. Toma una lista de caracteres como entrada y devuelve una lista de caracteres como salida.

LegionMammal978
fuente
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
Cotilla
fuente
0

shortC , 33 bytes

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

Conversiones realizadas en este programa:

  • A -> int main(int argc, char **argv) {
  • O -> for(
  • @ -> argv
  • P -> putchar
  • Cierre de inserción automática ));}

El programa resultante se ve así:

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

Pruébalo en línea!

MD XF
fuente
0

Pyth , 17 bytes

Vr32 127I!}CNzpCN

El enfoque ingenuo.

Explicación:

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

¡Pruébalo en línea!

Jim
fuente
0

Clojure, 60 o 49 bytes

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

Estas "solicitudes" me están matando: / Oh, si devolver una lista está bien, entonces esto es un poco más corto.

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