"Gut" und "Schlecht" tauschen

16

Herausforderungsbeschreibung:

Schreiben Sie ein Programm, das den Benutzer zur Eingabe auffordert. Der Benutzer gibt Goododer ein Bad. Sie müssen keine weiteren Eingaben unterstützen. Wenn der Benutzer eingibt Good, drucken Sie Badund umgekehrt (zu stdout usw.).

Anmerkungen:

1) Sie können kein anderes Paar von zwei Wörtern verwenden.

2) Ihr Programm muss nur einmal gefragt und ausgedruckt werden.

3) Sie müssen keine Eingabeaufforderungszeichenfolge anzeigen.

4) Die Ausgabe muss in jedem Fall von der Eingabe getrennt erscheinen.

5) Keine Funktion darf den Wert annehmen und das Ergebnis zurückgeben; Der Benutzer muss mit dem Programm interagieren.

Viel Glück!

Ishaq Khan
quelle
9
Dürfen wir eine Funktion schreiben, die Eingaben als Argument akzeptiert, anstatt sie aufzufordern?
Adám
8
Bitte bearbeiten Sie Ihre Frage, ob eine Funktion zulässig ist oder nicht. Ich würde wärmstens empfehlen, die Eingabe auf STDIN nicht einzuschränken, es sei denn, Sie haben einen sehr guten Grund dafür (und ich kann keinen sehen)
Jo King
2
fragt den Benutzer nach Eingaben (stdin etc) zeigt an, dass nur STDIN oder interaktive Eingaben erlaubt sind. Bitte ändern Sie dies auf alle Standard-I / O-Methoden
MilkyWay90
1
"Bittet den Benutzer um Eingabe", sollte das eine explizite Frage sein? Weil eine leere CLI-Eingabeaufforderung nicht wirklich nach irgendetwas fragt…
user0721090601
5
Was ist der Zweck dieser Einschränkung? Keine Funktion darf den Wert akzeptieren und das Ergebnis zurückgeben. Der Benutzer muss mit dem Programm interagieren
mbomb007

Antworten:

46

Python 3 ,  32  31 Bytes

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

Probieren Sie es online!

Wie?

Testet, ob die Eingabe 'Good'durch Vergleichen erfolgt'G'<input() .

Nutzt die Tatsache, dass in Python False==0undTrue==1 zu verwenden , um das Ergebnis als den startIndex einer Scheibe 'GBoaodd'unter Verwendung eines undefinierte stopund stepvon 2mit 'GBoaodd'[start:stop:step].

Druckt nach STDERR (Speichern eines Bytes mit exit anstelle von print).

Jonathan Allan
quelle
Was für ein Trick! Kann nicht verstehen, wie das funktioniert.
Ishaq Khan
Können Sie ein Lambda verwenden, um Bytes zu verkürzen?
MilkyWay90
@ MilkyWay90 Gemäß der Frage muss es ein Programm sein, das Eingaben akzeptiert.
Jonathan Allan
@A__ standardmäßig ja, obwohl es einen Kommentar von OP gibt, der darauf hindeutet, dass er hier außer Kraft gesetzt werden könnte.
Jonathan Allan
4
Schade, dass "Gut" und "Schlecht" ein "d" teilen, oder Sie könnten das tun, 'GoodBad'.strip(input())was ein Byte kürzer ist.
xnor
15

APL (Dyalog Unicode) , 13 Byte SBCS

Volles Programm, das zur Eingabe von stdin auffordert und nach stdout druckt.

'GooBad'1↓⍞

Probieren Sie es online!

 Eingabeaufforderung von stdin; GoododerBad

¯1↓ lösche das letzte Zeichen ( d);GoooderBa

'GooBad'~ Multiset subtrahiert diese Zeichen von diesen; BadoderGood

Adam
quelle
5
Warum die downvote‽
Adám
1
Hat der Code GooBadoder GoodBad?
NoOneIsHere
Ich denke, es sollte so sein GooBad, als würde das Hinzufügen eines Zeichens `` d`` diesen Beitrag zu 14 Bytes machen.
8.
@NoOneIsHere Danke. Fest.
Adám
12

Turing-Maschine aber viel schlimmer , 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

Probieren Sie es online!

Nun, das hat eine Weile gedauert.

UNVOLLSTÄNDIGE ERKLÄRUNG :

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
quelle
4
"Turing-Machine-But-Way-Worse" ist ohne Zweifel mein neuer Lieblings-Esolang.
MikeTheLiar
@MikeTheLiar Danke!
MilkyWay90
@ A__favorite/disliked/"Turing-Machine-But-Way-Worse" is, without a doubt, my new favorite esolang.
MilkyWay90
"SIE WURDEN BEENDIGT" ArnoldC, sind Sie das?
TemporalWolf
@TemporalWolf Ich bin es, ArnoldC!
MilkyWay90
8

8088 Assembly, IBM PC DOS, 25 Byte

Zerlegt:

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

Erläuterung:

Prüft die Länge der Eingabezeichenfolge (plus Leerzeichen), die DOS unter der Speicheradresse speichert 80H, und fügt sie hinzu AL(zunächst 0 unter DOS ). Wenn 1die binäre Darstellung der Zeichenfolgenlänge eine ungerade Anzahl von Bits enthält, wird das CPU-Paritätsflag auf ungerade gesetzt und umgekehrt. So Eingabestring ' Bad'Länge 4( 0000 0100), ungerade Parität und Eingabestring ' Good'ist 5( 0000 0101) ist gerade Parität.

DXist anfangs so eingestellt, dass sie auf den String zeigt 'Good$Bad$', und wenn die Parität gerade ist (dh die Eingabe war ' Good'), stellen Sie den String-Zeiger um diese Länge vor ( 5), sodass er jetzt auf zeigt 'Bad$'. Wenn die Parität ungerade ist, tun Sie nichts, da sie bereits auf verweist 'Good$'. Verwenden Sie dann die DOS-API, um a anzuzeigen$ terminierte Zeichenfolge für die Konsole .

Beispiel:

Bildbeschreibung hier eingeben

Laden Sie GOODBAD.COM herunter und testen Sie es oder erstellen Sie es aus einem xxdDump:

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

Gelee , 8 Bytes

“Ċ³ṫ³»œṣ

Probieren Sie es online!

Ein vollständiges Programm, das eine mit Python formatierte Zeichenfolge als Argument erwartet

Wie?

“Ċ³ṫ³»œṣ - 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
quelle
1
Offenbar hat OP geantwortet, die Eingabe ist nicht auf STDIN beschränkt.
Erik der Outgolfer
6

Python 3, 38 37 34 33 Bytes

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

Probieren Sie es online!

exit() : gibt einen Exit-Code als Ausgabe zurück

"C">input(): Prüft, ob die Eingabe Cin alphabetischer Reihenfolge größer als die Zeichenfolge ist

and"Good": Wenn das Ergebnis ist True, wird mit zurückgegebenGood

or"Bad" : Andernfalls wird mit zurückgegeben Bad

ein'_'
quelle
2
exit(input()[3:]and"Bad"or"Good")funktioniert auch für die gleiche Anzahl von Bytes.
Neil
6

C 39 38 Bytes

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

Probieren Sie es online!

1 Byte dank @tsh gespeichert.

Leo Tenenbaum
quelle
5
main(){puts("Good\0Bad"+getchar()%6);}38 Bytes
tsh
Shouldn't you add #include<stdio.h>?
polfosol ఠ_ఠ
3
@polfosolఠ_ఠ If this were anything but code golf, you should, but in C89, you can implicitly declare functions.
Leo Tenenbaum
Can you use a null byte instead of \0?
Hello Goodbye
4

brainfuck, 72 bytes

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

Try it online!

Explanation: ,>+++++>,>,>,>,

Read either: "G", 5, "o", "o", "d" or "B", 5, "a", "d", 0

[<<<<[-<->>---<]<.>>+.>>.>>>] If the last character is not zero:

Substract 5 from the first cell once and from the third cell thrice. Increment cell 3

Output cells 1, 3, 5.

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

Otherwise add 5 to the first cell once and to the third cell thrice.

Decrement cell 3

Output cells 1, 3, 3, 4

Helena
quelle
That's a nice solution. You can shorten it a little bit by not using a newline in the input. ,>+++++>,>,>,[<<<[-<->>---<]<.>>+.>>.>>]<[<<[-<+>>+++<]<.>>-..>.>]
Dorian
yeah, I realized that there is something to optimise there, but I found it hard to interpret what is necessary to comply with rule 4
Helena
4

R, 42 37 35 32 bytes

-10 thanks to Giuseppe and AkselA!

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

Try it online!

Robert S.
quelle
1
No problem. I recognize a lot of the other R golfers' names, so I often click on posts if I see their name as the most recent. :-)
Giuseppe
1
using "C" instead of the first "Bad" as in this answer will save another couple bytes.
Giuseppe
1
Just out of curiosity, would something like `if`(readline()>"C","Bad","Good") be a valid answer? I'm new to this game and its rules.
AkselA
2
@AkselA yes, but I'd also suggest using scan(,"") instead of readline(). Feel free to come to golfR, the R golf chatroom if you have any R-specific questions :-)
Giuseppe
2
@AkselA also see Tips for Golfing in R for some specific tips; there are hidden gems in there if you read them :-)
Giuseppe
4

sed, 21 16 13 bytes

Thanks @Cowsquack for the hints.

/B/cGood
cBad

Try it online! Try it online! Try it online!

TIL c will short-circuit the current line's parsing.

GammaFunction
quelle
2
c offers a shorter solution
Kritixi Lithos
1
You can still save 3 more bytes using c
Kritixi Lithos
Had to play around with it a bit, but I figured it out!
GammaFunction
3

JavaScript 31 bytes

I like Arnauld's answer, but I would like it to accept user input and be runnable on StackExchange like so:

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

adjenks
quelle
3

Befunge-93, 20 18 bytes

"BadooGB"~-_#@,,<,

Try it online!

-2 bytes thanks to Jo King

negative seven
quelle
3

Ruby, 22 bytes

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

Try it online!

G B
quelle
The question does say "asks the user for input", but the shortest way to do that is replacing the lambda with p gets and so it's the same length. (my original comment said you could save 2 bytes, but I didn't account for printing the result)
DaveMongoose
3
If we're actually going to be talking about a full program asking user for input, using the -p flag would give the most efficient answer: $_=$_>?F?:Bad:"Good" is 20 bytes. Try it online!
Value Ink
3

05AB1E, 10 9 bytes

”‚¿‰±”áIK

-1 byte thanks to @Emigna.

Try it online or verify both test cases.

Explanation:

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

See this 05AB1E tip of mine (section How to use the dictionary?), to understand why ”‚¿‰±” is "Good Bad".

Kevin Cruijssen
quelle
I can see many alternate variations on this, but they all end up at the same byte count :(
Emigna
1
Actually, you can save a byte with á.
Emigna
@Emigna Ah of course, brilliant. Now that I see á I can't believe I hadn't thought about it, but at the same time I know I would have never thought about it. ;) Thanks! (And yeah, I had a few 10-byte alternatives as well.)
Kevin Cruijssen
1
Don't even need á, ”‚¿Bad”IK is also a 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");}}

Try it online!

Most likely, there‘s still some room for improvement, but I‘m entirely new to code golfing.

Felix Bohnacker
quelle
2
Welcome! Consider adding an explanation and/or a link to an online interpreter where you can run your code. (See other answers for examples.) Code-only answers tend to be automatically flagged as low-quality.
mbomb007
4
The length part could just be !="Bad"
Jo King
109 bytes
Olivier Grégoire
3

Ruby, 30 28 bytes

puts %w|Good Bad|-gets.split

Not the golf-iest, but I like the abuse of split to remove the trailing newline and convert to an array in one call.

EDIT -2 bytes thanks to Value Ink's suggestion!

DaveMongoose
quelle
This prints "Good" or "Bad" (with quotes); I'm not sure that's allowed.
Jordan
1
Abuse the fact that puts prints each element of an array on a separate line. It's 3 bytes more expensive than p, but it evens out since you take out the [0] and then save 2 more bytes by no longer needing parens. Try it online!
Value Ink
@ValueInk thanks! Jordan's issue also gets resolved by this change so it's a win-win.
DaveMongoose
3

Shakespeare Programming Language, 582 bytes

(Whitespace added for readability)

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.

Try it online!

I get the first letter of the input with Open mind. Then I need to determine what it is. Of all the numbers between B=66 and G=71, my brute forcer says 66 is the shortest to write (the sum ofa big cat the cube ofa big big cat), so I compare the first letter of the input to 66. Scene I continues to print Good, or Scene V prints Bad.

Hello Goodbye
quelle
2

Retina 0.8.2, 20 bytes

oo
o
T`G\oaB`Ro
o
oo

Try it online! Link includes test suite. Explanation:

oo
o

Turn Good into God.

T`G\oaB`Ro

Transpose the letters GoaB with the reverse of that list, thus exchanging G with B and o with a, i.e. exchanging God with Bad.

o
oo

Turn God into Good.

Neil
quelle
17 bytes, but less creative
pbeentje
2

Excel, 24 bytes

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

Using @MilkyWay90's <C suggestion.

Wernisch
quelle
2

PHP, 26 23 bytes

A ternary is just cheaper:

<?=$argn==Bad?Goo:Ba?>d

Try it online!

Original answer, 26 bytes

<?=[Ba,Goo][$argn==Bad]?>d

Try it online!

Or 21 bytes (but this is basically Arnauld's answer)

<?=$argn[3]?Ba:Goo?>d

Try it online!

640KB
quelle
Judging by the phrasing of the question, readline() is likely more appropriate than $argn.
Progrock
2

Jelly, 9 bytes

“GooBa”œ^

Try it online!

Explanation

Multiset symmetric difference between the input and the string “GooBa”.

Luis Mendo
quelle
@JonathanAllan Thanks. Edited
Luis Mendo
I don't see any indication that the input has to come through STDIN...
Erik the Outgolfer
@EriktheOutgolfer Unfortunately the whole way the question is written implies we must have a program which, when run, asks for input (even though no prompt must be displayed). See the OPs own answer too. If you want to get them to change it go for it (although do note that they haven't answered the first, similar although slightly different, question in the comments)
Jonathan Allan
Looks like OP responded, input isn't restricted to STDIN.
Erik the Outgolfer
@EriktheOutgolfer Thanks! Rolled back
Luis Mendo
2

Keg, 22 bytes

?^_^_o=[^aB^_|^ooG^]
a'_'
quelle
2

brainfuck, 52 bytes

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

Try it online!

Relies on Bad being one letter shorter than Good, so the last input is empty.

Explanation:

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

Jo King
quelle
2

Boolfuck, 47 bytes

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

Try it online!

Uses the fact that you can basically just take in the input as bits and then invert certain bits to turn it into the opposite letter.

Explanation:

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

Jo King
quelle
2

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

-᠀‘5ƳP↫

Transpiles to:

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)

It's a port of the 05AB1E answer. Essentially, it:

  • Pushes the string "GoodBad"
  • Takes input as a string
  • Subtracts the input from the pushed string. This works by replacing the first instance of the input within GoodBad with nothing.
  • Implicitly prints the resulting string.
  • The -rt flag tells Keg to read tokens from right to left.

Answer History

?G=[øBad|ø‘5Ƴ

Transpiles to the following:

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)

Explanation

?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
quelle
1
Wonderful, I could not golf to that length... I have upvoted your answer.
a'_'
@A__ just as i have up voted yours
Lyxal
My answer is a lot worse than yours. You should not have upvoted my answer...
a'_'
Is there any up to date keg documentation?
EdgyNerd
@EdgyNerd not really. It's been a while since I updated the docs. Most information about new things can be found in the chat/here
Lyxal
2

Charcoal, 13 bytes

¿⁻LS³Ba¦Goo¦d

Try it online!

Explanation:

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