「良い」と「悪い」を入れ替える


16

チャレンジの説明:

ユーザーに入力を求めるプログラムを作成します。ユーザーはGoodまたはを入力しBadます。他の入力をサポートする必要はありません。ユーザーがを入力した場合Good、印刷(Badおよびその逆)(標準出力など)が行われます。

ノート:

1)他の2つの単語のペアは使用できません。

2)あなたのプログラムは、一度尋ねて印刷するだけです。

3)プロンプト文字列を表示する必要はありません。

4)出力は、何らかの方法で入力から分離して表示される必要があります。

5)値を受け入れて結果を返す関数は許可されません。ユーザーはプログラムと対話する必要があります。

幸運を!


9
入力を要求する代わりに引数として入力を受け取る関数を作成できますか?
アダム

8
関数が許可されているかどうかに関する質問を編集してください。STDINへの入力を制限しないことを強くお勧めします。非常に正当な理由がない限り(そして表示されない場合)
ジョーキング

2
ユーザーに入力(stdinなど)要求し、 STDINまたはインタラクティブな入力のみが許可されていることを示します。これをすべてのデフォルトのI / Oメソッドに変更してください
MilkyWay90

1
「ユーザーに入力を求めます」、それは何らかの明確な質問でしょうか?空のCLIプロンプトは実際には何も求めていないので…
user0721090601

5
この制限の目的は何ですか?値を受け入れて結果を返す関数は許可されません。ユーザーはプログラムと対話する必要があります
mbomb007

回答:


46

Pythonの3 32の  31バイト

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

オンラインでお試しください!

どうやって?

入力が'Good'比較によるものかどうかをテストし'G'<input()ます。

Pythonでいるという事実使用False==0し、True==1その結果を使用することstartのスライスのインデックス'GBoaodd'未定義使用stopしてstep2では'GBoaodd'[start:stop:step]

STDERRに出力します(のexit代わりにバイトを保存しますprint)。


なんてこった!これがどのように機能するか理解できません。
イシャクカーン

ラムダを使用してバイトを短縮できますか?
MilkyWay90

@ MilkyWay90質問のとおり、入力を受け付けるプログラムでなければなりません。
ジョナサンアラン

@A__はデフォルトでyesです。ただし、OPによるコメントがありますが、ここでそれを無効にすることができます。
ジョナサンアラン

4
「Good」と「Bad」が「d」を共有しているのは残念です'GoodBad'.strip(input())が、バイトを短くすることもできます。
-xnor

15

APL(Dyalog Unicode)、13 バイトSBCS

stdinからの入力を求め、stdoutに出力する完全なプログラム。

'GooBad'1↓⍞

オンラインでお試しください!

 stdinからの入力のプロンプト。GoodまたはBad

¯1↓ 最後の文字(d)をドロップします。GooまたはBa

'GooBad'~ これらからこれらの文字をマルチセット減算します。BadまたはGood


5
なぜダウン投票
アダム

1
コードにはGooBadまたはがありますかGoodBad
-NoOneIsHere

GooBad文字 `` d``を追加するとこの投稿が14バイトになるので、そうすべきだと思います。

@NoOneIsHereありがとう。修繕。
アダム

12

チューリングマシンがさらに悪い、405バイト

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

オンラインでお試しください!

さて、これには時間がかかりました。

未完成の説明

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」は、間違いなく私のお気に入りのエソランです。
MikeTheLiar

@MikeTheLiarありがとう!
MilkyWay90

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

「終了しました」ArnoldC、あなたですか?
TemporalWolf

@TemporalWolfそれは私、ArnoldCです!
MilkyWay90


8

8088アセンブリ、IBM PC DOS、25バイト

組み立てられていない:

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

説明:

DOSがメモリアドレス80Hに格納する入力文字列の長さ(および先頭のスペース)を調べ、AL(最初0 にDOSによって)追加します。1文字列の長さのバイナリ表現に奇数のビットがある場合、CPUパリティフラグは奇数に設定され、その逆も同様です。したがって、入力文字列の' Bad'長さ40000 0100)は、奇数パリティと入力文字列' Good'50000 0101)偶数パリティです。

DXは最初に文字列を指すように設定され'Good$Bad$'、パリティが偶数の場合(入力がの場合' Good')、その長さ(5)で文字列ポインタを進めて、'Bad$'ます。パリティが奇数の場合は、既に指すので何もしません'Good$'いる。次に、DOS APIを使用して、$終了した文字列をコンソールに表示します。

例:

enter image description here

GOODBAD.COMをダウンロードしてテストするか、xxdダンプからビルドします。

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

7

ゼリー、8 バイト

“Ċ³ṫ³»œṣ

オンラインでお試しください!

Python形式の文字列を引数として期待する完全なプログラム

どうやって?

“Ċ³ṫ³»œṣ - 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
OPが応答したように見えますが、入力はSTDINに限定されません。
エリックアウトゴルファー

6

Python 3、 38 37 34 33バイト

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

オンラインでお試しください!

exit() :出力として終了コードを返します

"C">input():入力がCアルファベット順で文字列よりも大きいかどうかを確認します

and"Good":結果がある場合True、その後に戻りますGood

or"Bad" :それ以外の場合は、 Bad



2
exit(input()[3:]and"Bad"or"Good")同じバイト数でも機能します。
ニール

6

C、39 38バイト

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

オンラインでお試しください!

@tshのおかげで1バイト節約されました。


5
main(){puts("Good\0Bad"+getchar()%6);}38バイト
-tsh

追加しません#include<stdio.h>か?
ポルフォソルఠ_ఠ19年

3
@polfosolఠ_ఠこれがゴルフのコード以外のものである場合、する必要がありますが、C89では、暗黙的にfunctionsを宣言できます
レオテネンバウム

代わりにヌルバイトを使用できます\0か?
こんにちはさようなら

5

brainfuck、72バイト

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

オンラインでお試しください!

説明:、> +++++>、>、>、>、

「G」、5、「o」、「o」、「d」または「B」、5、「a」、「d」、0のいずれかを読み取ります。

[<<<< [-<->> --- <] <。>> +。>>。>>>]最後の文字がゼロでない場合:

最初のセルから5回、3回目のセルから5回を減算します。インクリメントセル3

出力セル1、3、5。

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

それ以外の場合は、最初のセルに5回、3番目のセルに3回追加します。

セル3を減らす

出力セル1、3、3、4


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!


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


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



3

Ruby, 22 bytes

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

Try it online!


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


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.


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


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!


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.


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.


17 bytes, but less creative
pbeentje


2

Excel, 24 bytes

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

Using @MilkyWay90's <C suggestion.



2

Jelly, 9 bytes

“GooBa”œ^

Try it online!

Explanation

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


@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^]

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


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


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"

1
Wonderful, I could not golf to that length... I have upvoted your answer.

@A__ just as i have up voted yours
Lyxal

My answer is a lot worse than yours. You should not have upvoted my answer...

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.