Обмен «Хорошо» и «Плохо»

17

Описание задачи:

Напишите программу, которая запрашивает у пользователя ввод. Пользователь введет Goodили Bad. Вам не нужно поддерживать какой-либо другой ввод. Если пользователь входит Good, распечатайте Badи наоборот (на стандартный вывод и т. Д.).

Примечания:

1) Вы не можете использовать любую другую пару из двух слов.

2) Ваша программа должна спросить и распечатать только один раз.

3) Вам не нужно отображать строку приглашения.

4) Выход должен казаться отделенным от входа любым способом.

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

Удачи!

Исхак Хан
источник
9
Можем ли мы написать функцию, которая принимает входные данные в качестве аргумента, а не запрашивает их?
Адам
8
Пожалуйста, отредактируйте свой вопрос о том, разрешена ли функция или нет. Я очень рекомендую не ограничивать ввод STDIN, если только у вас нет веских причин (а я их не вижу)
Джо Кинг,
2
запрашивает у пользователя ввод (стандартный ввод и т. д.), показывает, что разрешен только ввод 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__ по умолчанию да, хотя есть комментарий от OP, который предполагает, что его можно отменить здесь.
Джонатан Аллан
4
Жаль, что «Хорошо» и «Плохо» разделяют букву «d», или вы можете сделать 'GoodBad'.strip(input())это на байт короче.
xnor
15

APL (Dyalog Unicode) , 13 байтов SBCS

Полная программа, которая запрашивает ввод от стандартного ввода и печатает на стандартный вывод.

'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
MilkyWay90
источник
4
«Машина Тьюринга, Но Пути, Хуже», без сомнения, мой новый любимый esolang.
MikeTheLiar
@MikeTheLiar Спасибо!
MilkyWay90
@A__favorite/disliked/"Turing-Machine-But-Way-Worse" is, without a doubt, my new favorite esolang.
MilkyWay90
"ТЫ БЫЛ ПРЕКРАЩЕН" ArnoldC, это ты?
TemporalWolf
@TemporalWolf Это я, АрнольдC!
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в двоичном представлении длины строки присутствует нечетное число битов, флаг четности ЦП устанавливается на нечетное, и наоборот. Таким образом , входной строки ' Bad'длины 4( 0000 0100), является нечетность и входная строка ' Good'является 5( 0000 0101) даже на четность.

DXизначально установлен для указания на строку 'Good$Bad$', и если четность четна (что означает, что ввод был ' Good'), передвиньте указатель строки на эту длину ( 5), так что теперь он указывает на 'Bad$'. Если четность нечетна, ничего не делайте, поскольку она уже указывает на 'Good$'. Затем используйте DOS API для отображения $завершенной строки на консоли.

Пример:

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

Скачайте и протестируйте GOODBAD.COM или соберите из xxdдампа:

0000000: ba10 01d1 ee02 047b 0202 d0b4 09cd 21c3  .......{......!.
0000010: 476f 6f64 2442 6164 24                   Good$Bad$
640 КБ
источник
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.
Эрик Outgolfer
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.

Лео Тененбаум
источник
5
main(){puts("Good\0Bad"+getchar()%6);}38 байт
tsh
Вы не должны добавить #include<stdio.h>?
Полфосол ఠ_ఠ
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 спасибо Джузеппе и АкселА!

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

Попробуйте онлайн!

Роберт С.
источник
1
Нет проблем. Я узнаю много других имен игроков в гольф R, поэтому я часто нажимаю на сообщения, если считаю их имя самым последним. :-)
Джузеппе
1
использование "C"вместо первого, "Bad"как в этом ответе , сохранит еще пару байтов.
Джузеппе
1
Просто из любопытства, будет ли что-то вроде `if`(readline()>"C","Bad","Good")правильного ответа? Я новичок в этой игре и ее правилах.
АксельА
2
@AkselA да, но я бы также предложил использовать scan(,"")вместо readline(). Не стесняйтесь приходить в golfR , чат для гольфа R, если у вас есть какие-либо специфические для R вопросы :-)
Джузеппе
2
@AkselA также см. Tips for Golfing in R для некоторых конкретных советов; там есть спрятанные драгоценные камни, если вы их прочитаете :-)
Джузеппе
4

sed , 21 16 13 байт

Спасибо @Cowsquack за подсказки.

/B/cGood
cBad

Попробуйте онлайн! Попробуйте онлайн! Попробуйте онлайн!

TIL cзакоротит разбор текущей строки.

GammaFunction
источник
2
cпредлагает более короткое решение
user41805
1
Вы все еще можете сохранить больше 3 байта с помощьюc
user41805
Пришлось немного поиграть с этим, но я разобрался!
GammaFunction
3

JavaScript 31 байт

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

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

ADJenks
источник
3

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

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

Попробуйте онлайн!

гигабайт
источник
В вопросе говорится «просит пользователя ввести данные», но самый короткий способ сделать это - заменить лямбду на, p getsи поэтому она такой же длины. (мой оригинальный комментарий сказал, что вы можете сохранить 2 байта, но я не учел распечатывать результат)
DaveMongoose,
3
Если мы на самом деле будем говорить о полной программе, запрашивающей ввод у пользователя, использование -pфлага даст наиболее эффективный ответ: $_=$_>?F?:Bad:"Good"это 20 байтов. Попробуйте онлайн!
Value Ink
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"
Джо Кинг
109 байтов
Оливье Грегуар
3

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

puts %w|Good Bad|-gets.split

Не в гольфе, но мне нравится злоупотребление сплитом для удаления завершающего перевода строки и преобразования в массив за один вызов.

РЕДАКТИРОВАТЬ -2 байта благодаря предложению Value Ink!

DaveMongoose
источник
Это печатает "Good"или "Bad"(с кавычками); Я не уверен, что это разрешено.
Джордан,
1
Злоупотребление тем, что putsпечатает каждый элемент массива в отдельной строке. Это на 3 байта дороже p, но оно выравнивается, поскольку вы вынимаете [0]и сохраняете еще 2 байта, больше не нуждаясь в паренах. Попробуйте онлайн!
Value Ink
@ValueInk спасибо! Проблема Джордана также решается этим изменением, так что это беспроигрышный вариант.
Дейв Мангуст
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.

Wernisch
источник
2

PHP ,26 23 байта

Троица просто дешевле:

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

Попробуйте онлайн!

Оригинальный ответ, 26 байт

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

Попробуйте онлайн!

Или 21 байт (но это в основном ответ Арно )

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

Попробуйте онлайн!

640 КБ
источник
Судя по формулировке вопроса, readline()скорее всего, уместнее, чем $argn.
Progrock
2

Желе , 9 байт

“GooBa”œ^

Попробуйте онлайн!

объяснение

Мультисимметричная разность между входом и строкой “GooBa”.

Луис Мендо
источник
@JonathanAllan Спасибо. Отредактировано
Луис Мендо
Я не вижу никаких признаков того, что вход должен поступать через STDIN ...
Эрик Outgolfer
@EriktheOutgolfer К сожалению, весь способ написания вопроса подразумевает, что у нас должна быть программа, которая при запуске запрашивает ввод (даже если подсказка не должна отображаться). Смотрите также собственный ответ ОП. Если вы хотите, чтобы они изменили его, сделайте это (хотя учтите, что они не ответили на первый, хотя и немного другой, вопрос в комментариях)
Джонатан Аллан
Похоже, что OP ответил, ввод не ограничен STDIN.
Эрик Outgolfer
@EriktheOutgolfer Спасибо! Прокат назад
Луис Mendo
2

брейкфук , 52 байта

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

Попробуйте онлайн!

Полагается, что «Плохо» на одну букву короче «Хорошо», поэтому последний ввод пуст.

Объяснение:

,>,,<<,       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 байтов

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

Попробуйте онлайн!

Использует тот факт, что вы можете просто принять входные данные как биты, а затем инвертировать определенные биты, чтобы превратить его в противоположную букву.

Объяснение:

+>,+;>,;,+;>;;;+;+;+    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"
Lyxal
источник
1
Замечательно, я не мог играть в гольф до такой длины ... Я проголосовал за твой ответ.
@A__, так же, как я проголосовал за тебя
Lyxal
Мой ответ намного хуже, чем твой. Вы не должны были голосовать против моего ответа ...
Есть ли какая-либо актуальная документация кег?
EdgyNerd
@ EdgyNerd не совсем. Прошло много времени с тех пор, как я обновил документы. Больше информации о новых вещах можно найти в чате / здесь
Lyxal