Утка утка гусь!


58

Помните детскую игру «Утка, утка, гусь» ? Нет? И я нет.

Соревнование

  • Напечатайте слово «утка» на отдельных строках неограниченное количество раз.
  • Напечатайте слово «гусь».
  • Ваша программа заканчивается.

Правила

  • Попытайтесь играть в игру с наименьшим количеством байтов.
  • Там должна быть хотя бы одна утка.
  • В конце списка должен быть ровно один гусь.
  • На каждой линии должна быть ровно одна птица. Нет пустых строк.
  • Случай выводимых строк не имеет значения.
  • Пробел в пределах строки в порядке.
  • Ваша программа должна закончиться.
  • Ваша программа не должна постоянно производить одинаковое количество уток.

Веселиться!


Обратите внимание: этот вопрос не является дубликатом кратчайшего кода для получения недетерминированного вывода

Причины включают в себя:

  • Ассоциация к детской игре
  • Определены начальные и конечные требования строки результата. В другом вызове не указано никаких выходных данных.
  • Ответы Для другого, не дублирующегося запроса в однозначном количестве байтов. Среднее значение для этого составляет около 30, или там около.
  • По количеству совпадений между этим вызовом и этим вопросом любой вопрос о код-гольфе, включая тег «случайный», является дубликатом. Должны ли мы удалить их все?
  • Кодовые ответы для этой задачи будут соответствовать другой (нелепо раздутым способом), но ответы на эту задачу не будут соответствовать этой.

11
Не могли бы вы определить неопределенный? Может ли это означать или ноль или один?
рекурсивный

1
Пожалуйста, определите, насколько случайно это должно быть сгенерировано. Однородный по дальности или с экспоненциальным спадом?
HyperNeutrino

@recursive Нет, но давайте перейдем к рабочему определению ... Программа не всегда отображает одинаковое количество уток.
AJFaraday

2
Говоря как миннесотец, что, если мой вместо этого напечатает «утка, утка, серая утка» ? :)
Майк Хилл

1
@ jpmc26 Я уверен, что есть и другие. Для начала тебе пришлось бы сыграть это с другими.
AJFaraday

Ответы:


9

Желе , 13 байт

2X“¢;ÆS»ẋ“ʋ¢»

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

Объяснение:

2X“¢;ÆS»ẋ“ʋ¢»

2X             Random number (1 or 2)
  “¢;ÆS»       Compressed string equivalent to "duck\n"
        ẋ      Repeat the "duck\n" that random number of times
         “ʋ¢»  Compresses string equivalent to "goose"
               Implicitly concatenated and returned

Более читаемая версия: попробуйте онлайн!

Всегда будет возвращать 1 или 2 утки.


Congrats! Я буквально понятия не имею, как это работает!
AJFaraday

@AJFaraday Я пошел вперед и добавил объяснение для вас
PunPun1000

@ PunPun1000 Извините, но что за стек? Jelly - это молчаливый язык программирования.
user202729

@ user202729 Ой, у меня в голове запутались Jelly и 05AB1E, не могли бы вы отредактировать их, чтобы исправить эту ошибку? К сожалению об этом
PunPun1000

Есть неявная конкатенация в желе? Ура!
MilkyWay90

43

Язык сценариев работы Flashpoint , 48 байт

f={s="duck\n";s+([s,""]select random 1)+"goose"}

Всегда печатает одну или две утки.

random 1возвращает число (с плавающей запятой) selectв диапазоне от 0 до 1. Это число передается в качестве аргумента вместе с массивом [s,""]. Затем случайное число округляется до ближайшего целого числа (0 или 1), и элемент массива по этому индексу выбирается из массива.

Звоните с:

hint call f

Выход:

Альтернативная версия 56 байт:

f={s="duck\n";format[s+"%1goose",[s,""]select random 1]}

3
Меня всегда радует, когда кто-то использует это на PCG.
Nit

Ну, я забыл, что эта игра существовала.
Каймен

38

World of Warcraft 81 байт

Вот макрос, который вы можете запустить в World of Warcraft.

/run for x=1,random(1,9) do SendChatMessage("Duck") end; SendChatMessage("Goose")

11
Боже мой ... Почему я никогда не думал об этом.
Волшебный осьминог Урна

4
PVCG (Программирование видеоигр и Code Golf). Операция Flashpoint была вещь, но WoW? Я жду решений Minecraft и Factorio этого.
Brain Guider

2
@AnderBiguri Я подозреваю, что Minecraft будет делать немного хуже, чем 81 байт (блоки?);)
Крис

5
Это должно сработать, и вы получите 58 байт:/run for x=1,random(1,9)do print("Duck")end print("Goose")
gastropner

35

Minecraft <1,13, 72 54 байта

Извини, мне пришлось.

Инструкции:

  • Создайте новый мир Minecraft в творческом режиме
  • Найдите папку сохранения для этого мира и поместите следующий код в data/functions/minecraft/ddg.mcfunction
  • Запустите /function ddgв игровой консоли

Как это устроено:

Выводит слово «утка» для каждой сущности в мире, затем выводит слово «гусь». Поскольку сущности постоянно появляются и исчезают, количество «утки» не будет постоянным. Я использовал tellrawвместо гораздо более короткого, sayпотому что sayвыводит имя объекта, а tellrawвыводит именно то, что ему говорят.

execute @e ~ ~ ~ tellraw @a "duck"
tellraw @a "goose"

Скриншот

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

Редактировать: Изменено {"текст": "утка"}, чтобы просто "утка" (и то же самое с "гусь")


1
Красивый. Нам нужно больше Minecraft в PPCG.
BradC

9
Стоит отметить, что вы (игрок) - существо в мире, поэтому количество уток никогда не может быть равно 0 (даже если не было враждебных или пассивных мобов).
BradC

1
@BradC должны быть целые проблемы, основанные на Minecraft.
tox123

17

JavaScript, 45 44 42 39 37 байт

Имеет возможность вызвать ошибку переполнения.

f=_=>`duck
${new Date%2?f():`goose`}`

Проверь это

o.innerText=(
f=_=>`duck
${new Date%2?f():`goose`}`
)()
<pre id=o></pre>


14

Октава , 38 33 байта

Это не самый короткий (это 36 байт), но это мой любимый. Объяснение внизу.

disp(['duck '+~(1:1/rand)';'goose'])

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


Некоторые короткие варианты:

Это работает в принципе (33 байта), но время онлайн-переводчиков истекло:

disp(['duck '+~(1:now)';'goose'])

Добавление нескольких байтов, чтобы сделать вывод короче, делает его 35 или 36 байтов:

disp(['duck '+~(7e5:now)';'goose'])   % Works on octave-online.net
disp(['duck '+~(7.3e5:now)';'goose']) % Works on tio.run

Объяснение:

Я просто объясню последний случайный. Остальные похожи, но используют количество дней с 1 января, 0000 до сегодняшнего дня.

randвозвращает случайное число на интервале (0, 1) . Таким образом, 1/randвозвращает число больше 1 . Поскольку диапазон 1:f, в котором fслучайное число с плавающей точкой больше 1 , идентичен 1:floor(f), 1:1/randсоздает диапазон 1 .. x , где x> = 1 .

Я попытаюсь объяснить это так, как если бы Octave был языком, основанным на стеке.

      'duck '                           % Push the string 'duck ' to the stack
               (1:1/rand)               % Push a vector 1... floor(1/rand)
              ~(1:1/rand)'              % Negate the vector (making it all zeros)
                                        % and transpose it.
             +                          % Add 'duck ' with the vertical vector of zeros
                                        % to implicitly duplicate the string r times
     [                    ;'goose']     % Push the string 'goose' and concatenate
                                        % vertically with the rest
disp(                              )    % Display it all.

disp(['duck '+~pwd';'goose'])? Не уверен, что это «неопределенный» достаточно
Луис Мендо

12

Perl 5 , 20 байт

Сначала практический 26 байтов:

Утки от 1 до 9 раз, прежде чем выгуливаться.

say"Duck
"x(1+$^T%9),Goose

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

Но если у вас много памяти и времени, то эта 20-байтовая версия (как предложено Крисом ) тоже работает:

say"Duck
"x$^T,Goose

Это также предполагает, что проблема 2038 года будет решена для Perl 5 , в противном случае она будет недействительной в течение 1 секунды 20 лет.


Если вы измените 1+$^T%9на просто $^T, он все еще работает, и вы сохраните 4 байта.
Крис

@ Крис У тебя явно больше памяти, чем у меня. Тем не менее, я приму ваше предложение, поскольку существуют разумные компьютеры, на которых он будет работать. Благодарю.
Тон Хоспел

12

Python 2 , 36 34 байта

print"duck\n"*((id(id)%5)+1),"goose"

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

Предложение Кевина Круйссена дает нам 34 байта:

print"duck\n"*-~(id(id)%5),"goose"

3
Добро пожаловать на сайт и приятного первого ответа!
Caird Coneheringaahing

Добро пожаловать в PPCG! Вы можете сыграть в гольф два байта, выбрав вариант, ((id(id)%5)+1)чтобы -~(id(id)%5)избавиться от скобок. Советы по игре в гольф на <все языки> и Советы по игре в гольф на Python может быть интересно прочитать. Приятного пребывания!
Кевин Круйссен

1
Не id(id)может быть id(0)или я что-то упустил?
Джонатан Фрех

@ Джонатан, глядя на id(0)пару разных компьютеров, предполагает, что это константа.
user2699

1
Чуть более интуитивно понятным и больше не будет байтов для вызова id([]). Это должно инициализировать отдельный список при каждом запуске программы, что теоретически должно приводить к разным адресам памяти.
jpmc26

11

Z Shell (+ wget & Netpbm), 168 160 150 148 145 135 120 байт

d(){wget -O- bit.ly/$1|jpegtopnm|pamscale -w 64 -h 64};d DckDkGo|pnmtile 64 $[(RANDOM&7+1)*64]|pnmcat -tb - <(d g005eGG)

Не самое короткое решение, но мне хотелось как-то изменить эту проблему (вдохновленный решением @ AlexG для этой другой проблемы ).

Этот скрипт генерирует изображение PPM, содержащее от 1 до 8 изображений уток и изображение гуся внизу на стандартном выходе. Он загружает две исходные картинки из Википедии, поэтому для его работы необходим доступ в Интернет.

Пример вывода, преобразованный в JPEG через pnmtojpeg :

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


1
Это полностью сделало мой день!
AJFaraday

Я только что понял, что вы тот же человек, который предложил другой вызов, с которым я столкнулся. xD Хорошо, я рад, что тебе понравилось! = D
lucasb

Да, в моем кодексе есть проблемы с гольфом :) Я определенно должен дать бонусные баллы за пиктографические ответы.
AJFaraday

Разве это не стандартная лазейка, чтобы получить внешние ресурсы?
MilkyWay90

10

R 35 байт

cat(rep("duck
",rexp(1)+1),"goose")

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

rexp()производит случайное число из функции экспоненциального убывания. +1чтобы обеспечить хотя бы одну утку. Все строки после первой содержат начальный пробел (который является разделителем по умолчанию cat), но это разрешено.


1
Вероятность выхода более чем одной утки составляет exp(-1)или около 36,8%.
Джузеппе

Он просит напечатать его в каждой строке. Я думаю, что вы должны добавить "\ n" к вашей "утке"
Стюарт Стивенсон

3
@stuartstevenson Здесь я использовал буквальный перевод строки, а не \nна один байт короче. Если вы посетите "Попробуйте онлайн!" По ссылке видно, что эффект тот же.
user2390246

В окне DOS / Windows этот символ новой строки будет по-прежнему иметь два (2) байта. 0x0d0a
горит

10

Баш , 39 38 37 байт

sed s/[0-9]/duck\\n/g<<<$RANDOM\goose

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

Печатает количество уток, равное количеству цифр в целом числе, равномерно распределенном на [0,32767] (так, чаще всего пять уток (хорошее количество уток)).

-1 байт каждый благодаря @Chris и @sch, указывающим на пары кавычек, которые не вытягивают их вес.


1
Добро пожаловать в PPCG!
Steadybox

1
Вы можете сохранить один байты, избавившись от одинарных кавычек до тех пор , как вы замените \nс \\n.
Крис

1
Хорошая идея. Вы можете сделать что-то подобное только с конструкциями bash и без sed для 30 байтов.
Цифровая травма

1
sed s/[0-9]/duck\\n/g<<<$RANDOM\gooseможет сбрить один байт
щ

1
Это sedне совсем портативный. На некоторых платформах вы можете избежать одиночной обратной косой черты \n. На других вы не получите новую строку независимо от того, что вы делаете.
tripleee

9

Pure Bash (без внешних утилит), 25

На основании ответа @ SophiaLechner , это также печатает большое количество уток .

Идея @ OlivierDulac использовать PID оболочки скрипта, сохраненный в $параметре, экономит 5 байтов.

echo "${$//?/duck
}"goose

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


1
если мы предполагаем, что вы запускаете программу, она каждый раз будет получать новый pid. в большинстве случаев это будет 5 цифр, но не всегда. отсюда: перейти RANDOMк $бритью на 5 байт? И можно также сделать очень длинную цепочку уток:yes duck|head -n $$;echo goose
Оливье Дюлак

@OlivierDulac да, я думаю, что использование $$приемлемо - спасибо!
Цифровая травма

пожалуйста! Я опубликовал свою другую версию ( yes duck | head -n $$;echo goose) в качестве альтернативы (дольше, чем у вас, но за 5 дополнительных символов уйма уйм за уток ^^)
Оливье Дюлак,


8

Bash + Coreutils, 36 27 байт

yes duck|sed $$q;echo goose

Печатает слишком много уток (от 2 до cat /proc/sys/kernel/pid_max), затем один гусь.

Спасенные девять байтов благодаря Цифровой Травме и Оливье Дюлаку.

Попробуйте онлайн! (но имейте в виду, что он может иногда обрезаться)

Та же длина, но без echo:

yes duck|sed $${agoose'
q}'

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

aэто команда добавления sedи qвыхода. Оба работают только на линии $$, что соответствует PID.


У Bash есть модуль, хотя это увеличит размер. Попробуйтеhead -n $((1+(RANDOM % 5)))
tripleee

@tripleee Поскольку это кодовый гольф, увеличение размера вывода предпочтительнее, чем увеличение размера кода. И 132767 уток совершенно разумны по сравнению с миллиардом или больше, что вы видите в другом месте;)
Крис

1
Конечно, просто надеяться быть полезным в случае, если кто-то действительно хочет применить это новаторское исследование на практике однажды. Мол, TIO . 44 байта с некоторыми пробелами.
tripleee

@OlivierDulac предложил использовать $$вместо $RANDOMдля моего ответа . Я думаю, что вы могли бы использовать то же самое, чтобы сэкономить 5 байтов. Ох и попробуйте sedтоже:yes duck|sed 1$$q;echo goose
Цифровая травма

На самом деле yes duck|sed $$q;echo gooseвсе в порядке - я не думаю, что ваш сценарий когда-либо получит PID <1.
Digital Trauma

7

PowerShell , 35 30 28 байт

,"duck"*((Random)+1)
"goose"

Попробуйте онлайн! (модифицированная версия)

Создает массив из Get-Randomчисла элементов. Это может занять некоторое время. Это добавляет, +1чтобы гарантировать, что мы получаем по крайней мере один duck. Модифицированная версия также включает -maфлаг ximum, 5так что вы можете видеть, что программа работает, как и ожидалось (модифицированная версия напечатает за 1, 2, 3 или 4 duckс до goose).

Массив и одиночная gooseстрока остаются в конвейере, и неявное Write-Outputдает нам значения, разделенные символом новой строки, бесплатно.

Вы не знаете, как мне было трудно не поменять последнюю строчку на "серая утка" ...


Этот вариант звучит довольно забавно, и, безусловно, стоит
попробовать

1
@AdmBorkBork, этот миннесотец присоединился к этой группе, чтобы добавить +1 к твоей серой утке.
Milwrdfan

0..(random)|%{'duck'};'goose'выглядит как 29, а также будет генерировать где-то до [int] :: MaxValue (2,1 миллиарда) уток перед гусем. (И 0..0печатает утку)
TessellatingHeckler

@TessellatingHeckler Спасибо, но я только что предложил 28-байтовую версию. :)
AdmBorkBork



6

Брахилог , 24 21 байт

-3 байта благодаря Эрику Аутгольферу

"duck"ẉ4ṙ0∧"goose"w∨↰

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

На праздновании Языка месяца мой первый пост на брахилоге. Поток управления на этом языке крут.

Как это устроено:

"duck"ẉ4ṙ0∧"goose"w∨↰
"duck"ẉ                 print duck with a new line
       4ṙ               choose a random number in the range is [0, 4]
         0              verify it equals zero
          ∧             and (short circuits)
           "goose"w     print goose without a newline
                   ∨    or (if it did not equal zero)
                    ↰   repeat the procedure

Итак, если я читаю это справа, оно читается слева направо, снизу вверх?
AJFaraday

2
Язык пытается найти логическую истину, используя только первую строку программы. Моя программа гласит: «Подтвердите вторую строку, затем напечатайте гуся». Затем вторая строка гласит: «печать утка, затем подтвердите случайное число от 0 до 4, равное 0, или подтвердите эту строку снова», так что технически слева направо только верхняя строка, а затем любые предикаты, которые вы вызываете оттуда
PunPun1000

Круто, так интересно узнать, как работают новые языки. Он достиг моего почтового ящика, но я не уверен, что это потому, что я задал вопрос или потому что я уже прокомментировал здесь.
AJFaraday

Вы можете объединить два предиката, как это, и связать меня.
Эрик Outgolfer

6

Редактор Geometry Dash World 2.2 - 4 объекта

Изображение уровня геометрии тире

Объяснение:

Триггер BG является случайным триггером текущего 2.2, поэтому он либо переключает ID группы 1, либо 2.

Первый «УТКА» имеет идентификатор группы 1, что дает 50% шансов быть удаленным или нет (переключенным).

На этом уровне нет объекта с идентификатором группы 2, поэтому есть вероятность 50% отображения 2 «УДАЧ».

Как воспроизвести это:

Первый «УТКА» имеет идентификатор группы 1.

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

У гуся и второй утки нет идентификатора группы введите описание изображения здесь

Внутри случайного триггера. введите описание изображения здесь


Я чувствую тему для этого вызова
Бенджамин Уркхарт

@BenjaminUrquhart Что?
MilkyWay90

Также есть материалы для Word of Warcraft, Minecraft и некоторых других игр.
Бенджамин Уркхарт

2
@BenjaminUrquhart Лучше найди больше игр, чтобы ответить на них
MilkyWay90

5

05AB1E , 15 14 байтов

'Ðœ₁Ωи`.•zíΘ•»

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

Напечатает 2, 5 или 6 уток, а затем гуся.

-1 байт благодаря @Emigna, использующему 'для одного сжатого слова (утка)


1
Вы можете использовать, 'Ðœтак как утка это одно слово.
Emigna

1
Бьет мой:['ÐœTΩ#].•zíΘ•»
Волшебный осьминог Urn

@MagicOctopusUrn Мне очень нравится ваш подход с бесконечным циклом. Ваш ответ определенно больше соответствует духу задачи (или какой он должен был быть?), Поскольку он может выдавать бесконечное количество уток.
Кальдо

@Kaldo все еще, 15 байтов проигрывает твоему;)
Волшебная Осьминога Урна

1
Альтернативный 14-байт:'Ðœ₁Ω.D.•zíΘ•»
Волшебная урна Осьминога


5

Сетчатка , 17 байт

?\\K`duck
K`goose

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

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

Печатает 1 или 2 утки с равной вероятностью.

объяснение

?\\K`duck

Установите рабочую строку duckи напечатайте ее с помощью завершающей строки ( \). Затем он переносится в другой выходной каскад, но ?к нему применяется случайный флаг ( ), поэтому он печатает только с вероятностью 50%.

K`goose

Заменить duckс goose, которая печатается неявно в конце программы.

Вот забавная альтернатива, которая печатает 1 утку с вероятностью 50%, 2 утки с 25%, 3 утки с 12,5% ...:

\K`duck
?+\G`
K`goose

5

Vim (скрипт) в Linux, 46 43 байта (4946 с :в начале строки)

.!date +0\%N\%s6
s/6.*/goose
s/\d/duck\r/g

Выполненный в виде vim -S filenameили вставленная в работе vimс :перед каждой строкой.


2
Добро пожаловать в PPCG! Вы должны быть в состоянии использовать \dболее [0-9]. Кроме того, похоже, что vim не требует завершающего перевода строки, так что это может быть 45 байтов :)
H.PWiz

Добро пожаловать в PPCG!
Steadybox

5

> <> , 31 22 байта

"duck"a>x
r"esoog"<>o<

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

-9 байт на основе ревизии не дерева


1
Вы можете удалить l?!;и выйти с ошибкой.
Emigna

1
И вы могли бы сохранить еще немного, как это
Emigna

1
Или вот так .
Не дерево

3
@ Нет, я иногда заставляю его печатать "\ nkcud \ nkcud ...". Это редко ведет себя правильно
Suppen

1
@Suppen Только использование стрелки вместо зеркала исправляет это; см редактировать
KSmarts

5

Befunge 98 , 38 30 25 байт

"esooG"v>:#,_@
"Duck"a<?<

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

  • Спасибо @JoKing за снятие бесполезного батута
  • Переход на Befunge 98 для более короткой новой строки - теперь Duckвписывается в одну строку

1
Вам не нужно во #второй строке
Джо Кинг,

И «технически», whitespace within a line is fineтак что вы можете вырезать пару цитат (даже если результат выглядит странно)
Джо Кинг,

@JoKing Спасибо, смотрите мои изменения.
Винсент

5

T-SQL , 70 44 43 байта (много уток)

while rand()<.9print'duck'print'duck
goose'

Спасибо @Zac Faragher!

Пересмотренная версия, 54 43 40 байт (1 или 2 утки)

Спасибо @BradC!

if rand()<.5print'duck'print'duck
goose'


Я не могу заставить это работать правильно в SQL Fiddle , но он прекрасно работает в LINQPad и SSMS.

Не уверен, что это известное ограничение SQL Fiddle или я просто делаю что-то не так


Приятно. Вплоть до 61 , если вы измените selectк printи заменить окончательный 'duck'select'goose'с 'duck(linebreak)goose'(с буквальным LineBreak, конечно)
BradC

На самом деле, вы можете просто сделать while rand()<.5print'duck'print'duck(linebreak)goose'за 43.
BradC

Хорошо, спасибо @BradC. Есть ли другой способ представить разрыв строки в строке, кроме добавления символа (13)?
Вероятно,

Да, просто буквально поместите возврат в кавычки, я отредактирую ваш пост, чтобы показать вам (комментарии не показывают возвращений).
BradC

1
Сохраните еще 3 байта: измените первый whileна if. Печатает (случайным образом) одну утку или две, что (я считаю) все еще удовлетворяет вызов.
BradC

5

Powershell - 31 30 байт

Предупреждение : Скорее всего, у вас будет много уток. Randomвключает в себя значения от 0 до Int32.MaxValueтак, в зависимости от того, насколько случайным является ваше число, это может быть много крякать.

1..(Random)|%{"Duck"};"Goose"

Вы не должны нуждаться $в (Random). Попробуйте онлайн!
AdmBorkBork

@AdmBorkBork спасибо за улов!
SomeShinyObject



4

Befunge

57 35 байт (периметр всего поля - 19x3 17x2 символов). Спасибо karhell за улучшение.

55+"kcud",,,,,#v?
  @,,,,,"goose"<

Вторая строка помещает утку и новую строку в стек (назад) и выводит ее в виде строки. После этого 75% шансов вернуться к началу и снова напечатать утку, 25% (когда знак вопроса решит понизиться) напечатать гуся и остановиться.


Если 50% -ный шанс гуси допустим, 55+"kcud",,,,,#v?(linebreak here) @,,,,,"goose"< ваш код будет сокращен до 35 байт
karhell

Ах, сладкое укутывание. Вы правы, спасибо, позже выложу обновление!
rael_kid
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.