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


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.

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.



5

Japt , 14 bytes

Ho#_dÃf@bX ¥J

Pruébalo en línea!

Guardado 4 bytes gracias a Shaggy y Obarakon


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
([' '..'~']\\)

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


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>


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.


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!


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!


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.

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.


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
]


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

¿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.

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!


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.


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



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!


¿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:

ØṖḟ

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


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.


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

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!


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!


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)))%))
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.