Copié mi contraseña al portapapeles! ¿Puedes borrarlo?

96

Siguiendo las mejores prácticas de seguridad , mantengo un archivo de texto sin formato con mis contraseñas en mi disco duro. De hecho, acabo de copiar y pegar uno de ellos para acceder a mi cuenta PPCG.

En un momento lúcido, decido que es mejor que la contraseña no permanezca en el portapapeles después de su uso. Como esto me sucede a menudo, podría usar un programa para eliminar el contenido del portapapeles.

Desafío

Escriba un programa o función que elimine o sobrescriba cualquier texto contenido en el portapapeles, utilizando un lenguaje de programación de su elección.

Detalles adicionales:

  • Si su sistema tiene varios portapapeles, puede escribir el programa para cualquiera de ellos. El único requisito es que el usuario deba poder copiar y pegar texto usando ese portapapeles.

  • Si su portapapeles mantiene un historial de entradas copiadas recientes, asuma la entrada más reciente.

  • Si su respuesta es específica de un sistema operativo o portapapeles, indíquelo en el título de su publicación, junto con el idioma utilizado.

  • Se garantiza que el portapapeles contendrá texto cuando se ejecute su programa. Puede eliminar el contenido del portapapeles o sobrescribirlo con otra cosa (no necesariamente texto). El único requisito es que después de ejecutar el programa, pegar desde el portapapeles no producirá el texto original.

  • Si elige sobrescribir con un texto fijo o elegido al azar, puede suponer que el contenido del portapapeles anterior es diferente de ese texto, por lo que la contraseña se elimina de manera efectiva. En otras palabras, ignore la posibilidad de que el texto de relleno coincida con la contraseña.

  • El programa no debería tener efectos secundarios como reiniciar el sistema, cerrar programas, apagar la computadora o congelarla. Después de ejecutar su programa, el usuario debe poder seguir usando la computadora de manera normal, solo con la contraseña eliminada del portapapeles. Además, las lagunas estándar están prohibidas.

El código más corto en bytes gana.

Luis Mendo
fuente
¿Qué pasa si el portapapeles tiene un número indeterminado de entradas?
LarsW
20
En una nota más seria: use algo como keepass para hacer eso por usted.
falla
17
"No tenga en cuenta la posibilidad de que el texto de relleno coincida con la contraseña". Solución: ``, 0 bytes. Sobrescribe la contraseña consigo misma.
Esolanging Fruit
2
@ Challenger5 pero eso es solo si elige sobrescribir con un texto fijo o elegido al azar
Luis Mendo
11
La peor parte de esta pregunta es que puedo relacionarme completamente con la historia de introducción a pesar de saber que es satírica. ... entonces, keepass, ¿eh? Debería investigar eso ...
Nat

Respuestas:

14

Excel, 1 pulsación de tecla

Ctrl-C

Funciona porque Excel, de manera única, siempre tiene una selección. Probablemente también funcione en otras aplicaciones de hoja de cálculo. A diferencia de las otras entradas de broma, las respuestas de Excel son en realidad algo frecuentes en PPCG.

Adán
fuente
2
¿No son estas 2 pulsaciones de teclas? "Una pulsación de tecla es una sola pulsación de una tecla en un teclado. Cada pulsación de tecla es una pulsación de tecla". computerhope.com/jargon/k/keystroke.htm
Martijn
@Martijn Posiblemente. Acabo de copiar de aquí .
Adám
No estoy seguro de que sea realmente válido puntuar presionando teclas. Además, como usted dice A diferencia de las otras entradas de broma , interpreto que, como admite, esta no es una respuesta realmente válida. Entonces no lo aceptaré aunque sea el más corto. Si puede señalarme alguna meta-publicación relevante que establezca la validez de las pulsaciones de teclas como método de puntuación, aceptaré con gusto esta presentación
Luis Mendo
@LuisMendo Su análisis entre líneas es correcto, pero ahora que realmente me tomé el tiempo de investigar Meta: codegolf.meta.stackexchange.com/a/4817/43319 parece indicar que es aceptable, en lugar de "Windows" que no es un editor.
Adám
@ Adám Entiendo que esa meta-publicación se refiere a una hipotética categoría de desafío de "editor de golf" , no al uso de la cantidad de pulsaciones de teclas como método de puntuación para los desafíos de "código de golf". Le puse el pomo a Dennis para saber su opinión
Luis Mendo
123

PowerShell, 3 bytes

scb

Ese es un alias predeterminado para Set-Clipboard. Cuando se llama sin nada entubado y sin argumentos suministrados, elimina el contenido actual del portapapeles.

Ben N
fuente
23
La respuesta más corta que en realidad borra el portapapeles en lugar de establecerlo en una nueva línea o algo que no esté en blanco.
Luna
1
Esto esta muy bien.
beppe9000
72

Vim, 3 bytes

"*Y

Establece el contenido del portapapeles en una nueva línea.

Por defecto, vim abre un búfer vacío al inicio. Ahora el programa Yanks (copia) toda la línea (incluida una nueva línea) y la almacena en su portapapeles tirando el texto en el registro "*. Se *puede cambiar a a +para el otro portapapeles.

Kritixi Lithos
fuente
66
Aaargh, ¡solo iba a publicar esta respuesta! +1, herramienta adecuada para el trabajo. :)
DJMcMayhem
Si hay más instalaciones de vim que de powershell, esta debería ser la respuesta aceptada sobre la base de "Universalidad";)
JPCF
1
@JPCF y hay muchas más aplicaciones 'reales' escritas en C # que coffeescript, etc. No hace que una sea mejor que la otra cuando se trata de code-golf
Baldrickk
1
Dudo que haya más instalaciones de vim que PowerShell, ya que está instalado de forma predeterminada en Windows 8 y versiones posteriores.
Robert Fraser
56

Javascript (Chrome DevTools Console), 6 bytes

copy``

Tenga en cuenta que esta es una característica de la consola (que también funciona en la consola FF) y no forma parte del estándar de idioma.

SuperJedi224
fuente
3
Huh, no sabía que JS tenía esta función. Funciona en Firefox también. (El contenido del portapapeles se convierte [\n ""\n])
ETHproductions
1
Puede confirmar esto también en Chrome. El portapapeles cambia a:[\n ""\n ]
haykam
32
@ETHproductions En realidad, esta función realmente no existe en JS. Esta es una consola incorporada. (Lo que no invalida la respuesta. Pero tal vez debería explicarse más explícitamente).
Arnauld
Bueno, ¿no existe Document.execCommand("copy")o es un portapapeles interno al navegador? Lo uso en algunos scripts de mono de manipulación, pero demasiado vago para comprobarlo
pinkfloydx33
1
Bien ... esta es ahora mi nueva respuesta más votada
SuperJedi224
55

AppleScript, 20 bytes

set the clipboard to

Establece el portapapeles en ... nada.


Ahorré muchos bytes eliminando el código para enviarme el contenido del portapapeles;)

Laurel
fuente
32

Lote (Windows 7 y versiones superiores), 7 bytes

fc|clip

Nota: responderá un mensaje de error como "FC: ..." pero funciona.

"clip" es un comando para copiar la salida de otro programa al portapapeles (disponible desde Windows 7)

"fc" es un comando para comparar dos o más archivos. en este caso no ingresamos ningún archivo. producirá un error, luego "clip" establecerá el portapapeles en una cadena vacía.

siempre que tenga un archivo "a" en su directorio actual (puede estar vacío), puede hacerlo mejor:

clip<a

Editar: Vea el comentario de @Matthew Steeples para la versión más corta (pero en PowerShell no es un lote)

Divcy
fuente
2
Puede usar en sclugar de fcevitar el mensaje de error. Luego, el sctexto de ayuda se establecería en el portapapeles. Además, +1 por contarme clip.
Neil
2
Mi uno usado cd. :-)
Hand-E-Food
Supongo que clip no recogerá la salida de un no comando? ¿Entonces no podrías simplemente correr x|clip?
djsmiley2k - Vaca
@ djsmiley2k Sí, recogerá solo la salida de un comando válido.
Divcy
44
Puedes sacar a otro personaje de esto. hes un alias (por defecto) para get-history, así que puedes hacerloh|clip
Matthew Steeples
32

Bash en macOS, 8 bytes

:|pbcopy

: podría ser reemplazado por casi cualquier otro personaje individual.

ovs
fuente
66
:|pbcopyfunciona tanto en bash como en zsh.
Trauma digital
@Nax ya está arreglado
gato
29

C (en Windows), 65 62 bytes

#include<windows.h>
main(){OpenClipboard(0);EmptyClipboard();}

Editar: Guardado 3 bytes gracias a @Orion.

Neil
fuente
24
Ya que es C, ¿no puedes usarlo en 0lugar de NULL?
Orion
23

AHK , 10 bytes(Windows)

clipboard=

Borra el contenido de texto del portapapeles. Si clipboardAllse usa, lo borra todo.

De los documentos -

El portapapeles es una variable incorporada que refleja el contenido actual del portapapeles de Windows si esos contenidos se pueden expresar como texto. Por el contrario, ClipboardAll contiene todo en el portapapeles, como imágenes y formato.

Gurupad Mamadapur
fuente
22

Java 8, 127125 bytes

Golfizado:

()->java.awt.Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new java.awt.datatransfer.StringSelection(""),null)

Sin golf:

public class ICopiedMyPasswordToTheClipboardCanYouDeleteIt {

  public static void main(String[] args) {
    f(() -> java.awt.Toolkit.getDefaultToolkit().getSystemClipboard().setContents(
      new java.awt.datatransfer.StringSelection(""), null));
  }

  private static void f(Runnable x) {
    x.run();
  }
}

fuente
2
¿Podría usar una cadena vacía en lugar de nula? Ahorra 2 bytes
empuje
1
@Poke sí, eso funciona. Me estaba enfocando en "borrar" el contenido del portapapeles, como en borrarlos realmente. Resulta que la sobrescritura también está bien.
17

SmileBASIC 3, 10 bytes

¡Finalmente, un desafío prácticamente hecho para SmileBASIC 3!

CLIPBOARD"

CLIPBOARDes una función integrada que establece el portapapeles de texto del entorno en la cadena dada. Aquí le damos una cadena vacía (¡ "no es necesario cerrarla !)

caracol_
fuente
Gracias por la explicación, ya que parece dos '!
msanford
17

Excel VBA, 9 8 bytes

[A1].Cut

Sobrescribe el portapapeles con el contenido de la A1celda en la hoja de trabajo activa (vacía por defecto, pero puede ser cualquier cadena / expresión de su elección, ¡solo asegúrese de que no sea su contraseña!).

Utiliza la ventana Inmediato.

Un byte guardado gracias a Slai

pajonk
fuente
1
¡Agradable! Puede guardar un byte con[a1].Cut
Slai
16

Python 56 48 40 bytes (solo funciona en Linux) .

8 bytes guardados gracias a @wheatwizard.

import os as o
o.system("echo|xclip")
hubacub
fuente
1
Bienvenido al sitio! Noto algunos campos de golf que puedes hacer. en lugar de importar systemdesde osusted puede import os as oy llame en su o.systemlugar. Tampoco necesita los espacios alrededor de su tubería en el comando bash.
Wheat Wizard
35
Es 6 bytes más corto sin la as oparte ... ( import os \n os.system("echo |xclip")
Rɪᴋᴇʀ
44
También puede reemplazar echo con :for":|xclip"
Rɪᴋᴇʀ
22
O simplemente una línea a 37 bytes:__import__('os').system("echo|xclip")
Daniel
44
También hay una alternativa a los sistemas Linux xclipinvocados xsel, que le ahorrarían otro byte, y como ya se mencionó, elimine la parte de importación "como o" nuevamente, solo hace las cosas más largas: import os;os.system(":|xsel")(29 bytes).
Byte Commander
14

Google Chrome Language, 2 pulsaciones de teclas

<c-S><c-C>

Basado en esta respuesta de Notepad ++.

Google Chrome es compatible con Javascript (que a su vez es compatible con RegExp), por lo que declaro que es un superconjunto de Javascript y un lenguaje propio.

Cómo funciona:

Ctrl+Sinvocará el cuadro de diálogo "Guardar página" con el texto "Nueva pestaña" preseleccionado, Ctrl+Clo copiará en el portapapeles y desplazará el contenido anterior.

Nota al margen:

Puede acceder a la funcionalidad de Javascript en Chrome, a través de javascript:URL y la consola de herramientas de desarrollador (invocado con Ctrl + Shift + J)

zepelín
fuente
Gah, quería usar Google Chrome, pero no me di cuenta de que podía argumentarlo como un superconjunto de JS ... bien jugado.
Pavel
8
Entonces supongo que presionar el botón Imprimir pantalla (1 pulsación de tecla) es una solución en el lenguaje de Windows, que es un superconjunto de Google Chrome Lang.
Memet Olsen
@MemetOlsen Sí, exactamente, siéntase libre de publicarlo. Ya tenemos "Notepad ++ Language" y "Google Chrome Language", por lo que "Windows Language" parece ser el siguiente paso lógico. :)
zeppelin
1
@MemetOlsen no es un superconjunto de Google Chrome Lang, ya que Chrome es una "biblioteca" externa que debes descargar. Que es un superconjunto de IE Lang, que es un superconjunto de JS.
Pavel
Gracias chicos, agregué mi sugerencia como mi primera respuesta en este sitio de SE.
Memet Olsen
11

bash + xsel 8 7bytes

xsel -c

Explicación

-b: Funciona en la selección del portapapeles

-c: borra la selección

Abel Tom
fuente
1
+1, pero esto no es coreutils
pacholik
@pacholik Sí, necesita instalar el paquete, ya que lo operé en el terminal, lo mencioné como coreutils.
Abel Tom
1
En Debian, xsel está en el paquete xsel, no forma parte de coreutils.
Brian Minton
Como se nos permite usar cualquier portapapeles que queramos, creo que puedes soltarlo b.
Dennis
@Digital Trauma Fair Fair
Abel Tom
10

Mathematica, 17 bytes

CopyToClipboard@0

Establece el portapapeles en el número 0.

JungHwan Min
fuente
10

R (Windows) 18

writeClipboard("")
Flounderer
fuente
¿Conoces un equivalente de Linux?
Creo que algo así readLines(file("clipboard", "r")) podría funcionar. Intente buscar en los documentos de ayuda de R en "Funciones para manipular conexiones".
Flounderer
8

Matlab, 19 13 bytes

gcf;print -dm

Establecer el contenido del portapapeles en una figura vacía.

EBH
fuente
Son 21 bytes UTF-8
CAD97
@LuisMendo Esto es más largo (23): axes;print -dmeta;closepero también funciona ...
EBH
@EBH Eso closepodría decirse que se puede eliminar. Por "efectos secundarios" estaba pensando en cosas que desaparecen, no aparecen. Además, print(gcf,'-dm')funciona
Luis Mendo
@LuisMendo Bueno, no sabía que -dmera así -dmeta, y pensé que el programa debería funcionar 'silenciosamente', sin abrir ninguna ventana :)
EBH
2
@LuisMendo de hecho, es el primero. Ahora la sugerencia es aún más corta.
EBH
8

Bash, 11 10 8 7 bytes

2 bytes guardados gracias a @seshoumara por usar en lslugar deecho

Gracias a la hexafracción, Isaac y Riker por sugerir varios 7 byters

w|xclip

El portapapeles se establece en el resultado de w. Esto solo funciona en sistemas basados ​​en X11. Por ejemplo, en macOS, se puede acceder a este portapapeles utilizando una aplicación basada en X como XQuartz.


Respuesta anterior solo para macOS ( 11 9 bytes):

ls|pbcopy

Esto establece el contenido del portapapeles en una nueva línea.

Kritixi Lithos
fuente
¿Qué tal ls|xclip?
seshoumara
@seshoumara ¡Gracias! (y pensar que ls /usr/bin | grep "^.\{1,3\}$"buscaría un comando más corto: P)
Kritixi Lithos
3
O w|xclippor uno menos. Vuelca la lista de usuarios registrados en el portapapeles.
ζ--
44
O :|xclip. En realidad borra el portapapeles.
isaacg
1
Huh, funciona en mi máquina. Y dado que las presentaciones pueden esperar entradas vacías, también lo haría un simple xclipsin tuberías.
Dennis
8

Applescript, 23 bytes

set the clipboard to ""
arodebaugh
fuente
Ohhh Gracias @ DigitalTrauma
arodebaugh
Podrías eliminar las comillas por completo, pero ya se había hecho
Sagiksp
7

Python + tkinter, 43 bytes

Python 3:

from tkinter import*;Tk().clipboard_clear()

Python 2:

from Tkinter import*;Tk().clipboard_clear()
Trelzevir
fuente
¿Está incluido tkinter en la distribución de Python?
Cruncher
@Cruncher Está en mi Python 3.
DLosc
@Cruncher Sí, es parte de stdlib, aunque creo que Debian lo empaqueta en un paquete separado ( python-tk) del "núcleo de Python".
Bakuriu
Eche un vistazo al comentario de Dopapp para una forma aún más corta.
jpaugh
@jpaugh Si se refiere a cambiar el estilo de importación a __import__("tkinter")...., este es 1 byte más en este caso.
Trelzevir
7

C #, 30 bytes

¡Gracias a Nat , JMD y BgrWorker por sus sugerencias!

System.Windows.Clipboard.Clear

C # sin WPF, 36 bytes

System.Windows.Forms.Clipboard.Clear

Función incorporada que vacía el portapapeles.

Programa completo con caso de prueba:

using System;
using System.Windows.Forms;

class ClearClipboard
{
    static void Main()
    {
        Action f =
        ()=>System.Windows.Forms.Clipboard.Clear();

        // test case:
        Clipboard.SetText("SomePassword!");
        Console.WriteLine("In clipboard initially: " + Clipboard.GetText());
        f();
        Console.WriteLine("In clipboard now: " + Clipboard.GetText());
    }
}
adrianmp
fuente
44
Además, Clipboard.Clear()ya es una función, por lo que se puede descartar el lambda.
Nat
1
No me molestaré en agregar una respuesta para LINQPad ya que esta respuesta simplemente se ejecutará en ella. System.Windows.Clipboard.Clear();Pero, lprun podría ser una forma más ligera de ejecutar esta respuesta que VS o incluso VS Code.
JMD
@Nat Al omitir .Forms, no se compiló en Linux y no tengo una máquina Windows en este momento.
adrianmp
2
@adrianmp esa clase solo está contenida en PresentationCore.dll, una referencia agregada por defecto en proyectos de tipo WPF. No tengo idea si ese dll está incluido en Mono / .NET Core
BgrWorker
6

Haskell, 34 bytes

import System.Hclip
setClipboard""

Solo una función de biblioteca aburrida. También hay clearClipboardpara el mismo recuento de bytes.

nimi
fuente
6

Notepad ++, 3 pulsaciones de teclas

a<c-A><c-C>

Inserta la letra a, la selecciona, la copia en el teclado.

Notepad ++ es un lenguaje válido, admite expresiones regulares y, por lo tanto, es un superconjunto de expresiones regulares, y consideramos que la expresión regular es un lenguaje válido.

Pavel
fuente
consider regex to be a valid languageReferencias Aparentemente, RegExp no está Turing completo por sí mismo.
zepelín
2
@zeppelin No tiene que ser Turing Complete para ser un idioma válido.
Pavel
It doesn't have to be Turing Complete to be a valid languageSegún esa medida, podemos afirmar que casi cualquier cosa es un "lenguaje". Es decir, XML o HTML también tienen una sintaxis (e incluso se llaman a sí mismos idiomas, a diferencia de RegExp), sin embargo, no creo que sean aceptables. ¿Puede proporcionar un ejemplo de una respuesta Regexp pura, que ha sido votada por la comunidad? Además, creo que Notepad ++, en realidad no "admite regexp" en el sentido de que puede invocarlo mediante programación, y abrir el cuadro "Buscar y reemplazar" de la interfaz de usuario para escribir un RegExp allí, no es un "código de programa" en ninguna medida.
zepelín
1
@zeppelin meta.codegolf.stackexchange.com/a/4817/60042 <- meta publicación relevante. Tenga en cuenta que puede acceder a buscar y reemplazar en N ++ con <c-H>y usar <tab>para navegar por la interfaz de usuario e interactuar con todos los campos relevantes. También tenga en cuenta que la expresión regular puede determinar la originalidad de y agregar números. (Ambos en unario, que es la representación numérica predeterminada para expresiones regulares)
Pavel
La meta-publicación en cuestión se refiere a los editores de clase Vim y Emacs, que son extremadamente programables, no el Bloc de notas. Y sí, he visto a personas usar RegExp para las pruebas de primalidad en este sitio, pero eso es solo un caso curioso y no una prueba real de que RegExp sea un lenguaje. Por lo tanto, proporcione una referencia a cualquier respuesta "puro-Regexp" votada para probar su punto.
zepelín
6

Python 33 bytes (solo funciona en Windows) .

4 bytes guardados de la versión @hubacub.

3 bytes cambiando a Windows, usando la solución @Divcy

import os
os.system("fc|clip")

Acabo de registrarme en stackexchange, así que no tengo la reputación de comentar solo en @hubacub submition. No es necesario gastar 5 bytes con "como o" en la importación para guardar 1 byte para reducir "os.system" a "o.system".

Martin Meier
fuente
Bienvenido al sitio!
Luis Mendo
6

J (Windows), 12 bytes

wd'clipcopy'

wdes la biblioteca estándar de J para Windows. wd 'clipcopy password'pondría el texto passworden el portapapeles. No especificar nada borra el portapapeles.

Si desea que un programa ponga su contraseña de texto sin formato en su portapapeles, puede usar lo siguiente:

pass =. 'abc123'
wd 'clipcopy ' , pass
danés
fuente
Esta no es una función o un programa de relleno, sino un fragmento. Tendría que convertirlo en un verbo para que sea válido. podrías hacer algo como'clipcopy 'wd@,]
Conor O'Brien el
¿A qué "esto" te refieres? Ambos fragmentos de código son archivos .ijs ejecutables.
Dane
Podría haber simplemente entendido mal. Perdón por eso jaja. De todos modos, puede eliminar el espacio entre wdy 'clipcopy'.
Conor O'Brien
¡Gracias! Afeitado de un byte. Estoy tan acostumbrado a los espacios para ayudarme a leer J que no lo pensé.
Dane
5

JavaScript 175 148 139 135 69 Bytes

Golfizado:

<input value="c"onclick="this.select();document.execCommand('copy')">

Violín

Sin golf

Obtuve ayuda de SitePoint

HTML:

<input style="display: none;" id="Empty" value="x">
<input id="clipclear" type="button" value="Clear The Clipboard">

JS:

function clearclip(){
empty=document.getElementById("Empty");
empty.style.display="block";
empty.select();
        document.execCommand('copy');
empty.style.display="none";
}      
document.getElementById("clipclear").addEventListener("click", clearclip, false);
TecBrat
fuente
Probado en FF y Chrome
TecBrat
1
No lo publiques hasta que lo juegues. Por ahora, puede eliminar su respuesta, editarla para jugar golf y luego eliminar la eliminación de su respuesta.
NoOneIsHere
@NoOneIsHere, está bien, seguí adelante y jugué al golf. Aquí está el nuevo violín .
TecBrat
1
En lugar de comentar, edite el violín en su respuesta. Además, gran trabajo en el golf. Te di un +1. (Para su información, el lenguaje es técnicamente HTML + JavaScript.)
NoOneIsHere
5

Java 8 (JavaFX), 61 bytes

()->javafx.scene.input.Clipboard.getSystemClipboard().clear()

La API JavaFX para manipular el portapapeles es un poco más breve que la de AWT;)

Xenotoad
fuente
5

Tcl / Tk wish shell (REPL), 5 bytes

cli c

Wish shell (REPL) permite los comandos incompletos, siempre que no haya ambigüedad, el comando completo sería:

clipboard clear
zepelín
fuente
4

PHP + PHP GTK 2.0 , 24 bytes

Esto supone que ya tiene cargada la extensión PHP GTK.

<?GtkClipboard::clear();

Referencia de documentación: http://gtk.php.net/manual/en/html/gtk/gtk.gtkclipboard.method.clear.html

Ismael Miguel
fuente
No necesita la <?etiqueta de apertura ya que puede ejecutar el código sin la <?etiqueta en la línea de comando con el -rinterruptor. Ver más información aquí: meta.codegolf.stackexchange.com/questions/7098/…
Kodos Johnson
@KodosJohnson Dejé intencionalmente la etiqueta de apertura allí.
Ismael Miguel
@KodosJohnson Todavía tendría que agregar los bytes en las banderas.
ckjbgames
@ckjbgames No, no lo haría. La bandera es gratis. No cambié el código porque dejé intencionalmente las etiquetas de apertura.
Ismael Miguel
@IsmaelMiguel He visto a personas agregar las banderas de intérprete / compilador al conteo de bytes.
ckjbgames