Przeprowadzka szkoły (dzień 1)

21

Wyzwanie Podjęte za zgodą mojego konkursu na University Code Challenge


Od kilku lat liczba uczniów w mojej szkole stale rośnie. Najpierw liczba uczniów została zwiększona o klasę, ale następnie konieczne było przekształcenie niektórych miejsc dla niektórych grup, aby mogły tam prowadzić zajęcia, takie jak stojaki na siłownię lub, w tym ostatnim kursie, do sali miotły.

W ubiegłym roku władze akademickie uzyskały budżet na budowę nowego budynku i rozpoczęły prace. W końcu zostały ukończone i nowy budynek może już być używany, więc możemy się poruszać (stary budynek zostanie odnowiony i zostanie wykorzystany do innej funkcji), ale złapał nas w połowie trasy. Reżyser chce wiedzieć, czy przeprowadzka będzie możliwa bez podziału lub łączenia grup, czy też niektórzy studenci muszą zmieniać grupy.

Wyzwanie

Biorąc pod uwagę liczbę uczniów obecnych grup i nowych sal lekcyjnych (pojemność), wyprowadzaj prawdziwą wartość, jeśli możliwe jest przypisanie innej klasy, o wystarczającej pojemności, każdej z obecnych grup, lub wartość falsey w przeciwnym razie.

Przypadki testowe

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

Notatki

  • Możesz pobrać dane wejściowe w dowolnym rozsądnym formacie
  • Można wyprowadzać dowolną wartość Truthy / Falsey ( 1/0, True/Falseitp ...)
Luis Felipe De Jesus Munoz
źródło
5
Sugerowany g=[1,2,3], c=[1,1,2,3]
przypadek testowy
Czy masz pozwolenie na opublikowanie go tutaj?
Adám
2
@ Adám Tak. Zapytałem mojego nauczyciela (który jest odpowiedzialny za konkurs) i powiedział, że nie ma problemu. Chodzi tylko o to, że jest to jedno wyzwanie każdego dnia
Luis Felipe De Jesus Munoz
Czy 0obowiązuje wartość dla grup lub klas?
nimi
1
@Shaggy Any falsey / truey value
Luis felipe De jesus Munoz

Odpowiedzi:

14

Brachylog , 4 bajty

Zawsze miło jest widzieć wyzwanie i wiedzieć, że Brachylog pokona wszystkich. Bierze bieżące klasy jako dane wejściowe i nowe klasy jako dane wyjściowe; Wynikiem będzie prawda, jeśli znajdzie sposób na dopasowanie się do studentów, w przeciwnym razie fałsz

p≤ᵐ⊆

Wyjaśnienie

Kod składa się z 3 części, których kolejność w rzeczywistości nie ma znaczenia

≤ᵐ --> 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

Wypróbuj online!

Kroppeb
źródło
4

Pyth, 11 bajtów

.AgM.t_DMQ0

Pobiera dane wejściowe jako listę list, najpierw wielkości w klasie, rozmiary grupy w drugiej kolejności. Spróbuj go online tutaj , lub sprawdzić wszystkie przypadki testowe od razu tutaj .

.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
źródło
4

Galaretka , 9 bajtów

Traktuje klasy jako pierwszy argument, a grupy jako drugi argument.

Œ!~+Ṡ‘ḌẠ¬

Wypróbuj online!

Skomentował

NB: To Ṡ‘ḌẠ¬zdecydowanie za długo. Podejrzewam jednak, że i tak nie jest to właściwe podejście.

Œ!~+Ṡ‘ḌẠ¬  - 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
źródło
4

Japt , 9 bajtów

ñÍí§Vñn)e

Wypróbuj lub uruchom wszystkie przypadki testowe na 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

Wypróbuj lub uruchom wszystkie przypadki testowe na 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
Kudłaty
źródło
Z ciekawości, dlaczego w 2 - nIn Japt jest wbudowany jednobajtowy kod? Jakiego rodzaju przypadki użycia musi uzasadniać, że jest wbudowanym 1-bajtem?
Kevin Cruijssen
1
Dobre pytanie, @KevinCruijssen. Íjest skrótem do n2<space>i został stworzony do użytku z ciągami znaków, konwertując je z liczb base-2 na base-10 (dość powszechna potrzeba). Jednak nmetoda zastosowana do liczby odejmuje tę liczbę od argumentu metody (domyślnie = 0). Tak więc tutaj, chociaż odejmowanie 0wystarczyłoby do posortowania tablicy w odwrotnej kolejności, użycie skrótu oszczędza mi bajt ñn<space>. Mógłbym go również użyć podczas sortowania, Vale nie zaoszczędziłoby to żadnych bajtów, ponieważ nadal potrzebowałbym spacji, zamiast ), aby zamknąć ímetodę.
Kudłaty
3

Python 2 , 49 bajtów

Sygnały wyjściowe według kodu wyjścia nie powiodły się w przypadku danych wejściowych fałsz.

g,r=map(sorted,input())
while g:g.pop()>r.pop()>y

Wypróbuj online!

ovs
źródło
3

MATL , 10 bajtów

yn&Y@>~!Aa

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

Rozważmy wejść [20, 10, 30], [20, 20, 50, 40]jako przykład. Stos pokazano od dołu do góry.

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
Luis Mendo
źródło
3

05AB1E , 14 12 8 bajtów

€{í0ζÆdP

Port Pyth @Sok , więc pamiętaj, aby go również głosować!

Traktuje dane wejściowe jako listę list, z listą klas jako pierwszą pozycją, a listą grup jako drugą pozycją.

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

€{         # 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)

Stara 12-bajtowa odpowiedź:

æε{I{0ζÆdP}à

Najpierw bierze listę klas, a następnie listę grup.

Wypróbuj online lubsprawdź wszystkie przypadki testowe .

Wyjaśnienie:

æ             # 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)
Kevin Cruijssen
źródło
1
Hehe, byłem mile zaskoczony, że Pyth pokonał 05AB1E dla odmiany, ale okazało się, że był to w końcu algorytm: oP
Sok
1
@Sok Przepraszamy za rozczarowanie. ; p Ale dziękuję za -4 bajty. : D
Kevin Cruijssen
3

C # (interaktywny kompilator Visual C #) , 77 74 bajtów

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

Wypróbuj online!

Skomentowany kod:

// 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
źródło
1
Nie byłem w stanie znaleźć rozsądnego jednuliniowego. Dobra robota!
Wcielenie nieznajomości
2

Haskell, 66 bajtów

import Data.List
q=sortOn(0-)
x#y=and$zipWith(<=)(q x)$q y++(0<$x)

Wypróbuj online!

nimi
źródło
2

Narzędzia Bash + GNU, 68 bajtów

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

69 bajtów

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

TIO

przyjmuje pokoje studenckie jako pierwszy i drugi argument, ponieważ liczby ciągów rozdzielonych znakiem nowej linii zwracają status wyjścia 1 dla wartości true lub 0 dla wartości false

Nahuel Fouilleul
źródło
2

Perl 5 -pal , 67 62 bajtów

@NahuelFouilleul zapisał 5 bajtów z rearanżacją i grep

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

Wypróbuj online!

Wersja 67 bajtów

Pobiera rozdzieloną spacjami listę rozmiarów klas w pierwszym wierszu i rozdzieloną spacjami listę rozmiarów pokoi w następnej.

Xcali
źródło
-5 bajtów
Nahuel Fouilleul
2

Common Lisp, 74 bajty

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

Nie zminimalizowane

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

Sprawdź to

Zauważ, że sort trwale mutuje listę, a pop ponownie przypisuje zmienną do następnego elementu.

W efekcie to tylko rekurencyjnie sprawdza, czy największa grupa studentów może zmieścić się w największym pokoju. Istnieją 3 przypadki podstawowe:

  1. Brak studentów - zwrot T.
  2. Studenci, ale nie ma pokoi - zwracają NIL
  3. Studenci i pokoje, ale największa grupa studentów większa niż największa sala - zwrot NIL
Charlim
źródło
1

Python 2 , 71 67 64 bajtów

lambda g,c:s(g)==s(map(min,zip(s(g)[::-1],s(c)[::-1])))
s=sorted

Wypróbuj online!

TFeld
źródło
W Pythonie 3 możesz usunąć, zip(...)aby zapisać 5 bajtów.
mypetlion
1

Retina 0.8.2 , 50 bajtów

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

Wypróbuj online! Link zawiera pakiet testowy. Pobiera dwie listy grup i pokoi (zestaw testów wykorzystuje ;jako separator listy). Wyjaśnienie:

\d+
$*

Konwertuj na unary.

%O^`1+

Odwróć sortowanie każdej listy osobno.

%`$
,

Dodaj przecinek do każdej listy.

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

Sprawdź, czy każdy z numerów na pierwszej liście można dopasować do odpowiedniego numeru na drugiej liście. Za każdym razem \3zawiera poprzednio dopasowane pokoje, \2dlatego następna grupa musi być w stanie zmieścić się w następnym pomieszczeniu. Te (?>\3?)uchwyty przypadku pierwszego pokoju, gdy nie ma jeszcze poprzednia pokoje.

Neil
źródło
1

Węgiel drzewny , 28 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Pobiera listę list pokoi i grup oraz wyniki, -jeśli pokoje mogą pomieścić grupy. Wyjaśnienie:

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

Powtarzaj, gdy do pokoju można przypisać grupę.

UMθΦκ⁻ν⌕κ⌈κ

Usuń największy pokój i grupę z ich list.

¬⊟θ

Sprawdź, czy nie pozostały żadne nieprzydzielone grupy.

Neil
źródło
1

JavaScript, 56 bajtów

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

Spróbuj

Kudłaty
źródło
Zawieszenia dla grup 7oraz 9w klasach 8i 10.
Neil
Dzięki za zwrócenie na to uwagi, @Neil. Zastanawiałem się, czy naga osoba nie wróci, by mnie ugryźć w tyłek! Będę musiał cofnąć się do mojego oryginalnego rozwiązania, dopóki nie znajdę czasu, aby spróbować ponownie.
Kudłaty
1

Perl 6 , 34 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe jako listę dwóch list, grup i klas, i zwraca Brak połączenia, które można skorygować do wartości prawda / fałsz.

Wyjaśnienie:

{                                }   # 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
Jo King
źródło
1

Rubinowy , 57 bajtów

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

Wypróbuj online!

Trwa cna zajęcia, rna pokoje. Sprawdza wszystkie permutacje pokojów zamiast sortowania, ponieważ sortowanie odwrotne kosztuje zbyt wiele bajtów. Nadal wygląda dość długo ...

Kirill L.
źródło
1

C # (interaktywny kompilator Visual C #) , 105 93 91 82 81 79 77 76 74 bajtów

Teraz pasuje do wyniku dany!

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

Zgłasza błąd, jeśli jest fałszywy, nic, jeśli jest prawdziwy.

-12 bajtów dzięki @Destrogio!

Wypróbuj online!

Wyjaśnienie

//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;
}
Wcielenie ignorancji
źródło
93 bajty - Wypróbuj online!
Destroigo
1
@Destrogio Thanks!
Wcielenie nieznajomości
0

Java (OpenJDK 8) , 183 bajty

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

Wypróbuj online!

Z kilkoma przydatnymi radami Kevina Cruijssena i po prostu kolejnym spojrzeniem na mój kod, mogę obniżyć swój wynik o całe 9%, zastępując trzy angielskie słowa!

Java (OpenJDK 8) , 166 bajtów

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

Wypróbuj online!

X1M4L
źródło
Będziesz musiał uwzględnić import java.util.*;w swojej liczbie bajtów. Możesz jednak golfować do 144 bajtów w Javie 8 lub 140 w Javie 10, zastępując booleanvar.
Kevin Cruijssen
PS: Jeśli potrzebujesz true/ falsew swoim kodzie, 1>0/ 0>1są krótszymi alternatywami . :)
Kevin Cruijssen
w rzeczywistości pamiętam, aby uwzględnić dodatkowe 24 bajty! (wierzę, że to ty poinformowałeś mnie o tej regule kilka miesięcy temu XD), ale dziękuję za wskazówkę! niech spróbuje!
X1M4L
3
To nie powiedzie się w ostatnim przypadku testowym.
Kudłaty
O twojej 166-bajtowej wersji: chociaż stan pytania możesz zwrócić 1/0i myślę, że w tym przypadku jest w porządku, pamiętaj, że w Javie w przeciwieństwie do Pythona, JavaScript, C itp. 1/0Zwykle nie są uważane za prawidłowe dane wyjściowe true / falsey . W pierwszym komentarzu wspomniałem o wersji 144-bajtowej . :) Chociaż teraz jest również nieprawidłowy, ponieważ nie działa w ostatnim przypadku testowym, jak wspomniano w @Shaggy .
Kevin Cruijssen
0

PowerShell , 80 bajtów

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

Wypróbuj online!

Skrypt testu mniej golfowego:

$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
źródło