Bertukar “Baik” dan “Buruk”


16

Deskripsi Tantangan:

Tulis program yang meminta input dari pengguna. Pengguna akan masuk Goodatau Bad. Anda tidak harus mendukung input lainnya. Jika pengguna masuk Good, cetak Baddan sebaliknya (ke stdout dll).

Catatan:

1) Anda tidak dapat menggunakan pasangan dua kata lainnya.

2) Program Anda hanya perlu bertanya dan mencetak sekali.

3) Anda tidak perlu menampilkan string yang cepat.

4) Output harus tampak terpisah dari input dengan cara apa pun.

5) Tidak ada fungsi yang diizinkan menerima nilai dan mengembalikan hasilnya; Pengguna harus berinteraksi dengan program.

Semoga berhasil!


9
Bisakah kita menulis fungsi yang mengambil input sebagai argumen alih-alih meminta untuk itu?
Adám

8
Harap edit pertanyaan Anda tentang apakah suatu fungsi diizinkan atau tidak. Saya akan sangat menyarankan untuk tidak membatasi input ke STDIN, kecuali jika Anda memiliki alasan yang sangat baik untuk (dan saya tidak dapat melihatnya)
Jo King

2
meminta input dari pengguna (stdin, dll) menunjukkan bahwa hanya STDIN atau input interaktif yang diizinkan. Silakan ubah ini menjadi semua metode I / O default
MilkyWay90

1
"Meminta input dari pengguna", haruskah itu pertanyaan eksplisit? Karena prompt CLI kosong tidak benar-benar meminta apa pun ...
user0721090601

5
Apa tujuan dari pembatasan ini? Tidak ada fungsi yang diizinkan menerima nilai dan mengembalikan hasilnya; Pengguna harus berinteraksi dengan program
mbomb007

Jawaban:


46

Python 3 ,  32  31 byte

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

Cobalah online!

Bagaimana?

Menguji apakah input 'Good'dengan membandingkan 'G'<input().

Menggunakan fakta bahwa dalam Python False==0dan True==1menggunakan hasilnya sebagai startindeks sepotong 'GBoaodd'menggunakan terdefinisi stopdan stepdari 2dengan 'GBoaodd'[start:stop:step].

Mencetak ke STDERR (menyimpan byte dengan exitdi tempat print).


Trik apa! Tidak bisa mengerti cara kerjanya.
Ishaq Khan

Bisakah Anda menggunakan lambda untuk mempersingkat byte?
MilkyWay90

@ MilkyWay90 Sesuai pertanyaan, program harus menerima input.
Jonathan Allan

@ A__ secara default ya, meskipun ada komentar oleh OP yang menyarankannya bisa ditolak di sini.
Jonathan Allan

4
Sayang sekali "Bagus" dan "Buruk" berbagi "d", atau Anda bisa melakukan 'GoodBad'.strip(input())byte yang lebih pendek.
xnor

15

APL (Dyalog Unicode) , 13 byte SBCS

Program lengkap yang meminta input dari stdin dan mencetak ke stdout.

'GooBad'1↓⍞

Cobalah online!

 meminta input dari stdin; GoodatauBad

¯1↓ jatuhkan karakter terakhir ( d); GooatauBa

'GooBad'~ multiset kurangi karakter tersebut dari ini; BadatauGood


5
Why the downvote‽
Adám

1
Apakah kodenya punya GooBadatau GoodBad?
NoOneIsHere

Saya pikir itu harus GooBad, karena menambahkan karakter `` `d`` akan membuat posting ini 14 byte.

@NoOneIsHere Terima kasih. Tetap.
Adám

12

Turing Machine But Way Worse , 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

Cobalah online!

Nah, ini butuh waktu.

PENJELASAN TAK TERBATAS :

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" adalah, tanpa diragukan lagi, esolang favorit baru saya.
MikeTheLiar

@ MikeTheLiar Terima kasih!
MilkyWay90

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

"KAMU TELAH TERTENTU" ArnoldC, apakah itu kamu?
TemporalWolf

@TemporalWolf Ini aku, ArnoldC!
MilkyWay90


8

8088 Assembly, IBM PC DOS, 25 byte

Belum dirakit:

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

Penjelasan:

Melihat panjang string input (ditambah ruang utama) yang disimpan oleh DOS di alamat memori 80H, dan ditambahkan ke AL(awalnya 0 oleh DOS ). Jika ada jumlah ganjil 1bit dalam representasi biner dari panjang string, flag paritas CPU diatur ke ganjil, dan sebaliknya. Jadi ' Bad'panjang string input 4( 0000 0100), adalah paritas ganjil dan string input ' Good'adalah 5( 0000 0101) bahkan paritas.

DXawalnya diatur untuk menunjuk ke string 'Good$Bad$', dan jika paritas genap (berarti input tadinya ' Good') memajukan pointer string dengan panjang itu ( 5) jadi sekarang menunjuk ke 'Bad$'. Jika paritas aneh, jangan lakukan apa-apa karena itu sudah menunjuk ke 'Good$'. Kemudian gunakan DOS API untuk menampilkan $string yang dihentikan ke konsol.

Contoh:

masukkan deskripsi gambar di sini

Unduh dan uji GOODBAD.COM atau build from xxddump:

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

7

Jelly , 8 byte

“Ċ³ṫ³»œṣ

Cobalah online!

Program lengkap yang mengharapkan string berformat Python sebagai argumen

Bagaimana?

“Ċ³ṫ³»œṣ - 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
Sepertinya OP merespons, input tidak terbatas pada STDIN.
Erik the Outgolfer

6

Python 3, 38 37 34 33 byte

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

Cobalah online!

exit() : mengembalikan kode keluar sebagai output

"C">input(): Memeriksa apakah input lebih besar dari string Cdalam urutan abjad

and"Good": Jika hasilnya True, maka kembali denganGood

or"Bad" : Kalau tidak, kembali dengan Bad



2
exit(input()[3:]and"Bad"or"Good")juga berfungsi untuk jumlah byte yang sama.
Neil


5

brainfuck , 72 byte

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

Cobalah online!

Penjelasan:,> +++++>,>,>,>,

Baca baik: "G", 5, "o", "o", "d" atau "B", 5, "a", "d", 0

[<<<< [- <->> --- <] <. >> +. >>. >>>] Jika karakter terakhir bukan nol:

Kurangi 5 dari sel pertama sekali dan dari sel ketiga tiga kali. Sel kenaikan 3

Sel keluaran 1, 3, 5.

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

Kalau tidak, tambahkan 5 ke sel pertama sekali dan ke sel ketiga tiga kali.

Pengurangan sel 3

Sel keluaran 1, 3, 3, 4


Itu solusi yang bagus. Anda dapat mempersingkatnya sedikit dengan tidak menggunakan baris baru di input. ,> +++++>,>,>, [<<< [- <->> --- <] <. >> +. >>. >>. >> <<<[- <+ >> +++ <] <. >> - ..>.>]
Dorian

ya, saya menyadari bahwa ada sesuatu untuk dioptimalkan di sana, tetapi saya merasa sulit untuk menafsirkan apa yang diperlukan untuk mematuhi aturan 4
Helena


4

R , 42 37 35 32 byte

-10 Terima kasih kepada Giuseppe dan AkselA!

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

Cobalah online!


1
Tidak masalah. Saya mengenali banyak nama pegolf R lainnya, jadi saya sering mengklik posting jika saya melihat nama mereka sebagai yang terbaru. :-)
Giuseppe

1
menggunakan "C"bukan yang pertama "Bad"seperti dalam jawaban ini akan menghemat beberapa byte lagi.
Giuseppe

1
Hanya ingin tahu, apakah sesuatu seperti `if`(readline()>"C","Bad","Good")jawaban yang valid? Saya baru mengenal game ini dan aturannya.
AkselA

2
@AkselA ya, tapi saya juga menyarankan menggunakan scan(,"")sebagai gantinya readline(). Jangan ragu untuk datang ke golfR , chatroom golf R jika Anda memiliki pertanyaan spesifik-R :-)
Giuseppe

2
@AkselA juga lihat Kiat Golf di R untuk beberapa kiat khusus; ada permata tersembunyi di sana jika Anda membacanya :-)
Giuseppe


3

JavaScript 31 byte

Saya suka jawaban Arnauld, tapi saya ingin menerima input pengguna dan dapat dijalankan di StackExchange seperti:

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



3

Ruby , 22 byte

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

Cobalah online!


Pertanyaannya memang mengatakan "meminta input dari pengguna", tetapi cara terpendek untuk itu adalah mengganti lambda dengan p getsdan jadi panjangnya sama. (komentar asli saya mengatakan Anda bisa menghemat 2 byte, tapi saya tidak memperhitungkan untuk mencetak hasilnya)
DaveMongoose

3
Jika kita benar-benar akan berbicara tentang program lengkap yang meminta input dari pengguna, menggunakan -pflag akan memberikan jawaban yang paling efisien: $_=$_>?F?:Bad:"Good"adalah 20 byte. Cobalah online!
Nilai Tinta

3

05AB1E , 10 9 byte

”‚¿‰±”áIK

-1 byte terima kasih kepada @Emigna .

Cobalah online atau verifikasi kedua kasus uji .

Penjelasan:

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

Lihat ini ujung 05AB1E saya (bagian Cara menggunakan kamus? ) , Untuk memahami mengapa ”‚¿‰±”adalah "Good Bad".


Saya dapat melihat banyak variasi alternatif tentang ini, tetapi mereka semua berakhir pada jumlah byte yang sama :(
Emigna

1
Sebenarnya, Anda dapat menyimpan byte dengan á.
Emigna

@Emigna Ah tentu saja, brilian. Sekarang saya tahu ásaya tidak percaya saya tidak memikirkannya, tetapi pada saat yang sama saya tahu saya tidak akan pernah memikirkannya. ;) Terima kasih! (Dan ya, saya punya beberapa alternatif 10-byte juga.)
Kevin Cruijssen

1
Bahkan tidak perlu á, ”‚¿Bad”IKjuga 9.
Grimmy

3

Java (JDK) , 124 byte

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

Cobalah online!

Kemungkinan besar, masih ada ruang untuk perbaikan, tapi saya benar-benar baru dalam kode golf.


2
Selamat datang! Pertimbangkan untuk menambahkan penjelasan dan / atau tautan ke juru bahasa online tempat Anda dapat menjalankan kode Anda. (Lihat jawaban lain sebagai contoh.) Jawaban hanya kode cenderung ditandai secara otomatis sebagai berkualitas rendah.
mbomb007

4
Bagian panjangnya bisa saja!="Bad"
Jo King


3

Ruby, 30 28 byte

puts %w|Good Bad|-gets.split

Bukan golf-iest, tapi saya suka penyalahgunaan split untuk menghapus baris baru dan mengkonversi ke array dalam satu panggilan.

EDIT -2 byte berkat saran Value Ink!


Ini mencetak "Good"atau "Bad"(dengan tanda kutip); Saya tidak yakin itu diizinkan.
Jordan

1
Abuse fakta yang putsmencetak setiap elemen dari array pada baris terpisah. Ini 3 byte lebih mahal daripada p, tapi itu mereda karena Anda mengambil [0]dan kemudian menyimpan 2 byte lebih dengan tidak perlu lagi parens. Cobalah online!
Nilai Tinta

@ Nilai, terima kasih! Masalah Jordan juga terselesaikan dengan perubahan ini sehingga ini merupakan win-win.
DaveMongoose

3

Bahasa Pemrograman Shakespeare , 582 byte

(Whitespace ditambahkan untuk dibaca)

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.

Cobalah online!

Saya mendapatkan huruf pertama dari input Open mind. Maka saya perlu menentukan apa itu. Dari semua angka antara B= 66 dan G= 71, brute saya pompa kecil mengatakan 66 adalah terpendek untuk menulis ( the sum ofa big cat the cube ofa big big cat), jadi saya membandingkan huruf pertama dari input ke 66. Adegan aku terus mencetak Good, atau adegan V cetakan Bad.


2

Retina 0.8.2 , 20 byte

oo
o
T`G\oaB`Ro
o
oo

Cobalah online! Tautan termasuk test suite. Penjelasan:

oo
o

Berubah Goodmenjadi God.

T`G\oaB`Ro

Transpos ulang huruf GoaBdengan kebalikan dari daftar itu, sehingga bertukar Gdengan Bdan odengan a, yaitu bertukar Goddengan Bad.

o
oo

Berubah Godmenjadi Good.


1
17 byte , tetapi kurang kreatif
pbeentje


2

Excel, 24 byte

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

Menggunakan <Csaran @ MilkyWay90 .



2

Jelly , 9 byte

“GooBa”œ^

Cobalah online!

Penjelasan

Perbedaan simetris multiset antara input dan string “GooBa”.


@Jonathan Allan Terima kasih. Diedit
Luis Mendo

Saya tidak melihat indikasi bahwa input harus datang melalui STDIN ...
Erik the Outgolfer

@EriktheOutgolfer Sayangnya seluruh pertanyaan ditulis menyiratkan kita harus memiliki program yang, ketika dijalankan, meminta input (meskipun tidak ada prompt yang harus ditampilkan). Lihat jawaban OP sendiri. Jika Anda ingin mereka mengubahnya, lakukanlah (meskipun perlu dicatat bahwa mereka belum menjawab pertanyaan pertama, serupa meskipun sedikit berbeda, dalam komentar)
Jonathan Allan

Sepertinya OP merespons, input tidak terbatas pada STDIN.
Erik the Outgolfer

@EriktheOutgolfer Terima kasih! Digulung kembali
Luis Mendo


2

Tong , 22 byte

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

2

brainfuck , 52 byte

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

Cobalah online!

Bergantung pada Buruk menjadi satu huruf lebih pendek dari Baik, sehingga input terakhir kosong.

Penjelasan:

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

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

Cobalah online!

Menggunakan fakta bahwa Anda pada dasarnya hanya dapat mengambil input sebagai bit dan kemudian membalikkan bit tertentu untuk mengubahnya menjadi huruf yang berlawanan.

Penjelasan:

+>,+;>,;,+;>;;;+;+;+    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 byte (SBCS)

-᠀‘5ƳP↫

Transpile ke:

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)

Ini adalah port jawaban 05AB1E. Pada dasarnya, itu:

  • Dorong senarnya "GoodBad"
  • Mengambil input sebagai string
  • Kurangi input dari string yang didorong. Ini berfungsi dengan mengganti instance input pertama GoodBaddengan apa-apa.
  • Secara implisit mencetak string yang dihasilkan.
  • The -rtflag mengatakan Tong untuk membaca token dari kanan ke kiri.

Jawab Sejarah

?G=[øBad|ø‘5Ƴ

Transpile ke yang berikut:

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)

Penjelasan

?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
Hebat, saya tidak bisa bermain golf sejauh itu ... Saya telah membatalkan jawaban Anda.

@ A__ sama seperti saya telah memilih Anda
Lyxal

Jawaban saya jauh lebih buruk daripada jawaban Anda. Anda seharusnya tidak

Apakah ada dokumentasi tong terbaru?
EdgyNerd

@ EdgyNerd tidak terlalu. Sudah lama sejak saya memperbarui dokumen. Sebagian besar informasi tentang hal-hal baru dapat ditemukan di obrolan / di sini
Lyxal

2

Arang , 13 byte

¿⁻LS³Ba¦Goo¦d

Cobalah online!

Penjelasan:

¿⁻LS³          If length of input minus 3 is truthy:
      Ba¦         print Ba
         Goo¦       else print Goo
             d        print d
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.