Así que estoy escribiendo un juego simple de Rock, Paper, Scissors en C (por cierto, es para una tarea, aunque lo principal es aprender sockets. Sospecho que será debido antes de obtener una buena respuesta). Lo tengo configurado como Rock = 0, Paper = 1 y Scissors = 2. ¿Hay un sencillo delineador para determinar quién gana? Traté de jugar con eso en papel, pero no pude encontrar ningún patrón.One-liner para determinar quién gana en Rock, Paper, Scissors
Respuesta
winner = (3 + player1 - player2) % 3;
Esto dará 1 si el jugador 1 gana, 2 si gana el jugador 2, 0 para un empate.
Explicación: En la secuencia Rock=0, Paper=1, Scissors=2
, cada elemento vence al anterior. Esto es cierto incluso si tratamos la secuencia como envoltura (es decir, el último elemento precede al primero).
Para poner esto en términos más matemáticos, para cualquier artículo X:
- X es derrotado por
(X+1) % 3
. - X derrotas
(X+2) % 3
.
partir de esto, se puede demostrar que (3+X-Y) % 3
es 1 si X vence a Y, o 2 si Y derrota X.
Adición 3 que se necesita para forzar el resultado a ser no negativo: El módulo de un número negativo será negativo o cero en C99 y dependiente de la implementación en C89.
Esto es brillante, pero este tipo de línea necesita al menos 3 líneas de documentación. –
+1 ¡¡Pónganme en una habitación con dos monos y tres tipos de escritores por toda la eternidad y nunca se nos ocurriría eso! –
Creo que c tiene este tipo de constructo: '(3 + player1 - player2)% 3 == 1? winner = "player1": (3 + player1 - player2)% 3 == 2? winner = "player2": winner = "everyone"; ' – sixtyfootersdude
- 1. Rock Paper Scissors para el número impar arbitrario de elementos
- 2. Escribir un sencillo "Rock Paper Scissors" bot juego
- 3. Oneliner para imprimir una cadena en hexadecimal?
- 4. Rock, Papel, Tijeras. Determine ganar/perder/empate usando matemáticas?
- 5. Java oneliner para la lista de limpieza
- 6. SQL-injection: ¿es seguro (oneliner)?
- 7. ¿Cuál es la forma correcta de comparar una Cadena con un valor enum?
- 8. ¿Cómo puedo determinar quién bloqueó un archivo usando SVN?
- 9. Technical White paper: Cómo escribir uno
- 10. Quién debe quién optimización de dinero
- 11. Eliminando el acoplamiento de clases que tienen fuertes vínculos conceptuales entre sí
- 12. cómo encontrar quién bloquea quién en SQL Server 2005
- 13. ¿Cómo crear una tarjeta rasca y gana en Android?
- 14. jQuery: ¿Cómo puedo saber cuándo una pestaña/ventana gana foco?
- 15. ¿Cómo se determina quién emitió la señal?
- 16. jQuery slider evento de "cambio": ¿cómo puedo determinar quién lo llamó?
- 17. script para decirme quién y cuántos usuarios están en línea
- 18. iPhone: cómo determinar quién es el proveedor del dispositivo (AT & T, Verizon, etc.)
- 19. ¿Quién interrumpe mi hilo?
- 20. ¿Quién debería escribir pruebas?
- 21. git: quién presionó en el gancho posterior a la recepción
- 22. ¿Quién usa Boost ASIO?
- 23. ¿Quién establece DataContext en Silverlight MVVM
- 24. ¿Quién copia app.config a app.exe.config?
- 25. Determine quién tiene foco en WPF Ventana
- 26. ¿Quién usa Java en tiempo real?
- 27. En los accesorios Rails, ¿quién es Quentin?
- 28. ¿Quién realmente implementa métodos serializables?
- 29. ¿A quién pertenece BSTR devuelto?
- 30. ¿Cómo sabe Xcode para quién fue creado el proyecto?
Si esta pregunta no se refiere a la parte de los sockets de la asignación, podría convertirse fácilmente en un '[code-golf]'. – Pops
6 minutos para una buena respuesta, ¿cuándo vence su tarea? –
Al igual que una nota, generalmente asignaría esos valores (roca, papel, tijeras, dinamita) a cadenas o caracteres. En general, es una mala práctica hacer un número porque lógicamente nunca querrá agregarlos. Esto no es importante para los problemas de asignación, pero es bueno acostumbrarse, así que cuando tienes problemas más grandes no te patean el trasero. – sixtyfootersdude