Обмін на «добре» та «погано»


17

Опис виклику:

Напишіть програму, яка запитує користувача введення. Користувач буде ввести Goodабо Bad. Вам не потрібно підтримувати будь-які інші дані. Якщо користувач входить Good, друкуйте Badі навпаки (для викреслювання тощо).

Примітки:

1) Ви не можете використовувати жодну іншу пару з двох слів.

2) Ваша програма повинна запитувати та друкувати лише один раз.

3) Вам не потрібно відображати рядок підказок.

4) Вихід повинен виглядати відокремленим від входу будь-якими способами.

5) жодна функція не може приймати значення та повертати результат; Користувач повинен взаємодіяти з програмою.

Удачі!


9
Чи можемо ми написати функцію, яка приймає введення як аргумент, а не спонукання до неї?
Адам

8
Будь ласка, відредагуйте своє запитання щодо того, дозволена чи ні функція. Я настійно рекомендую не обмежувати введення STDIN, якщо ви не маєте дуже вагомих причин (і я не можу його побачити)
Jo King

2
запитує у користувача введення (stdin тощо), показує, що дозволено лише STDIN або інтерактивне введення. Будь ласка, змініть це на всі методи вводу / виводу за замовчуванням
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і stepз 2з 'GBoaodd'[start:stop:step].

Друкує в STDERR (збереження байта з exitзамість print).


Яка хитрість! Не можу зрозуміти, як це працює.
Ішак Хан

Чи можете ви використовувати лямбда для скорочення байтів?
MilkyWay90

@ MilkyWay90 Відповідно до питання, це повинна бути програма, яка приймає вхід.
Джонатан Аллан

@A__ за замовчуванням так, хоча є зауваження ОП, яке дозволяє припустити, що тут це можна буде скасувати.
Джонатан Аллан

4
Шкода, що "Хороший" і "Поганий" ділять "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
Чому downvote‽
Adám

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
"Тюрінг-машина-але-шлях-гірше" - це, без сумніву, мій новий улюблений езоланг.
MikeTheLiar

@MikeTheLiar Дякую!
MilkyWay90

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

"ТИ ВІН ТЕРМІНОВО" АрнольдС, це ти?
TemporalWolf

@TemporalWolf Це я, АрнольдК!
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'довжини 4( 0000 0100), є непарність і вхідний рядок ' Good'є 5( 0000 0101) навіть на парність.

DXспочатку встановлюється вказівку на рядок 'Good$Bad$', і якщо парність є парною (означає, що введення було ' Good'), просуньте вказівник рядка на цю довжину ( 5), так що тепер він вказує на 'Bad$'. Якщо парність є непарною, не робіть нічого, оскільки це вже вказує на 'Good$'. Потім використовуйте API DOS для відображення $завершеного рядка для консолі.

Приклад:

введіть тут опис зображення

Завантажте та протестуйте 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
Схоже, що відповіла ОП, введення не обмежується STDIN.
Ерік Аутгольфер

6

Пітон 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.


5
main(){puts("Good\0Bad"+getchar()%6);}38 байт
TSH

Не варто додати #include<stdio.h>?
polfosol ఠ_ఠ

3
@polfosol ఠ_ఠ Якщо це щось інше, як код гольфу, ви повинні , але в C89 ви можете неявно оголошувати функції .
Лев Тененбаум

Чи можете ви використовувати нульовий байт замість \0?
Привіт до побачення

5

мозковий ебать , 72 байти

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

Спробуйте в Інтернеті!

Пояснення:,> +++++>,>,>,>,

Читайте або "G", 5, "o", "o", "d" або "B", 5, "a", "d", 0

[<<<< [- <->> --- <] <. >> +. >>. >>>] Якщо останній символ не дорівнює нулю:

Підсумок 5 з першої комірки один раз і з третьої клітини тричі. Приріст клітини 3

Вихідні комірки 1, 3, 5.

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

В іншому випадку додайте 5 до першої комірки один раз і до третьої клітини тричі.

Клітина зменшення 3

Вихідні комірки 1, 3, 3, 4


Це приємне рішення. Ви можете трохи скоротити його, не використовуючи новий рядок у введенні. ,> +++++>,>,>, [<<< [- <->> --- <] <. >> +. >>. >>] <[<< [- <+ >> +++ <] <. >> - ..>.>]
Доріан

так, я зрозумів, що там є що оптимізувати, але мені було важко інтерпретувати, що необхідно для дотримання правила 4
Хелена


4

R , 42 37 35 32 байт

-10 дякую Джузеппе та AkselA!

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

Спробуйте в Інтернеті!


1
Нема проблем. Я впізнаю багато імен інших R-гольфістів, тому часто натискаю на повідомлення, якщо бачу їх ім'я як найсвіжіші. :-)
Джузеппе

1
використання "C"замість першого, "Bad"як у цій відповіді , збереже ще пару байтів.
Джузеппе

1
Щось із цікавості, чи може щось на зразок `if`(readline()>"C","Bad","Good")слушної відповіді? Я новачок у цій грі та її правилах.
AkselA

2
@AkselA Так, але я б також запропонував використовувати scan(,"")замість цього readline(). Спільно заходьте в гольф RR , в кімнату для спілкування з гольфами R, якщо у вас є питання, пов'язані з R :-)
Джузеппе

2
@AkselA також дивіться Поради щодо гольфу в R для деяких конкретних порад; там є приховані дорогоцінні камені, якщо ти їх читаєш :-)
Джузеппе

4

sed , 21 16 13 байт

Дякуємо @Cowsquack за підказки.

/B/cGood
cBad

Спробуйте в Інтернеті! Спробуйте в Інтернеті! Спробуйте в Інтернеті!

TIL здійснить cкоротке замикання на розбір поточної лінії.


2
cпропонує коротше рішення
користувач41805

1
Ви можете зберегти ще 3 байти за допомогоюc
user41805

Довелося трохи пограти з цим, але я зрозумів це!
GammaFunction

3

JavaScript 31 байт

Мені подобається відповідь Арнаульда, але я хотів би, щоб вона прийняла введення користувача та була доступною для StackExchange так:

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



3

Рубін , 22 байти

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

Спробуйте в Інтернеті!


Питання каже: "запитує у користувача інформацію", але найкоротший спосіб зробити це - замінити лямбда на, p getsі це однакова довжина. (мій оригінальний коментар сказав, що ви можете зберегти 2 байти, але я не врахував друк результату)
DaveMongoose

3
Якщо ми насправді будемо говорити про повну програму, яка просить користувача ввести, використання -pпрапора дасть найефективнішу відповідь: $_=$_>?F?:Bad:"Good"це 20 байт. Спробуйте в Інтернеті!
Значення чорнила

3

05AB1E , 10 9 байт

”‚¿‰±”áIK

-1 байт завдяки @Emigna .

Спробуйте в Інтернеті або перевірте обидва тестові справи .

Пояснення:

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

Дивіться цей 05AB1E наконечник шахти (розділ Як користуватися словником? ) , Щоб зрозуміти , чому ”‚¿‰±”це "Good Bad".


Я можу побачити багато альтернативних варіантів цього, але всі вони закінчуються тим самим числом байтів :(
Emigna

1
Власне, ви можете зберегти байт за допомогою á.
Емінья

@Emigna Ну, звичайно, блискучий. Тепер, коли я бачу, áя не можу повірити, що я не думав про це, але в той же час я знаю, що ніколи б про це не думав. ;) Дякую! (І так, у мене було також декілька 10-байтних альтернатив.)
Кевін Круїйсен

1
Навіть не потрібно, ”‚¿Bad”IKтакож 9.
Grimmy

3

Java (JDK) , 124 байти

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

Спробуйте в Інтернеті!

Швидше за все, є ще щось місце для вдосконалення, але я абсолютно новий в коді гольфу.


2
Ласкаво просимо! Подумайте про додавання пояснення та / або посилання до онлайн-перекладача, де ви можете запустити свій код. (Див. Інші відповіді для прикладів.) Відповіді, що стосуються лише коду, зазвичай автоматично позначаються як низькоякісні.
mbomb007

4
Частина довжини могла бути просто!="Bad"
Джо Кінг,


3

Рубін, 30 28 байт

puts %w|Good Bad|-gets.split

Не гольф-іест, але мені подобається зловживання роздвоєнням для видалення зворотного нового рядка та перетворення в масив за один дзвінок.

EDIT -2 байти завдяки пропозиції значення Ink!


Це відбитки "Good"або "Bad"(з цитатами); Я не впевнений, що це дозволено.
Йордан

1
Зловживайте тим, що putsдрукує кожен елемент масиву в окремому рядку. Це на 3 байти дорожче p, але це вирівнюється, оскільки ви виймаєте [0]та зберігаєте ще 2 байти, більше не потребуючи паронів. Спробуйте в Інтернеті!
Значення чорнила

@ValueInk дякую! Питання Йорданії також вирішується цією зміною, тож це виграш-виграш.
DaveMongoose

3

Мова програмування Шекспіра , 582 байти

(Для читабельності додано пробіл)

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.

Спробуйте в Інтернеті!

Я отримую першу букву вводу з Open mind. Тоді мені потрібно визначити, що це таке. З усіх цифр між B= 66 і G= 71, мій грубий форцер говорить, що 66 є найкоротшим для написання ( the sum ofa big cat the cube ofa big big cat), тому я порівнюю першу букву введення з 66. Сцена I продовжує друкувати Good, або Сцена V друкує Bad.


2

Сітківка 0,8,2 , 20 байт

oo
o
T`G\oaB`Ro
o
oo

Спробуйте в Інтернеті! Посилання включає тестовий набір. Пояснення:

oo
o

Перетвориться Goodна God.

T`G\oaB`Ro

Транспонування літери GoaBзі зворотним цього списку, таким чином , обмінюючись Gз Bі oз a, тобто обмін Godз Bad.

o
oo

Перетвориться Godна Good.


1
17 байтів , але менш креативні
pbeentje


2

Excel, 24 байти

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

Використання @ MilkyWay90 по <Cпропозицією.


2

PHP ,26 23 байти

Трійця просто дешевша:

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

Спробуйте в Інтернеті!

Оригінальна відповідь, 26 байт

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

Спробуйте в Інтернеті!

Або 21 байт (але це в основному відповідь Арнальда )

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

Спробуйте в Інтернеті!


Судячи з фразування питання, readline()швидше за все, більш підходящо, ніж $argn.
Прогрок

2

Желе , 9 байт

“GooBa”œ^

Спробуйте в Інтернеті!

Пояснення

Симетрична різниця між введеннями та рядком “GooBa”.


@JonathanAllan Дякую Відредаговано
Луїс Мендо

Я не бачу жодних ознак того, що вхід повинен надходити через STDIN ...
Ерік Атгольфер

@EriktheOutgolfer На жаль, весь спосіб написання запитання означає, що ми повинні мати програму, яка під час запуску просить ввести дані (навіть не вимагаючи відображення жодного запиту). Дивіться також власну відповідь ОП. Якщо ви хочете змусити їх змінити, перейдіть на це (хоча зауважте, що вони не відповіли на перший, подібний, хоча і дещо інший, питання в коментарях)
Джонатан Аллан

Схоже, що відповіла ОП, введення не обмежується STDIN.
Ерік Аутгольфер

@EriktheOutgolfer Дякую! Прокат назад
Луїс Mendo


2

Кег , 22 байти

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

2

мозковий ебать , 52 байти

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

Спробуйте в Інтернеті!

Покладається на те, що Bad є на одну літеру коротшою, ніж хороша, тому останній ввід порожній.

Пояснення:

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

Болфук , 47 байт

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

Спробуйте в Інтернеті!

Використовує той факт, що ви можете, як правило, просто взяти вхід як біти, а потім перевернути певні біти, щоб перетворити його на протилежну букву.

Пояснення:

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

Кег , -rt 20 17 15 13 8 7 байт (SBCS)

-᠀‘5ƳP↫

Перекладає на:

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)

Це порт відповіді 05AB1E. По суті, це:

  • Натискає на рядок "GoodBad"
  • Вводиться як рядок
  • Віднімає вхід з висунутого рядка. Це працює, замінюючи перший примірник вхідного сигналу GoodBadнічим.
  • Неналежним чином друкується отриманий рядок.
  • -rtПрапор говорить бочонок читати лексеми справа наліво.

Історія відповідей

?G=[øBad|ø‘5Ƴ

Перекладає на таке:

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)

Пояснення

?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
Чудово, що я не міг гольфувати до такої довжини ... Я підтримав вашу відповідь.

@A__ так само, як я проголосував за твого
Lyxal

Моя відповідь набагато гірша за вашу. Ви не повинні були б схвалити мою відповідь ...

Чи є актуальна документація про кег?
EdgyNerd

@EdgyNerd не дуже. Минув час, коли я оновив документи. Більшість інформації про нові речі можна знайти у чаті / тут
Lyxal

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.