Codegolf - Черно-Белые Рубашки

  • Автор темы Андрей Н
  • Обновлено
  • 23, Oct 2024
  • #1

Эта головоломка основана на этот пост Math.SE. Более сложную версию этой проблемы можно найти здесь.

Предположим, у меня есть некоторое количество черных рубашек и некоторое количество белых рубашек, обе не менее 1. Оба цвета рубашек имеют ненулевую прочность. Все рубашки данного цвета имеют одинаковую прочность.

Каждый день я выбираю чистую рубашку, а она становится грязной. Как только у меня заканчиваются все чистые черные рубашки или все чистые белые рубашки, я стираю все свои грязные рубашки обоих цветов и начинаю все сначала. Чистые рубашки не стираются. Каждый раз, когда рубашку стирают, ее долговечность снижается на единицу. Если сразу после стирки износ рубашки достигнет 0, ее необходимо выбросить.

Выбирая рубашку определенного цвета, я всегда выбираю рубашку с самой высокой прочностью этого цвета, чтобы обеспечить равномерный износ рубашек.

Испытание:

Возьмите последовательность из двух символов бесконечной длины (например, b b b w b w w b...), представляющую мой выбор рубашки, которую я надену в этот день. Продолжайте выполнение до тех пор, пока не выбросите мою последнюю черную рубашку или мою последнюю белую рубашку. Как только это произойдет, прекратите использование входных данных и немедленно остановите выполнение. Обратите внимание, что программа не должна потреблять больше входных данных, чем требуется перед остановкой.

Входы:

Количество черных рубашек, количество белых рубашек, долговечность черных рубашек, долговечность белых рубашек и бесконечное количество двух отдельных символов на ваш выбор (например, b и w)

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

Выход:

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

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

Тестовые случаи:

Следующие тестовые примеры представляют объем входных данных, которые программа должна обработать перед остановкой. Последовательность w и b бесконечна. Последующие скобки не являются частью ввода или вывода, а просто представляют собой конечное состояние того, сколько рубашек каждого цвета не было выброшено.

 1 1 1 1 b
(0 b, 1 w left)

1 999 1 999 b
(0 b, 999 w left)

1 999 1 999 w w w w w w w w b
(0 b, 999 w left)

2 999 1 999 b w w w b
(0 b, 999 w left)

2 999 2 999 b w w w b w b w w w b
(0 b, 999 w left)

5 6 3 1 w w w w w b b b b b b b b b b b b b b w
(5 b, 0 w left)
 

Общие правила:

  • Это , поэтому побеждает самый короткий ответ в байтах.
  • Правила ввода по умолчанию применяются к первым четырем аргументам. Для входной последовательности произвольной длины после первых четырех аргументов входные данные должны поступать из источника, который может предоставлять ввод по одному символу или байту за раз, теоретически бесконечной длины, например STDIN или какой-либо другой поток. Если выбранный вами язык не поддерживает эти функции, см. выше.

#код-гольф #код-гольф #математика

Андрей Н


Рег
21 Oct, 2020

Тем
89

Постов
198

Баллов
673
  • 26, Oct 2024
  • #2

05AB1E, 14 байт

 
 
 
 
 
 
 
 
 
 
 
 
 b,w,B,W=input()
l=[B*b,W*w]
while all(l):l[input()]-=1
 

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

Использование sub f0 { #as f() but ungolfed my($countb,$countw,$durb,$durw,$get_todays_color)=@_; #inputs my @s=( (map{{col=>'b',dur=>$durb,clean=>1}}1..$countb), #init @shirts (map{{col=>'w',dur=>$durw,clean=>1}}1..$countw) ); while(join("",sort(map$$_{col},@s))=~/bw/){ #while still both colors available my $col = &$get_todays_color; #todays color my @w = grep $$_{clean} && $$_{col} eq $col, @s; #wearable shirts my $s = (sort{$$b{dur}<=>$$a{dur}}@w)[0]; #pick shirt with most durability left for today $$s{clean}=0; #dirty in the evening map{$$_{clean}=1;$$_{dur}--}grep!$$_{clean},@s if @w==1; #wash if there was only one this morning @s=grep$$_{dur}>0,@s; #toss out worn outs } @s #return not worn out } вместо (x b, y w left) , потому что розовый красивее черного.

Объяснение:

sub f{@s=map[$_>$_[0]?'w':'b',$_>$_[0]?$_[3]:$_[2],1],1..$_[0]+$_[1];while(join('',map$$_[0],@s)=~/bw|wb/){$c=&{$_[4]};(@w=grep$$_[2]&&$$_[0]eq$c,@s)[0][2]=0;@s=grep$$_[2]||++$$_[2]&&--$$_[1],@s if@w<2}@s} ||answer||

05AB1E, 28 22 байты

class P{static void Main(string[]a){int b=int.Parse(a[0]);int g=int.Parse(a[1]);int q=g;int r=int.Parse(a[2]);int t=int.Parse(a[3]);int w=t;while(true){if(System.Console.ReadKey().KeyChar<104)q--;else w--;if(q<1){q=g;b--;}if(w<1){w=t;r--;}if(r<1|b<1)return;}}}

Входные данные разделяются символами новой строки в порядке main(a,b,c,d){scanf("%d%d%d%d",&a,&b,&c,&d);a*=c;for(b*=d;a*b;~c?b-=!c:a--)c=getchar()-2;} , where white shirts are §≔υ℅ι⊖§υ℅ι и черные рубашки W∧⌊υS .

-3 байта благодаря @Грими обратив мое внимание на то, что ввод F²⊞υ×NN / w instead of b / w разрешено для рубашек.

Попробуйте онлайн или попробуйте онлайн с дополнительным b to print shirts without popping to verify it works as intended.

Объяснение:

F²⊞υ×NNW∧⌊υS§≔υ℅ι⊖§υ℅ι ||answer||

Древесный уголь, 22 байта

* # Multiply the first two (implicit) input-integers U # Pop and store it in variable `X` * # Multiply the next two (implicit) input-integers V # Pop and store it in variable `Y` [ # Start an infinite loop: XY*_i } # If either `X` or `Y` is 0: õ # Push an empty string, since we don't want any (implicit) output q # And stop the program © # Store the next (implicit) input in variable `®` (without popping) Xα # Get it's absolute difference with `X` (basically `X-input`) U # Pop and store it as new value for `X` ®≠ # Push `®` falsified (1→0; 0→1) Y - # Then subtract it from `Y`: `Y-falsified(®)` V # And also pop and store it as new value for `Y`

Попробуйте онлайн! Ссылка на подробную версию кода. Требуются оба значения черной рубашки, затем оба значения белой рубашки, затем поток = and "b" символы на отдельных строках, в противном случае поведение не определено. В TIO, если вы не предоставили достаточно рубашек, вы увидите, что Charcoal попытается запросить ввод; если бы вы запускали локально, вы могли бы продолжить ввод "w" and 0 символы, пока у вас не закончатся рубашки, после чего программа завершится. Объяснение:

1

Рассчитайте срок службы рубашек каждого цвета.

0

Повторяйте, пока не закончится один цвет.

1

Сократите срок службы рубашки в зависимости от ее цвета.

 

Adventura


Рег
16 Aug, 2011

Тем
60

Постов
186

Баллов
516
  • 26, Oct 2024
  • #3

С(тсс), 117 116 90 байт

Использует 0x01 вместо b и 0x02 вместо w.

amountOfWhiteShirts, whiteDurability, amountOfBlackShirts, blackDurability, shirtDigits...

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

 

123qww


Рег
04 Jun, 2014

Тем
95

Постов
180

Баллов
675
  • 26, Oct 2024
  • #4

С# .NET, 260 байт

*U*V[XY*_iõq}©XαUY®≠-V

Нет ТИО :(
Не самый короткий, но отлично справляется со своей задачей!
РЕДАКТИРОВАТЬ: ПРИМЕЧАНИЕ: не использует пробелы во вводе и (g)reen и (r)ed вместо (b)lack и (w)hite

 

Dakman


Рег
21 Apr, 2016

Тем
74

Постов
192

Баллов
572
  • 26, Oct 2024
  • #5

Перл 5, 205 байт

* # number of white shirts * durability of white shirts Š # swap * # number of pink shirts * durability of pink shirts ‚ # pair the two products in a list [ # infinite loop I # get the next input = # print (only in the TIO version, not actually needed) C # convert from binary (this yields 51 for p and 58 for w, don't ask why) Ó # list of exponents in the prime factorization - # subtract from the durability list W_i # if the minimum of the list is now 0 õq # exit without printing anything

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

Я предположил, что выбор наименее изношенной рубашки каждый день на самом деле не влияет на результат. Подойдет любая чистая рубашка выбранного цвета. Я также думаю, что 2 рубашки с прочностью 5 — это то же самое, что 1 рубашка с прочностью 10, поэтому мы можем упростить это, чтобы иметь только две рубашки, одну черную и одну белую, но это повлияет на напечатанное изображение. b result so I didn't go that direction.

Негольфед:

p ||answer||

Питон 2, 54 байта

*Š*‚[ICÓ-W_iõq

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

 

Жанна Михайловна


Рег
28 Oct, 2020

Тем
54

Постов
204

Баллов
494
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно