Переезд в школу (день 1)

21

Вызов с разрешения моего конкурса университетского кода


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

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

Вызов

Учитывая количество учащихся в текущих группах и новых классных комнатах (вместимость), выведите истинное значение, если можно назначить разные классы с достаточной вместимостью для каждой из текущих групп, или значение Фальси в противном случае.

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

Input: groups of students => [10, 20, 30], classrooms capacity => [31, 12, 20]
Output: True

Input: groups of students => [10, 20, 30], classrooms capacity => [100, 200]
Output: False

Input: groups of students => [20, 10, 30], classrooms capacity => [20, 20, 50, 40]
Output: True

Input: groups => [30, 10, 30, 5, 100, 99], classrooms => [40, 20, 50, 40, 99, 99]
Output: False

Input: groups => [], classrooms => [10, 10, 10]
Output: True

Input: groups => [10, 10, 10], classrooms => []
Output: False

Input: groups => [], classrooms => []
Output: True

Input: groups => [10, 1], classrooms => [100]
Output: False

Input: groups => [10], classrooms => [100, 100]
Output: True

Input: groups => [1,2,3], classrooms => [1,1,2,3]
Output: True

Заметки

  • Вы можете принять вход в любом разумном формате
  • Вы можете вывести любое значение Truthy / Falsey ( 1/0, True/Falseи т. Д.)
Луис Фелипе Де Иисус Муньос
источник
5
Предлагаемый тест:g=[1,2,3], c=[1,1,2,3]
TFeld
У вас есть разрешение опубликовать это здесь?
адам
2
@ Адам Да. Я спросил своего учителя (который отвечает за конкурс), и он сказал, что нет проблем. Единственное, что это один вызов каждый день
Луис Фелипе Де Иисус Муньос
Является 0ли действительным значение для групп или классных комнат?
Ними
1
@ Shaggy Любая ложная / правдивая ценность
Луис Филипе Де Иисус Муньос

Ответы:

14

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

Всегда приятно видеть вызов и знать, что брахилог победит всех. Принимает текущие классы в качестве входных данных и новые классные комнаты в качестве выходных данных; Он выведет true, если найдет способ соответствовать студентам, иначе false

p≤ᵐ⊆

объяснение

Код состоит из 3 частей, порядок которых не имеет значения

≤ᵐ --> projects each value to a value bigger/equal then input
⊆  --> input is a ordered subsequence of output
p  --> permutes the list so it becomes a unordered subsequence

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

Kroppeb
источник
4

Pyth, 11 байт

.AgM.t_DMQ0

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

.AgM.t_DMQ0   Implicit: Q=eval(input())
      _DMQ    Sort each element of Q in reverse
    .t    0   Transpose, padding the shorter with zeroes
  gM          Element wise test if first number >= second number
.A            Are all elements truthy? Implicit print
Sok
источник
4

Желе , 9 байт

Принимает классные комнаты в качестве первого аргумента и группы в качестве второго аргумента.

Œ!~+Ṡ‘ḌẠ¬

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

комментарии

NB: это Ṡ‘ḌẠ¬слишком долго. Но я подозреваю, что в любом случае это неправильный подход.

Œ!~+Ṡ‘ḌẠ¬  - main link taking the classrooms and the groups e.g. [1,1,2,3], [1,2,3]
Œ!         - computes all permutations of the classrooms    -->  [..., [1,2,3,1], ...]
  ~        - bitwise NOT                                    -->  [..., [-2,-3,-4,-2], ...]
   +       - add the groups to each list; the groups fits   -->  [..., [-1,-1,-1,-2], ...]
             in a given permutation if all resulting values
             are negative
    Ṡ      - take the signs                                 -->  [..., [-1,-1,-1,-1], ...]
     ‘     - increment                                      -->  [..., [0,0,0,0], ...]
      Ḍ    - convert from decimal to integer                -->  [..., 0, ...]
       Ạ   - all truthy?                                    -->  0
        ¬  - logical NOT                                    -->  1
Arnauld
источник
4

Japt , 9 байт

ñÍí§Vñn)e

Попробуйте или запустите все тестовые случаи на TIO

ñÍí§Vñn)e     :Implicit input of arrays U=students, V=classrooms
ñ             :Sort U by
 Í            :  Subtracting each integer from 2
  í           :Interleave with
    Vñn       :  V sorted by negating each integer
   §          :  Reduce each pair by checking if the first is <= the second
       )      :End interleaving
        e     :All true?

ñÍeȧVn o

Попробуйте или запустите все тестовые случаи на TIO

ñÍeȧVn o     :Implicit input of arrays U=students, V=classrooms
ñ             :Sort U by
 Í            :  Subtracting each integer from 2
  e           :Does every element return true
   È          :When passed through the following function
    §         :  Less than or equal to
     Vn       :  Sort V
        o     :  Pop the last element
мохнатый
источник
Из любопытства, почему в 2 - nIn Japt встроен однобайтовый код? Какие варианты использования он должен оправдать, что он является 1-байтовым встроенным?
Кевин Круйссен
1
Хороший вопрос, @KevinCruijssen. Íявляется ярлыком для n2<space>и был создан для использования со строками, преобразовывая их из чисел от base-2 до base-10 (довольно распространенная необходимость). Однако nметод, когда применяется к числу, вычитает это число из аргумента метода (по умолчанию = 0). Поэтому здесь, хотя вычитания из числа 0будет достаточно для сортировки массива в обратном порядке, использование ярлыка экономит мне лишний байт ñn<space>. Я мог бы также использовать его при сортировке, Vно он не сохранил бы никаких байтов, так как мне все еще нужен был бы пробел, а не ), чтобы закрыть íметод.
Лохматый
3

MATL , 10 байт

yn&Y@>~!Aa

Попробуйте онлайн! Или проверьте все тестовые случаи .

объяснение

Рассмотрим входы [20, 10, 30], в [20, 20, 50, 40]качестве примера. Стек отображается снизу вверх.

y     % Implicit inputs. Duplicate from below
      % STACK: [20 10 30]
               [20 20 50 40]
               [20 10 30]
n     % Number of elements
      % STACK: [20 10 30]
               [20 20 50 40]
               3
&Y@   % Variations. Gives a matrix, each row is a variation
      % STACK: [20 10 30]
               [20 10 30
                20 20 40
                20 20 40
                ···
                50 40 20]
>~    % Less than? Element-wise with broadcast
      % STACK: [1 1 1
                1 1 1
                1 1 1
                ···
                1 1 0]
!     % Transpose
      % STACK: [1 1 1 ··· 0
                1 1 1 ··· 1
                1 1 1 ··· 1]
A     % All. True for columns that only contain nonzeros
      % STACK: [1 1 1 ··· 0]
a     % Any. True if the row vector contains at least a nonzero. Implicit display
      % STACK: 1
Луис Мендо
источник
3

05AB1E , 14 12 8 байт

€{í0ζÆdP

Port of @Sok 's Pyth answer , так что не забудьте также поддержать его!

Принимает входные данные в виде списка списков, с классным списком в качестве первого элемента и групповым списком в качестве второго элемента.

Попробуйте онлайн или проверьте все контрольные примеры .

Объяснение:

€{         # Sort each inner list
  í        # Reverse each inner list
   0ζ      # Zip/transpose; swapping rows/columns, with 0 as filler
     Æ     # For each pair: subtract the group from the classroom
      d    # Check if its non-negative (1 if truthy; 0 if falsey)
       P   # Check if all are truthy by taking the product
           # (and output implicitly)

Старый 12-байтовый ответ:

æε{I{0ζÆdP}à

Сначала берет список классов, а затем список групп.

Попробуйте онлайн или проверьте все контрольные примеры .

Объяснение:

æ             # Take the powerset of the (implicit) classroom-list,
              # resulting in a list of all possible sublists of the classrooms
 ε            # Map each classroom sublist to:
  {           #  Sort the sublist
   I{         #  Take the group-list input, and sort it as well
     0ζ       #  Transpose/zip; swapping rows/columns, with 0 as filler
       Æ      #  For each pair: subtract the group from the classroom
        d     #  Check for everything if it's non-negative (1 if truthy; 0 if falsey)
         P    #  Check if all are truthy by taking the product
            # After the map: check if any are truthy by getting the maximum
              # (and output the result implicitly)
Кевин Круйссен
источник
1
Хе-хе, я был приятно удивлен, что Пиф обошел 05AB1E за изменения, но оказалось, что это был алгоритм в конце концов: oP
Сок
1
@Sok Извините, что разочаровал вас. ; p Но спасибо за -4 байта. : D
Кевин Круйссен
3

C # (интерактивный компилятор Visual C #) , 77 74 байта

a=>b=>a.Count==a.OrderBy(x=>-x).Zip(b.OrderBy(x=>-x),(x,y)=>x>y?0:1).Sum()

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

Код комментария:

// a: student group counts
// b: classroom capacities
a=>b=>
  // compare the number of student
  // groups to...
  a.Count==
  // sort student groups descending
  a.OrderBy(x=>-x)
     // combine with classroom
     // capacities sorted descending
     .Zip(
        b.OrderBy(x=>-x),
        // the result selector 1 when
        // the classroom has enough
        // capacity, 0 when it doesn't
        (x,y)=>x<y?0:1
     )
     // add up the 1's to get the number
     // of student groups who can fit
     // in a classroom
     .Sum()
Dana
источник
1
Я не смог найти для этого подходящего варианта. Хорошая работа!
Воплощение Невежества
2

Инструменты Bash + GNU, 68 байт

(sort -nr<<<$2|paste -d- - <(sort -nr<<<$1)|bc|grep -- -)&>/dev/null

69 байт

(paste -d- <(sort -nr<<<$2) <(sort -nr<<<$1)|bc|grep -- -)&>/dev/null

TIO

принимает студенческие комнаты в качестве первого и второго аргумента в качестве строковых чисел, разделенных символом новой строки, возвращает состояние выхода 1 для true или 0 для false

Науэль Фуйе
источник
2

Perl 5 -pal , 67 62 байта

@NahuelFouilleul сэкономил 5 байтов с перестановкой и grep

$_=!grep$_>0,map$_-(sort{$b-$a}@F)[$x++],sort{$b-$a}<>=~/\d+/g

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

67-байтовая версия

Принимает разделенный пробелами список размеров класса в первой строке и разделенный пробелами список размеров комнаты в следующей.

Xcali
источник
-5 байт
Науэль Фуйе
2

Common Lisp, 74 байта

(defun c(s r)(or(not(sort s'>))(and(sort r'>)(<=(pop s)(pop r))(c s r))))

Номера уменьшенная

(defun can-students-relocate (students rooms)
  (or (not (sort students #'>))
      (and (sort rooms #'>)
           (<= (pop students)
               (pop rooms))
           (can-students-relocate students rooms))))

Попробуй это

Обратите внимание, что sort постоянно изменяет список, а pop повторно связывает переменную со следующим элементом.

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

  1. Нет учеников - возврат Т
  2. Студенты, но нет комнат - вернуть NIL
  3. Студенты и комнаты, но самая большая группа студентов больше, чем самая большая комната - вернуть NIL
Charlim
источник
1

Сетчатка 0.8.2 , 50 байт

\d+
$*
%O^`1+
%`$
,
^((1*,)(?=.*¶((?>\3?)1*\2)))*¶

Попробуйте онлайн! Ссылка включает тестовый набор. Принимает два списка групп и комнат (набор тестов использует в ;качестве разделителя списка). Объяснение:

\d+
$*

Преобразовать в одинарный.

%O^`1+

Обратная сортировка каждого списка в отдельности.

%`$
,

Добавьте запятую в каждый список.

^((1*,)(?=.*¶((?>\3?)1*\2)))*¶

Убедитесь, что каждое из чисел в первом списке может быть сопоставлено с соответствующим номером во втором списке. Каждый раз \3содержит ранее согласованные комнаты, и \2поэтому следующая группа должна уместиться в следующую комнату. В (?>\3?)ручках случае с первой комнатой , когда нет предыдущих номеров пока.

Нил
источник
1

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

W∧⌊講⌈§θ¹⌈§θ⁰UMθΦκ⁻ν⌕κ⌈κ¬⊟θ

Попробуйте онлайн! Ссылка на подробную версию кода. Принимает список списков комнат и групп и выходные данные, -если комнаты могут вместить группы. Объяснение:

W∧⌊講⌈§θ¹⌈§θ⁰

Повторите, пока группа может быть назначена на комнату.

UMθΦκ⁻ν⌕κ⌈κ

Удалить самую большую комнату и группу из их списков.

¬⊟θ

Убедитесь, что не осталось нераспределенных групп.

Нил
источник
1

JavaScript, 56 байт

s=>c=>s.sort(g=(x,y)=>y-x).every((x,y)=>c.sort(g)[y]>=x)

Попытайся

мохнатый
источник
Не подходит для групп 7и 9в классах 8и 10.
Нил
Спасибо за указание на это, @Neil. Я задавался вопросом, не вернется ли голый вид, чтобы кусать меня в задницу! Мне придется вернуться к исходному решению, пока я не найду время, чтобы попробовать еще раз.
Лохматый
1

Perl 6 , 34 байта

{none [Z>] $_>>.sort(-*)>>[^.[0]]}

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

Принимает входные данные в виде списка из двух списков, групп и классных комнат, и возвращает None Junction, который может быть увеличен до true / false.

Объяснение:

{                                }   # Anonymous code block
           $_>>.sort(-*)             # Sort both lists from largest to smallest
                        >>[^.[0]]    # Pad both lists to the length of the first list
 none                                # Are none of
      [Z>]                           # The groups larger than the assigned classroom
Джо Кинг
источник
1

Рубин , 57 байт

->c,r{r.permutation.any?{|p|c.zip(p).all?{|a,b|b&&a<=b}}}

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

Берут cдля занятий, rдля комнат. Проверяет все перестановки комнат вместо использования сортировки, потому что обратная сортировка стоит слишком много байтов. Тем не менее выглядит довольно долго, хотя ...

Кирилл Л.
источник
1

C # (интерактивный компилятор Visual C #) , 105 93 91 82 81 79 77 76 74 байта

Теперь соответствует счету Даны!

n=>m=>{n.Sort();m.Sort();int i=m.Count-n.Count;i/=n.Any(b=>m[i++]<b)?0:1;}

Выдает ошибку, если ложь, ничего, если правда.

-12 байт благодаря @Destrogio!

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

объяснение

//Function taking in a list, and returning another function
//that takes in a list and doesn't return
n=>m=>{
  //Sort the student groups from smallest to largest
  n.Sort();
  //Sort the classrooms fom smallest capacity to largest
  m.Sort();
  //Initialize a variable that will function as a sort of index
  int i=m.Count-n.Count;
  //And divide that by...
  i/=
    //0 if any of the student groups...
    n.Any(b=>
      //Don't fit into the corresponding classroom and incrementing i in the process
      /*(In the case that a the amount of classrooms are less than the amount of
      student groups, an IndexOutOfRangeException is thrown)*/
      m[i++]<b)?0
    //Else divide by 1
    :1;
}
Воплощение невежества
источник
93 байта - попробуйте онлайн!
Destroigo
1
@Destrogio Спасибо!
Воплощение Невежества
0

Java (OpenJDK 8) , 183 байта

a->{int b=a[0].length;Arrays.sort(a[0]);Arrays.sort(a[1]);if(b>a[1].length){return false;}for(int i=0;i<b;i++){if(a[0][i]>a[1][i]){return false;}}return true;}

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

С небольшим полезным советом от Кевина Круйссена и просто еще одним взглядом на мой код, я могу уменьшить свой счет на целых 9%, просто заменив три английских слова!

Java (OpenJDK 8) , 166 байт

a->{int b=a[0].length;Arrays.sort(a[0]);Arrays.sort(a[1]);if(b>a[1].length){return 0;}for(int i=0;i<b;){if(a[0][i]>a[1][i++]){return 0;}}return 1;}

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

X1M4L
источник
Вы должны будете включить import java.util.*;в свой счетчик байтов. Однако вы можете играть в гольф его 144 байт в Java 8, или 140 в Java 10 путем замены booleanс var.
Кевин Круйссен
PS: Если вам нужно true/ falseв вашем коде, 1>0/ 0>1более короткие альтернативы . :)
Кевин Круйссен
на самом деле, я не забыл включить дополнительные 24 байта в мой счет! (Я полагаю, что вы сообщили мне об этом правиле несколько месяцев назад XD), но спасибо за совет! Я дам ему шанс!
X1M4L
3
Это не проходит последний контрольный пример.
Лохматый
Что 1/0касается вашей 166-байтовой версии: хотя состояние вопроса вы можете вернуть, и я думаю, что в этом случае это нормально, учтите, что в Java, в отличие от Python, JavaScript, C и т. Д. 1/0Обычно не рассматриваются как допустимые выходные данные true / falsey . И в своем первом комментарии я упомянул 144-байтовую версию . :) Хотя теперь он также недействителен, потому что он не работает в последнем тестовом примере, как упомянуто @Shaggy .
Кевин Круйссен
0

PowerShell , 80 байт

param($s,$c)!($s|sort -d|?{$_-gt($r=$c|?{$_-notin$o}|sort|select -l 1);$o+=,$r})

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

Менее гольф тестовый скрипт:

$f = {

param($students,$classrooms)
$x=$students|sort -Descending|where{          
    $freeRoomWithMaxCapacity = $classrooms|where{$_ -notin $occupied}|sort|select -Last 1
    $occupied += ,$freeRoomWithMaxCapacity    # append to the array
    $_ -gt $freeRoomWithMaxCapacity           # -gt means 'greater than'. It's a predicate for the 'where'
}                                             # $x contains student groups not assigned to a relevant classroom
!$x                                           # this function returns a true if $x is empty

}

@(
    ,(@(10, 20, 30), @(31, 12, 20), $true)
    ,(@(10, 20, 30), @(100, 200), $False)
    ,(@(20, 10, 30), @(20, 20, 50, 40), $True)
    ,(@(30, 10, 30, 5, 100, 99), @(40, 20, 50, 40, 99, 99), $False)
    ,(@(), @(10, 10, 10), $True)
    ,(@(10, 10, 10), @(), $False)
    ,(@(), @(), $True)
    ,(@(10, 1), @(100), $False)
    ,(@(10), @(100, 100), $True)
    ,(@(1,2,3), @(1,1,2,3), $True)
) | % {
    $students, $classrooms, $expected = $_
    $result = &$f $students $classrooms
    "$($result-eq$expected): $result"
}
Mazzy
источник