Trocar "Bom" e "Ruim"

16

Descrição do Desafio:

Escreva um programa que solicite entrada ao usuário. O usuário digitará Goodou Bad. Você não precisa dar suporte a nenhuma outra entrada. Se o usuário entrar Good, imprima Bade vice-versa (para stdout etc).

Notas:

1) Você não pode usar nenhum outro par de duas palavras.

2) Seu programa precisa solicitar e imprimir apenas uma vez.

3) Você não precisa exibir a sequência de prompt.

4) A saída deve aparecer separada da entrada por qualquer meio.

5) Nenhuma função é permitida aceitando o valor e retornando o resultado; O usuário deve interagir com o programa.

Boa sorte!

Ishaq Khan
fonte
9
Podemos escrever uma função que aceita a entrada como argumento em vez de solicitá-la?
Adám 07/07/19
8
Edite sua pergunta sobre se uma função é permitida ou não. Eu recomendo não restringir entrada para STDIN, a menos que tenha uma razão muito boa (e eu não posso ver um)
Jo rei
2
solicita a entrada do usuário (stdin etc) mostra que apenas STDIN ou entrada interativa são permitidas. Por favor, altere isso para todos os métodos de E / S padrão
MilkyWay90
1
"Solicita a entrada do usuário", deve ser alguma pergunta explícita? Porque um prompt de CLI vazio não está realmente pedindo nada ...
user0721090601 10/07/19
5
Qual é o objetivo dessa restrição? Nenhuma função é permitida aceitando o valor e retornando o resultado; O usuário deve interagir com o programa
mbomb007

Respostas:

46

Python 3 ,  32  31 bytes

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

Experimente online!

Quão?

Testa se a entrada é 'Good'comparada 'G'<input().

Usa o fato de que em Python False==0e True==1para usar o resultado como o startíndice de uma fatia de 'GBoaodd'usar um indefinido stope um stepde 2com 'GBoaodd'[start:stop:step].

Imprime em STDERR (salvando um byte exitno lugar de print).

Jonathan Allan
fonte
Que truque! Não consigo entender como isso funciona.
Ishaq Khan
Você pode usar um lambda para encurtar bytes?
MilkyWay90
@ MilkyWay90 Conforme a pergunta, deve ser um programa que aceite entradas.
Jonathan Allan
@A__ por padrão, sim, embora haja um comentário do OP que sugere que ele pode ser substituído aqui.
Jonathan Allan
4
Pena que "Bom" e "Ruim" compartilham um "d", ou você pode fazer 'GoodBad'.strip(input())um byte mais curto.
xnor
15

APL (Dyalog Unicode) , SBCS de 13 bytes

Programa completo que solicita a entrada de stdin e imprime no stdout.

'GooBad'1↓⍞

Experimente online!

 prompt para entrada de stdin; GoodouBad

¯1↓ solte o último caractere ( d); GooouBa

'GooBad'~ multiset subtrai esses caracteres desses; BadouGood

Adão
fonte
5
Por que o
voto negativo‽
1
O código possui GooBadou GoodBad?
NoOneIsHere
Eu acho que deveria GooBad, pois adicionar um caractere `` d`` fará com que este post seja 14 bytes.
@NoOneIsHere Thanks. Fixo.
Adám 08/07/19
12

Máquina de Turing, mas muito pior , 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

Experimente online!

Bem, isso levou um tempo.

EXPLICAÇÃO INACABADA :

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
MilkyWay90
fonte
4
"Turing-Machine-But-Way-Worse" é, sem dúvida, o meu novo esolang favorito.
MikeTheLiar
@MikeTheLiar Thanks!
MilkyWay90
@A__favorite/disliked/"Turing-Machine-But-Way-Worse" is, without a doubt, my new favorite esolang.
MilkyWay90
"VOCÊ FOI TERMINADO" ArnoldC, é você?
TemporalWolf
@TemporalWolf Sou eu, ArnoldC!
MilkyWay90
9

bash, 20 bytes

sed s/$1//<<<GoodBad

Experimente online!

Maçaneta da porta
fonte
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$'

Explicação:

Examina o comprimento da string de entrada (mais o espaço inicial) que o DOS armazena no endereço de memória 80He o adiciona AL(inicialmente 0 pelo DOS ). Se houver um número ímpar de 1bits na representação binária do comprimento da string, o sinalizador de paridade da CPU será definido como ímpar e vice-versa. Portanto, o ' Bad'comprimento da string de entrada 4( 0000 0100) é paridade ímpar e a string de entrada ' Good'é 5( 0000 0101) é paridade par.

DXé inicialmente definido para apontar para a string 'Good$Bad$'e, se a paridade for par (o que significa que a entrada foi ' Good'), avance o ponteiro da string por esse comprimento ( 5), de modo que agora aponte para 'Bad$'. Se a paridade for ímpar, não faça nada, pois já aponta para 'Good$'. Em seguida, use a API do DOS para exibir uma $sequência terminada no console.

Exemplo:

insira a descrição da imagem aqui

Faça o download e teste o GOODBAD.COM ou crie a partir do xxddump:

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

Geléia , 8 bytes

“Ċ³ṫ³»œṣ

Experimente online!

Um programa completo esperando uma string formatada em Python como argumento

Quão?

“Ċ³ṫ³»œṣ - 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
Jonathan Allan
fonte
1
Parece que o OP respondeu, a entrada não está restrita ao STDIN.
Erik the Outgolfer
6

Python 3, 38. 37. 34 33 bytes

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

Experimente online!

exit() : retorna um código de saída como saída

"C">input(): Verifica se a entrada é maior que a sequência Cna ordem alfabética

and"Good": Se o resultado for True, retornará comGood

or"Bad" : Caso contrário, retorna com Bad


fonte
2
exit(input()[3:]and"Bad"or"Good")também funciona para a mesma contagem de bytes.
Neil
6

C, 39 38 bytes

main(){puts("Good\0Bad"+getchar()%6);}

Experimente online!

Guardou um byte graças a @tsh.

Leo Tenenbaum
fonte
5
main(){puts("Good\0Bad"+getchar()%6);}38 bytes
tsh
Você não deveria adicionar #include<stdio.h>?
polfosol ఠ_ఠ
3
@polfosol ఠ_ఠ Se isso não fosse código golf, você deveria , mas em C89, você pode implicitamente declarar funções .
Leo Tenenbaum
Você pode usar um byte nulo em vez de \0?
Olá Adeus
5

brainfuck , 72 bytes

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

Experimente online!

Explicação:,> +++++>,>,>,>,

Leia: "G", 5, "o", "o", "d" ou "B", 5, "a", "d", 0

[<<<< [- <->> --- <] <. >> +. >>. >>>] Se o último caractere não for zero:

Substrato 5 da primeira célula uma vez e da terceira célula três vezes. Célula de incremento 3

Células de saída 1, 3, 5.

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

Caso contrário, adicione 5 à primeira célula uma vez e à terceira célula três vezes.

Célula de redução 3

Células de saída 1, 3, 3, 4

Helena
fonte
Essa é uma boa solução. Você pode encurtar um pouco não usando uma nova linha na entrada. ,> +++++>,>,>, [<<< [- <->> --- <] <. >> +. >>. >>] <[<< [- <+ >> +++ <] <. >> - ..>.>] #
Dorian
sim, eu percebi que há algo a otimizar lá, mas eu achei difícil de interpretar o que é necessário para cumprir a regra 4
Helena
4

Haskell, 36 34 bytes

interact g
g"Bad"="Good"
g _="Bad"

Experimente online!

Edit: -2 bytes graças a @cole

nimi
fonte
1
34 bytes
cole
4

R , 42 37 35 32 bytes

-10 graças a Giuseppe e AkselA!

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

Experimente online!

Robert S.
fonte
1
Sem problemas. Eu reconheço muitos nomes dos outros jogadores de golfe do R, então clico frequentemente nas postagens se vejo o nome delas como o mais recente. :-)
Giuseppe
1
usar em "C"vez do primeiro, "Bad"como nesta resposta , salvará mais alguns bytes.
Giuseppe
1
Apenas por curiosidade, algo como `if`(readline()>"C","Bad","Good")uma resposta válida? Eu sou novo neste jogo e suas regras.
AkselA
2
@ AkselA sim, mas eu também sugiro usar em scan(,"")vez de readline(). Sinta-se livre para vir a golfR , a sala de chat R golfe, se você tiver alguma dúvida específica de R :-)
Giuseppe
2
O @AkselA também vê dicas de golfe no R para obter dicas específicas; lá estão escondidos gemas em lá se você lê-los :-)
Giuseppe
4

sed , 21 16 13 bytes

Obrigado @Cowsquack pelas dicas.

/B/cGood
cBad

Experimente online! Experimente online! Experimente online!

TIL cirá causar um curto-circuito na análise da linha atual.

GammaFunction
fonte
2
coferece uma solução menor
user41805 27/08/19
1
Você ainda pode economizar mais 3 bytes utilizandoc
user41805
Tive que brincar um pouco, mas eu descobri!
GammaFunction 28/08/19
3

JavaScript 31 bytes

Eu gosto da resposta de Arnauld, mas gostaria que ela aceitasse a entrada do usuário e pudesse ser executada no StackExchange da seguinte maneira:

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

ADJenks
fonte
3

Ruby , 22 bytes

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

Experimente online!

GB
fonte
A pergunta diz "pede a entrada do usuário", mas a maneira mais curta de fazer isso é substituir o lambda por, p getse por isso tem o mesmo comprimento. (meu comentário original disse que você poderia salvar 2 bytes, mas eu não conta para a impressão do resultado)
DaveMongoose
3
Se realmente estivermos falando de um programa completo solicitando entrada do usuário, o uso do -psinalizador daria a resposta mais eficiente: $_=$_>?F?:Bad:"Good"são 20 bytes. Experimente online!
Value Ink
3

05AB1E , 10 9 bytes

”‚¿‰±”áIK

-1 byte graças a @Emigna .

Experimente online ou verifique os dois casos de teste .

Explicação:

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

Veja esta dica 05AB1E meu (seção Como usar o dicionário? ) , Para entender por que ”‚¿‰±”é "Good Bad".

Kevin Cruijssen
fonte
Eu posso ver muitas variações alternativas sobre isso, mas todas elas terminam na mesma contagem de bytes :(
Emigna
1
Na verdade, você pode salvar um byte com á.
Emigna
@ Emigna Ah, claro, brilhante. Agora que vejo áque não posso acreditar que não tinha pensado nisso, mas ao mesmo tempo sei que nunca teria pensado nisso. ;) Obrigado! (E sim, eu tinha algumas alternativas 10 bytes também.)
Kevin Cruijssen
1
Nem sequer precisa de um, ”‚¿Bad”IKé também um 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");}}

Experimente online!

Provavelmente, ainda há espaço para melhorias, mas sou totalmente novo no código do golfe.

Felix Bohnacker
fonte
2
Bem-vinda! Considere adicionar uma explicação e / ou um link a um intérprete online, onde você pode executar seu código. (Veja outras respostas para exemplos.) As respostas somente de código tendem a ser sinalizadas automaticamente como de baixa qualidade.
mbomb007
4
A parte do comprimento poderia ser apenas!="Bad"
Jo King
109 bytes
Olivier Grégoire
3

Ruby, 30 28 bytes

puts %w|Good Bad|-gets.split

Não é o golfe, mas eu gosto do abuso de divisão para remover a nova linha à direita e converter em uma matriz em uma chamada.

EDITE -2 bytes graças à sugestão da Value Ink!

DaveMongoose
fonte
Isso imprime "Good"ou "Bad"(com aspas); Não tenho certeza se isso é permitido.
Jordan
1
Abuse o fato de que putsimprime cada elemento de uma matriz em uma linha separada. É 3 bytes mais caro do que p, mas ele se equilibra desde que você remove o arquivo [0]e salva mais 2 bytes, não precisando mais de parênteses. Experimente online!
Value Ink
@ValueInk thanks! O problema da Jordânia também é resolvido por essa mudança, portanto é uma vitória.
DaveMongoose
3

Linguagem de programação de Shakespeare , 582 bytes

(Espaço em branco adicionado para facilitar a leitura)

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.

Experimente online!

Recebo a primeira letra da entrada com Open mind. Então eu preciso determinar o que é. De todos os números entre B= 66 e G= 71, meu calculador bruto diz que 66 é o mais curto para escrever ( the sum ofa big cat the cube ofa big big cat), então eu comparo a primeira letra da entrada com 66. A cena que eu continuo imprimindo Goodou a cena V imprimem Bad.

Olá adeus
fonte
2

Retina 0.8.2 , 20 bytes

oo
o
T`G\oaB`Ro
o
oo

Experimente online! O link inclui o conjunto de testes. Explicação:

oo
o

Transformar Goodem God.

T`G\oaB`Ro

Transponha as letras GoaBcom o verso dessa lista, trocando Gcom Be ocom a, ou seja, trocando Godcom Bad.

o
oo

Transformar Godem Good.

Neil
fonte
1
17 bytes , mas menos criativa
pbeentje
2

Excel, 24 bytes

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

Usando a <Csugestão de @ MilkyWay90 .

Wernisch
fonte
2

Geléia , 9 bytes

“GooBa”œ^

Experimente online!

Explicação

Diferença simétrica multiset entre a entrada e a sequência “GooBa”.

Luis Mendo
fonte
@JonathanAllan Thanks. Editado
Luis Mendo
Não vejo nenhuma indicação de que a entrada tenha que passar por STDIN ...
Erik the Outgolfer 07/07/19
@EriktheOutgolfer Infelizmente, todo o caminho em que a pergunta é escrita implica que devemos ter um programa que, quando executado, solicita entrada (mesmo que nenhum prompt deva ser exibido). Veja também a resposta do próprio OP. Se você quiser levá-los a mudá-lo ir para ele (embora nota Do que eles não respondeu a primeira, semelhante, embora ligeiramente diferente, pergunta nos comentários)
Jonathan Allan
Parece que o OP respondeu, a entrada não está restrita ao STDIN.
Erik the Outgolfer
@EriktheOutgolfer Thanks! Revertido
Luis Mendo
2

brainfuck , 52 bytes

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

Experimente online!

Depende de Má ser uma letra menor que Boa, portanto, a última entrada está vazia.

Explicação:

,>,,<<,       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

Brincadeira
fonte
2

Boolfuck , 47 bytes

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

Experimente online!

Usa o fato de que você pode basicamente receber a entrada como bits e inverter certos bits para transformá-la na letra oposta.

Explicação:

+>,+;>,;,+;>;;;+;+;+    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

Brincadeira
fonte
2

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

-᠀‘5ƳP↫

Transpiles para:

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)

É uma porta da resposta 05AB1E. Essencialmente, ele:

  • Empurra a corda "GoodBad"
  • Recebe entrada como uma string
  • Subtrai a entrada da string pressionada. Isso funciona substituindo a primeira instância da entrada GoodBadpor nada.
  • Imprime implicitamente a sequência resultante.
  • A -rtbandeira diz ao Keg para ler os tokens da direita para a esquerda.

Histórico de respostas

?G=[øBad|ø‘5Ƴ

Transpiles para o seguinte:

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)

Explicação

?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"
Lyxal
fonte
1
Maravilhoso, eu não conseguia jogar golfe tão alto ... Eu votei na sua resposta.
@A__ assim como eu votei em seu #
Lyxal 12/07/19
Minha resposta é muito pior que a sua. Você não deveria ter votado positivamente na minha resposta ...
Existe alguma documentação atualizada sobre barris?
EdgyNerd 11/11/19
@EdgyNerd não mesmo. Já faz um tempo desde que atualizei os documentos. A maioria das informações sobre coisas novas pode ser encontrada no chat / aqui
Lyxal 11/11/19
2

Carvão vegetal , 13 bytes

¿⁻LS³Ba¦Goo¦d

Experimente online!

Explicação:

¿⁻LS³          If length of input minus 3 is truthy:
      Ba¦         print Ba
         Goo¦       else print Goo
             d        print d
Pseudo Nym
fonte