Intercambiar "bueno" y "malo"


17

Descripción del desafío:

Escriba un programa que le pida al usuario su aporte El usuario ingresará Goodo Bad. No tiene que admitir ninguna otra entrada. Si el usuario ingresa Good, imprima Bady viceversa (stdout, etc.).

Notas:

1) No puede usar ningún otro par de dos palabras.

2) Su programa solo tiene que preguntar e imprimir una vez.

3) No necesita mostrar la cadena de solicitud.

4) La salida debe aparecer separada de la entrada por cualquier medio.

5) No se permite ninguna función para aceptar el valor y devolver el resultado; El usuario debe interactuar con el programa.

¡Buena suerte!


99
¿Podemos escribir una función que tome la entrada como argumento en lugar de solicitarla?
Adám

8
Edite su pregunta sobre si una función está permitida o no. Recomiendo encarecidamente no restringir la entrada a STDIN, a menos que tenga una muy buena razón para (y no puedo ver una)
Jo King

2
solicita al usuario una entrada (stdin, etc.) muestra que solo se permite STDIN o entrada interactiva. Cambie esto a todos los métodos de E / S predeterminados
MilkyWay90

1
"Pide información al usuario", ¿debería ser alguna pregunta explícita? Debido a que una pronta CLI vacío no está realmente pidiendo nada ...
user0721090601

55
¿Cuál es el propósito de esta restricción? No se permite ninguna función que acepte el valor y devuelva el resultado; El usuario debe interactuar con el programa
mbomb007

Respuestas:


46

Python 3 ,  32  31 bytes

exit('GBoaodd'['G'<input()::2])

Pruébalo en línea!

¿Cómo?

Comprueba si la entrada es 'Good'mediante comparación 'G'<input().

Utiliza el hecho de que en Python False==0y True==1para usar el resultado como el startíndice de una porción de 'GBoaodd'usar un undefined stopy a stepof 2with 'GBoaodd'[start:stop:step].

Imprime en STDERR (guardando un byte con exiten lugar de print).


¡Qué truco! No puedo entender cómo funciona esto.
Ishaq Khan

¿Puedes usar una lambda para acortar bytes?
MilkyWay90

@ MilkyWay90 Según la pregunta, debe ser un programa que acepte información.
Jonathan Allan

@A__ por defecto sí, aunque hay un comentario de OP que sugiere que podría ser anulado aquí.
Jonathan Allan

44
Lástima que "Bueno" y "Malo" compartan una "d", o podría hacerlo, 'GoodBad'.strip(input())que es un byte más corto.
xnor

15

APL (Dyalog Unicode) , SBCS de 13 bytes

Programa completo que solicita la entrada de stdin e imprime en stdout.

'GooBad'1↓⍞

Pruébalo en línea!

 solicitud de entrada de stdin; GoodoBad

¯1↓ suelte el último caracter ( d); GoooBa

'GooBad'~ multiset restan esos caracteres de estos; BadoGood


55
Why the downvote‽
Adám

1
¿El código tiene GooBado GoodBad?
NoOneIsHere

Creo que debería haberlo hecho GooBad, ya que agregar un carácter `` d '' hará que esta publicación sea de 14 bytes.

@NoOneIsHere Gracias. Fijo.
Adám

12

Máquina de Turing pero mucho peor , 405 bytes

0 0 0 1 1 0 0
1 1 1 1 2 0 0
0 2 0 1 3 0 0
0 3 0 1 4 0 0
0 4 0 1 5 0 0
1 5 0 1 6 0 0
0 5 1 1 h 0 0
1 6 1 1 7 0 0
1 7 0 1 8 1 0
0 8 0 1 9 0 0
1 9 1 1 9 0 0
0 9 0 1 a 0 0
1 a 0 1 a 0 0
0 a 0 0 b 0 0
0 b 1 1 c 1 0
0 c 0 0 d 0 0
1 d 0 0 e 0 0
0 e 0 0 f 0 0
0 f 1 1 g 1 1
1 h 1 1 i 0 0
0 i 1 1 j 1 0
0 j 0 1 k 0 0
1 k 1 1 k 0 0
0 k 0 1 l 0 0
0 l 1 1 l 0 0
1 l 1 0 m 1 0
1 m 1 1 n 1 0
1 n 1 1 o 0 0
0 o 0 1 p 1 1

Pruébalo en línea!

Bueno, esto tomó un tiempo.

EXPLICACIÓN SIN TERMINAR :

0 0 0 1 1 0 0 Start going to the sixth bit
1 1 1 1 2 0 0
0 2 0 1 3 0 0
0 3 0 1 4 0 0
0 4 0 1 5 0 0 End going to the sixth bit
1 5 0 1 6 0 0 If the sixth bit is 1, then it is Good. Start transforming "G" to "B" and go to state 6
0 5 1 1 h 0 0 Else, it is Bad. Start transforming "B" to "G" and go to state h
1 6 1 1 7 0 0 Keep on transforming "G" to "B"
1 7 0 1 8 1 0 End transforming and print "B"
0 8 0 1 9 0 0 We are in the first "o" in "Good". Start moving into the 5th bit.
1 9 1 1 9 0 0
0 9 0 1 a 0 0
1 a 0 1 a 0 0 Do some looping magic and start transforming "o" to "a"
0 a 0 0 b 0 0 End looping magic
0 b 1 1 c 1 0 End transforming and print "a"
0 c 0 0 d 0 0 
1 d 0 0 e 0 0 Start transforming "a" to "d"
0 e 0 0 f 0 0 
0 f 1 1 g 1 1 Stop transforming, print "d", and terminate
1 h 1 1 i 0 0 Continue transforming "B" to "G"
0 i 1 1 j 1 0 Stop transforming and print out "G"
0 j 0 1 k 0 0 Start going into position to print out "oo"
1 k 1 1 k 0 0
0 k 0 1 l 0 0 Move more efficiently using LOOPING MAGIC1!1111111 
0 l 1 1 l 0 0 looping magic end, start transforming
1 l 1 0 m 1 0 end transforming and print out out "o"
1 m 1 1 n 1 0 print out "o" again
1 n 1 1 o 0 0 get into the "d" byte
0 o 0 1 p 1 1 print "d" and execute YOU HAVE BEEN TERMINATED

44
"Turing-Machine-But-Way-Worse" es, sin lugar a dudas, mi nuevo esolang favorito.
MikeTheLiar

@MikeTheLiar Gracias!
MilkyWay90

@A__favorite/disliked/"Turing-Machine-But-Way-Worse" is, without a doubt, my new favorite esolang.
MilkyWay90

"HAS SIDO TERMINADO" ArnoldC, ¿eres tú?
TemporalWolf

@TemporalWolf Soy yo, ArnoldC!
MilkyWay90


8

8088 Assembly, IBM PC DOS, 25 bytes

Desmontado:

BA 0110     MOV  DX, OFFSET GB  ; point DX to 'Good','Bad' string 
D1 EE       SHR  SI, 1          ; point SI to DOS PSP (80H) 
02 04       ADD  AL, [SI]       ; add input string length to AL, set parity flag 
7B 02       JNP  DISP           ; if odd parity, input was 'Bad' so jump to display 'Good'
02 D0       ADD  DL, AL         ; otherwise add string length as offset for 'Bad' string 
        DISP: 
B4 09       MOV  AH, 9          ; DOS display string function 
CD 21       INT  21H            ; call DOS API, write string to console 
C3          RET                 ; return to DOS 
        GB  DB  'Good$','Bad$'

Explicación:

Mira la longitud de la cadena de entrada (más el espacio inicial) que DOS almacena en la dirección de memoria 80Hy la agrega AL(inicialmente 0 por DOS ). Si hay un número impar de 1bits en la representación binaria de la longitud de la cadena, el indicador de paridad de la CPU se establece en impar y viceversa. Entonces, la ' Bad'longitud de la cadena de entrada 4( 0000 0100) es paridad impar y la cadena de entrada ' Good'es 5( 0000 0101) es paridad par.

DXinicialmente se establece para que apunte a la cadena 'Good$Bad$', y si la paridad es par (lo que significa que la entrada fue ' Good') avance el puntero de la cadena por esa longitud ( 5) para que ahora apunte a 'Bad$'. Si la paridad es extraña, no haga nada ya que ya apunta 'Good$'. Luego use la API de DOS para mostrar una $cadena terminada en la consola.

Ejemplo:

ingrese la descripción de la imagen aquí

Descargue y pruebe GOODBAD.COM o compile desde el xxdvolcado:

0000000: ba10 01d1 ee02 047b 0202 d0b4 09cd 21c3  .......{......!.
0000010: 476f 6f64 2442 6164 24                   Good$Bad$

7

Jalea , 8 bytes

“Ċ³ṫ³»œṣ

Pruébalo en línea!

Un programa completo que espera una cadena con formato Python como argumento

¿Cómo?

“Ċ³ṫ³»œṣ - Main Link: list of characters, S
“Ċ³ṫ³»   - compression of dictionary words "Good"+"Bad" = ['G','o','o','d','B','a','d']
      œṣ - split on sublists equal to S
         - implicit, smashing print

1
Parece que OP respondió, la entrada no está restringida a STDIN.
Erik the Outgolfer

6

Python 3, 38 37 34 33 bytes

exit("C">input()and"Good"or"Bad")

Pruébalo en línea!

exit() : devuelve un código de salida como salida

"C">input(): Comprueba si la entrada es más grande que la cadena Cen orden alfabético

and"Good": Si el resultado es True, entonces regresa conGood

or"Bad" : De lo contrario, vuelve con Bad



2
exit(input()[3:]and"Bad"or"Good")También funciona para el mismo número de bytes.
Neil


5

brainfuck , 72 bytes

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

Pruébalo en línea!

Explicación:,> +++++>,>,>,>,

Lea ya sea: "G", 5, "o", "o", "d" o "B", 5, "a", "d", 0

[<<<< [- <->> --- <] <. >> +. >>. >>>] Si el último carácter no es cero:

Resta 5 de la primera celda una vez y de la tercera celda tres veces. Incremento celda 3

Celdas de salida 1, 3, 5.

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

De lo contrario, agregue 5 a la primera celda una vez y a la tercera celda tres veces.

Decremento celda 3

Celdas de salida 1, 3, 3, 4


Esa es una buena solución. Puede acortarlo un poco al no usar una nueva línea en la entrada. ,> +++++>,>,>, [<<< [- <->> --- <] <. >> +. >>. >>] <[<< [- <+ >> +++ <] <. >> - ..>.>]
Dorian

Sí, me di cuenta de que hay algo que optimizar allí, pero me resultó difícil interpretar lo que es necesario para cumplir con la regla 4
Helena


4

R , 42 37 35 32 bytes

-10 gracias a Giuseppe y AkselA!

`if`(scan(,'')>'C','Bad','Good')

Pruébalo en línea!


1
No hay problema. Reconozco muchos de los nombres de otros golfistas R, por lo que a menudo hago clic en las publicaciones si veo su nombre como el más reciente. :-)
Giuseppe

1
usando en "C"lugar del primero "Bad"como en esta respuesta ahorrará otro par de bytes.
Giuseppe

1
Solo por curiosidad, ¿sería algo así `if`(readline()>"C","Bad","Good")como una respuesta válida? Soy nuevo en este juego y sus reglas.
AkselA

2
@AkselA sí, pero también sugeriría usar en scan(,"")lugar de readline(). No dude en venir a golfR , la sala de chat de golf R si tiene alguna pregunta específica sobre R :-)
Giuseppe

2
@AkselA también vea Consejos para jugar golf en R para algunos consejos específicos; hay gemas ocultas allí si las lees :-)
Giuseppe


3

JavaScript 31 bytes

Me gusta la respuesta de Arnauld, pero me gustaría que acepte la entrada del usuario y se pueda ejecutar en StackExchange de esta manera:

alert(prompt()[3]?'Bad':'Good')



3

Ruby , 22 bytes

->n{n>?F?"Bad":"Good"}

Pruébalo en línea!


La pregunta dice "pide al usuario una entrada", pero la forma más corta de hacerlo es reemplazando el lambda por p getslo que tiene la misma longitud. (mi comentario original decía que podía guardar 2 bytes, pero no tomé en cuenta la impresión del resultado)
DaveMongoose

3
Si en realidad vamos a hablar de un programa completo que solicita información al usuario, usar el -pindicador daría la respuesta más eficiente: $_=$_>?F?:Bad:"Good"son 20 bytes. Pruébalo en línea!
Value Ink

3

05AB1E , 10 9 bytes

”‚¿‰±”áIK

-1 byte gracias a @Emigna .

Pruébelo en línea o verifique ambos casos de prueba .

Explicación:

”‚¿‰±”     # Push dictionary string "Good Bad"
      á    # Only keep letters (to remove the space)
       IK  # Remove the input
           # (output the result implicitly)

Ver este consejo 05AB1E mío (sección Cómo usar el diccionario? ) , Para entender por qué ”‚¿‰±”es "Good Bad".


Puedo ver muchas variaciones alternativas sobre esto, pero todas terminan en el mismo número de bytes :(
Emigna

1
En realidad, puede guardar un byte con á.
Emigna

@Emigna Ah, por supuesto, genial. Ahora que lo veo, áno puedo creer que no lo haya pensado, pero al mismo tiempo sé que nunca lo habría pensado. ;) ¡Gracias! (Y sí, también tenía algunas alternativas de 10 bytes.)
Kevin Cruijssen

1
Ni siquiera necesito á, ”‚¿Bad”IKtambién es un 9.
Grimmy

3

Java (JDK) , 124 bytes

interface G{static void main(String[]a){System.out.print(new java.util.Scanner(System.in).next().length()>3?"Bad":"Good");}}

Pruébalo en línea!

Lo más probable es que todavía haya margen de mejora, pero soy completamente nuevo en el golf de código.


2
¡Bienvenido! Considere agregar una explicación y / o un enlace a un intérprete en línea donde pueda ejecutar su código. (Consulte otras respuestas para ver ejemplos). Las respuestas de solo código tienden a marcarse automáticamente como de baja calidad.
mbomb007

44
La parte de la longitud podría ser!="Bad"
Jo King el


3

Rubí, 30 28 bytes

puts %w|Good Bad|-gets.split

No es el más golfista, pero me gusta el abuso de split para eliminar la nueva línea final y convertirla en una matriz en una sola llamada.

¡EDITE -2 bytes gracias a la sugerencia de Value Ink!


Esto imprime "Good"o "Bad"(con comillas); No estoy seguro de que eso esté permitido.
Jordania

1
Abusa del hecho de que putsimprime cada elemento de una matriz en una línea separada. Es 3 bytes más caro que p, pero se iguala ya que saca el [0]y luego ahorra 2 bytes más al no necesitar pares. Pruébalo en línea!
Value Ink

@ValueInk gracias! El problema de Jordan también se resuelve con este cambio, por lo que es beneficioso para todos.
DaveMongoose

3

Lenguaje de programación Shakespeare , 582 bytes

(Espacio en blanco agregado para facilitar la lectura)

G.Ajax,.Puck,.Act I:.Scene I:.[Enter Ajax and Puck]Ajax:
Open mind.Be you nicer the sum ofa big cat the cube ofa big big cat?If solet usScene V.
You is the sum ofthe sum ofyou a big big cat a cat.Speak thy.You is the sum ofyou twice twice twice the sum ofa big big cat a cat.Speak thy.Speak thy.You is the square oftwice the sum ofa big big cat a cat.Let usScene X.
Scene V:.Ajax:
You is the sum ofthe sum ofyou a big big pig a pig.Speak thy.You is the sum ofyou the sum ofa big big big big big cat a pig.Speak thy.You is the sum ofyou the sum ofa big cat a cat.
Scene X:.Ajax:Speak thy.

Pruébalo en línea!

Me sale la primera letra de la entrada con Open mind. Entonces necesito determinar qué es. De todos los números entre B= 66 y G= 71, mi fuerza bruta dice que 66 es el más corto de escribir ( the sum ofa big cat the cube ofa big big cat), por lo que comparo la primera letra de la entrada con 66. La escena I continúa imprimiendo Goodo la escena V imprime Bad.


2

Retina 0.8.2 , 20 bytes

oo
o
T`G\oaB`Ro
o
oo

Pruébalo en línea! El enlace incluye un conjunto de pruebas. Explicación:

oo
o

Conviértete Gooden God.

T`G\oaB`Ro

Transponga las letras GoaBcon el reverso de esa lista, intercambiando así Gcon By ocon a, es decir, intercambiando Godcon Bad.

o
oo

Conviértete Goden Good.


1
17 bytes , pero menos creativo
pbeentje


2

Excel, 24 bytes

=IF(A1>"C","Bad","Good")

Usando la <Csugerencia de @ MilkyWay90 .



2

Jalea , 9 bytes

“GooBa”œ^

Pruébalo en línea!

Explicación

Diferencia simétrica de varios conjuntos entre la entrada y la cadena “GooBa”.


@ JonathanAllan Gracias. Editado
Luis Mendo

No veo ninguna indicación de que la entrada tenga que pasar por STDIN ...
Erik the Outgolfer

@EriktheOutgolfer Desafortunadamente, toda la forma en que se escribe la pregunta implica que debemos tener un programa que, cuando se ejecuta, solicite información (aunque no se debe mostrar ningún mensaje). Vea la propia respuesta de los OP también. Si desea que lo cambien, hágalo (aunque tenga en cuenta que no han respondido la primera pregunta similar, aunque ligeramente diferente, en los comentarios)
Jonathan Allan

Parece que OP respondió, la entrada no está restringida a STDIN.
Erik the Outgolfer

@EriktheOutgolfer ¡Gracias! Revertido
Luis Mendo


2

Barril , 22 bytes

?^_^_o=[^aB^_|^ooG^]

2

brainfuck , 52 bytes

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

Pruébalo en línea!

Se basa en que Bad sea una letra más corta que Good, por lo que la última entrada está vacía.

Explicación:

,>,,<<,       Get input into the first three cells
[             If the last letter was not empty (i.e. Good)
 >-----.      Decrement 'G' to 'B' and print
 <---.        Decrement 'd' to 'a' and print
 +++.         Increment back to 'd' and print
>>]           End loop
>[            If it is Bad instead
 +++++.       Increment 'B' to 'G' and print
 +[-<-->]<-.. Manipulate into  'o' and print twice
 >>.          Print 'd'
>]            End loop


2

Boolfuck , 47 bytes

+>,+;>,;,+;>;;;+;+;+[;<;;;,;+;;+;<];;+;+;;+;;+;

Pruébalo en línea!

Utiliza el hecho de que básicamente puedes tomar la entrada como bits y luego invertir ciertos bits para convertirla en la letra opuesta.

Explicación:

+>,+;>,;,+;>;;;+;+;+    Print the first letter by inverting the first and third bits of the input
                        'B' = 01000010
                        'G' = 11100010
                        This leaves the tape as
                            1 1 1 1' in the case of Bad
                            1 0 0 1' in the case of Good
                        By making the center cells the inverted bits
[;<;;;,;+;;+;<]         Print the center letters by looping over the two pairs of cells
                        0 1' results in 'a' = 10000110
                        1 1' results in 'o' = 11110110 by printing the 1 in the 2-4th places
                        1 1 1 1' loops twice, while 1 0 0 1' only loops once
;;+;+;;+;;+;            Finally print 'd' = 00100110


2

Barril , -rt 20 17 15 13 8 7 bytes (SBCS)

-᠀‘5ƳP↫

Transpiles a:

from KegLib import *
from Stackd import Stack
stack = Stack()
printed = False
iterable(stack, 'GoodBad')
string_input(stack)
maths(stack, '-')

if not printed:
    printing = ""
    for item in stack:
        if type(item) in [str, Stack]:
            printing += str(item)
        elif type(item) == Coherse.char:
            printing += item.v

        elif item < 10 or item > 256:
            printing += str(item)
        else:
            printing += chr(item)
    print(printing)

Es un puerto de la respuesta 05AB1E. Esencialmente:

  • Empuja la cuerda "GoodBad"
  • Toma la entrada como una cadena
  • Resta la entrada de la cadena empujada. Esto funciona reemplazando la primera instancia de la entrada dentro GoodBadcon nada.
  • Imprime implícitamente la cadena resultante.
  • La -rtbandera le dice a Keg que lea los tokens de derecha a izquierda.

Historial de respuestas

?G=[øBad|ø‘5Ƴ

Transpila a lo siguiente:

from KegLib import *
from Stackd import Stack
stack = Stack()
printed = False
Input(stack)
character(stack, 'G')
comparative(stack, '=')
if bool(stack.pop()):
    empty(stack)
    character(stack, 'B')
    character(stack, 'a')
    character(stack, 'd')

else:
    empty(stack)
    iterable(stack, 'Good')

if not printed:
    printing = ""
    for item in stack:
        if type(item) is Stack:
            printing += str(item)

        elif type(item) is str:
            printing += custom_format(item)
        elif type(item) == Coherse.char:
            printing += item.v

        elif item < 10 or item > 256:
            printing += str(item)
        else:
            printing += chr(item)
    print(printing)

Explicación

?G=[øBad|ø‘5Ƴ

?            #Get input from user
 G=          #If the first letter is "G"
   [øBad     #Clear the stack and push "Bad"
        |    #Else,
         ø‘5Ƴ#Clear the stack and push the compressed string "Good"

1
Maravilloso, no podía jugar golf hasta ese punto ... He votado tu respuesta.

@A__ tal como he votado el tuyo
Lyxal

Mi respuesta es mucho peor que la tuya. No deberías haber votado mi respuesta ...

¿Hay alguna documentación actualizada del barril?
EdgyNerd

@EdgyNerd no realmente. Ha pasado un tiempo desde que actualicé los documentos. La mayoría de la información sobre cosas nuevas se puede encontrar en el chat / aquí
Lyxal

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.