Переезд в школу (день 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ли действительным значение для групп или классных комнат?
Ними

Ответы:


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

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


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

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

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()

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-байтовая версия

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



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


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;
}


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;}

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


Вы должны будете включить 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"
}

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