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!


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


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


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

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


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$

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

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



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


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


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

R , 42 37 35 32 bytes

-10 graças a Giuseppe e AkselA!

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

Experimente online!


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


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



3

Ruby , 22 bytes

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

Experimente online!


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


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.


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


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!


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.


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.


1
17 bytes , mas menos criativa
pbeentje


2

Excel, 24 bytes

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

Usando a <Csugestão de @ MilkyWay90 .



2

Geléia , 9 bytes

“GooBa”œ^

Experimente online!

Explicação

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


@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

Barril , 22 bytes

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

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


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


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"

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.