Trường chuyển đi (Ngày 1)


21

Thử thách được thực hiện với sự cho phép từ Cuộc thi Thử thách Mã trường Đại học của tôi


Trong một số năm nay, số lượng học sinh trong trường của tôi đã tăng lên đều đặn. Đầu tiên số lượng học sinh được tăng lên bởi lớp học, nhưng sau đó cần phải chuyển đổi một số không gian cho một số nhóm để cung cấp các lớp học ở đó, chẳng hạn như phòng tập thể dục, hoặc khóa học cuối cùng này, lên phòng chổi.

Năm ngoái, các cơ quan học thuật đã có ngân sách để xây dựng một tòa nhà mới và bắt đầu các công trình. Cuối cùng họ đã hoàn thành và tòa nhà mới có thể được sử dụng, vì vậy chúng tôi có thể di chuyển (tòa nhà cũ sẽ được cải tạo và sẽ được sử dụng cho một chức năng khác), nhưng nó đã bắt chúng tôi đi được nửa chặng đường. Giám đốc muốn biết liệu di chuyển sẽ có thể mà không cần tách hoặc tham gia các nhóm, hoặc một số sinh viên phải thay đổi nhóm.

Thử thách

Với số lượng học sinh của các nhóm hiện tại và các lớp học mới (sức chứa), sẽ đưa ra một giá trị trung thực nếu có thể chỉ định một lớp học khác, với đủ năng lực, cho mỗi nhóm hiện tại hoặc giá trị falsey khác.

Các trường hợp thử nghiệm

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

Ghi chú

  • Bạn có thể lấy đầu vào ở bất kỳ định dạng hợp lý
  • Bạn có thể xuất bất kỳ giá trị Truthy / Falsey ( 1/0, True/False, vv ...)

5
g=[1,2,3], c=[1,1,2,3]
Testcase

Bạn có được phép đăng nó ở đây không?
Adám

2
@ Adám Có. Tôi đã hỏi giáo viên của tôi (người phụ trách cuộc thi) và anh ấy nói không có vấn đề gì. Điều duy nhất là đó là một thử thách mỗi ngày
Luis felipe De jesus Munoz

0một giá trị hợp lệ cho các nhóm hoặc lớp học?
nimi

1
@Shaggy Bất kỳ giá trị chim ưng / trung thực
Luis felipe De jesus Munoz

Câu trả lời:


14

Brachylog , 4 byte

Thật tuyệt khi thấy một thử thách và biết rằng brachylog sẽ đánh bại tất cả mọi người. Lấy các lớp hiện tại làm đầu vào và lớp học mới làm đầu ra; Nó sẽ xuất ra true nếu tìm được cách phù hợp với học sinh, ngược lại

p≤ᵐ⊆

Giải trình

Mã này có 3 phần trong đó thứ tự thực sự không quan trọng

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

Hãy thử trực tuyến!


4

Bình thường, 11 byte

.AgM.t_DMQ0

Đưa đầu vào dưới dạng danh sách các danh sách, kích thước lớp học trước, kích thước nhóm thứ hai. Dùng thử trực tuyến tại đây hoặc xác minh tất cả các trường hợp thử nghiệm cùng một lúc tại đây .

.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

Thạch , 9 byte

Lấy các lớp học làm đối số thứ nhất và các nhóm làm đối số thứ hai.

Œ!~+Ṡ‘ḌẠ¬

Hãy thử trực tuyến!

Đã bình luận

NB: Điều này Ṡ‘ḌẠ¬là quá dài. Nhưng tôi nghi ngờ rằng dù sao đây cũng không phải là phương pháp đúng đắn.

Œ!~+Ṡ‘ḌẠ¬  - 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 byte

ñÍí§Vñn)e

Hãy thử hoặc chạy tất cả các trường hợp thử nghiệm trên 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

Hãy thử hoặc chạy tất cả các trường hợp thử nghiệm trên 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

Vì tò mò, tại sao lại có một byte dựng sẵn cho 2 - nIn Japt? Loại trường hợp sử dụng nào phải chứng minh nó là một nội dung 1 byte?
Kevin Cruijssen

1
Câu hỏi hay, @KevinCruijssen. Ílà một lối tắt cho n2<space>và được tạo để sử dụng với các chuỗi, chuyển đổi chúng từ số cơ sở 2 sang số 10 cơ sở (một nhu cầu khá phổ biến). Tuy nhiên, nphương thức, khi được áp dụng cho một số, sẽ trừ số đó khỏi đối số của phương thức (default = 0). Vì vậy, ở đây, mặc dù trừ đi 0sẽ đủ để sắp xếp mảng theo thứ tự ngược lại, sử dụng phím tắt giúp tôi tiết kiệm được một byte ñn<space>. Tôi cũng có thể đã sử dụng nó khi sắp xếp Vnhưng nó sẽ không lưu bất kỳ byte nào vì tôi vẫn cần một khoảng trắng, thay vì ), để đóng íphương thức.
Xù xì


3

MATL , 10 byte

yn&Y@>~!Aa

Hãy thử trực tuyến! Hoặc là xác minh tất cả các trường hợp thử nghiệm .

Giải trình

Hãy xem xét các đầu vào [20, 10, 30], [20, 20, 50, 40]như một ví dụ. Ngăn xếp được hiển thị từ dưới lên trên.

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 byte

€{í0ζÆdP

Cảng @Sok 's Pyth câu trả lời , vì vậy hãy chắc chắn để upvote ông cũng!

Lấy đầu vào là một danh sách các danh sách, với danh sách lớp học là mục đầu tiên và danh sách nhóm là mục thứ hai.

Dùng thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

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

Câu trả lời cũ 12 byte:

æε{I{0ζÆdP}à

Lấy danh sách lớp học trước, và sau đó là danh sách nhóm.

Dùng thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

æ             # 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
Hehe Tôi rất ngạc nhiên khi Pyth đã đánh bại 05AB1E vì một sự thay đổi, nhưng hóa ra đó là thuật toán sau tất cả: oP
Sok

1
@Sok Xin lỗi đã làm bạn thất vọng. ; p Nhưng cảm ơn vì -4 byte. : D
Kevin Cruijssen

3

C # (Trình biên dịch tương tác Visual C #) , 77 74 byte

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

Hãy thử trực tuyến!

Mã nhận xét:

// 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
Tôi đã không thể tìm thấy một lớp lót hợp lý cho nó. Công việc tốt!
Hiện thân của sự thiếu hiểu biết


2

Công cụ Bash + GNU, 68 byte

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

69 byte

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

TIO

lấy các phòng sinh viên làm đối số thứ nhất và thứ hai làm số chuỗi được phân tách bằng dòng mới trả về trạng thái thoát 1 là true hoặc 0 cho false



2

Lisp thông thường, 74 byte

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

Không khai thác

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

Kiểm tra nó

Lưu ý rằng sắp xếp làm thay đổi vĩnh viễn danh sách và bật lại biến số thành phần tử tiếp theo.

Trong thực tế, điều này chỉ cần kiểm tra đệ quy rằng nhóm sinh viên lớn nhất có thể phù hợp trong phòng lớn nhất. Có 3 trường hợp cơ bản:

  1. Không có sinh viên - trở về T
  2. Sinh viên, nhưng không có phòng - trở lại NIL
  3. Sinh viên và phòng, nhưng nhóm sinh viên lớn nhất lớn hơn phòng lớn nhất - trở lại NIL


1

Võng mạc 0.8.2 , 50 byte

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

Hãy thử trực tuyến! Liên kết bao gồm bộ kiểm tra. Có hai danh sách các nhóm và phòng (bộ kiểm tra sử dụng ;làm dấu tách danh sách). Giải trình:

\d+
$*

Chuyển đổi sang unary.

%O^`1+

Sắp xếp ngược lại từng danh sách riêng biệt.

%`$
,

Nối một dấu phẩy vào mỗi danh sách.

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

Kiểm tra xem mỗi số trong danh sách đầu tiên có thể được khớp với số thích hợp trong danh sách thứ hai. Mỗi lần \3chứa các phòng phù hợp trước đó và nhóm tiếp theo \2do đó cần có thể phù hợp với phòng tiếp theo. Các (?>\3?)xử lý trường hợp của phòng đầu tiên khi không có phòng trước đó.


1

Than , 28 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Đưa ra một danh sách các danh sách các phòng và nhóm và đầu ra -nếu các phòng có thể chứa các nhóm. Giải trình:

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

Lặp lại trong khi một nhóm có thể được chỉ định cho một phòng.

UMθΦκ⁻ν⌕κ⌈κ

Xóa phòng lớn nhất và nhóm khỏi danh sách của họ.

¬⊟θ

Kiểm tra rằng không có nhóm chưa phân bổ còn lại.


1

JavaScript, 56 byte

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

Thử nó


Thất bại cho các nhóm 79trong các lớp 810.
Neil

Cảm ơn đã chỉ ra rằng, @Neil. Tôi tự hỏi nếu loại trần truồng sẽ không quay lại cắn vào mông tôi! Tôi sẽ phải quay lại giải pháp ban đầu của mình cho đến khi tôi có thể tìm thấy thời gian để thử lại.
Xù xì

1

Perl 6 , 34 byte

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

Hãy thử trực tuyến!

Đưa đầu vào thành một danh sách gồm hai danh sách, các nhóm và các lớp học và trả về một Ngã ba Không có thể được boolized thành true / false.

Giải trình:

{                                }   # 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

Ruby , 57 byte

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

Hãy thử trực tuyến!

Đưa ccho các lớp học, rcho các phòng. Kiểm tra tất cả các hoán vị của phòng thay vì sử dụng sắp xếp, bởi vì sắp xếp ngược chi phí quá nhiều byte. Vẫn trông khá dài mặc dù ...


1

C # (Trình biên dịch tương tác Visual C #) , 105 93 91 82 81 79 77 76 74 byte

Bây giờ phù hợp với điểm số của dana!

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

Ném một lỗi nếu sai, không có gì nếu đúng.

-12 byte nhờ @Destrogio!

Hãy thử trực tuyến!

Giải trình

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



0

Java (OpenJDK 8) , 183 byte

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

Hãy thử trực tuyến!

Với một lời khuyên hữu ích từ Kevin Cruijssen và chỉ đơn giản là lướt qua mã của tôi, tôi có thể giảm điểm của mình xuống 9% chỉ bằng cách thay thế ba từ tiếng Anh!

Java (OpenJDK 8) , 166 byte

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

Hãy thử trực tuyến!


Bạn sẽ phải bao gồm số import java.util.*;byte của bạn. Tuy nhiên, bạn có thể đánh gôn thành 144 byte trong Java 8 hoặc 140 trong Java 10 bằng cách thay thế booleanbằng var.
Kevin Cruijssen

PS: Nếu bạn cần true/ falsetrong mã của bạn, 1>0/ 0>1là những lựa chọn thay thế ngắn hơn . :)
Kevin Cruijssen

thực sự, tôi đã nhớ bao gồm thêm 24 byte vào số đếm của mình! (tôi tin rằng bạn đã thông báo rằng tôi về quy tắc đó vài tháng trước XD), nhưng cảm ơn bạn vì tiền boa! tôi sẽ cho nó một viên đạn!
X1M4L

3
Điều này không thành công trong trường hợp thử nghiệm cuối cùng.
Xù xì

Về phiên bản 166 byte của bạn: mặc dù trạng thái câu hỏi bạn có thể trả về 1/0và tôi đoán nó vẫn ổn trong trường hợp này, xin lưu ý rằng trong Java không giống như Python, JavaScript, C, v.v. 1/0thường không được coi là đầu ra trung thực / falsey hợp lệ . Và trong bình luận đầu tiên của tôi, tôi đã đề cập đến một phiên bản 144 byte . :) Mặc dù, hiện tại nó cũng không hợp lệ vì nó không hoạt động cho trường hợp thử nghiệm cuối cùng, như được đề cập bởi @Shaggy .
Kevin Cruijssen

0

PowerShell , 80 byte

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

Hãy thử trực tuyến!

Kịch bản kiểm tra ít chơi gôn hơn:

$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"
}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.