Okul taşınıyor (1. Gün)


21

Üniversite Kodları Yarışması Yarışmamın izniyle alınan meydan okuma


Birkaç yıldır okulumdaki öğrenci sayısı giderek artıyor. Öncelikle, öğrenci sayısı sınıfta arttırıldı, ancak daha sonra bazı grupların spor salonları gibi veya bu son kursta süpürge odasına kadar ders vermek için bazı alanların dönüştürülmesi gerekiyordu.

Geçen yıl akademik otoriteler yeni bir bina inşa etmek için bütçeye ulaştılar ve çalışmaya başladılar. Sonunda bittiler ve yeni bina zaten kullanılabiliyordu, bu yüzden hareket edebiliriz (eski bina rehabilite edilecek ve başka bir işlev için kullanılacaktır), ancak bizi kursun tam ortasında tuttu. Yönetmen, hareketin gruplara ayrılmadan veya katılmadan mümkün olup olmayacağını veya bazı öğrencilerin grupları değiştirmek zorunda olup olmadığını bilmek istiyor.

Meydan okuma

Mevcut grupların ve yeni sınıfların (kapasitenin) öğrenci sayısı göz önüne alındığında, mevcut grupların her birine yeterli kapasiteye sahip farklı bir sınıf veya mümkünse bir falsey değeri atamak mümkün ise bir hakikat değeri çıkarır.

Test Kılıfları

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

notlar

  • Girişi herhangi bir makul formatta alabilirsiniz
  • Çıktısını alabilirsiniz herhangi Truthy / Falsey değeri ( 1/0, True/Falsevb ...)

5
Önerilen test g=[1,2,3], c=[1,1,2,3]
çantası

Buraya göndermek için izniniz var mı?
Şubat’ta

2
@ Adám Evet. Öğretmenime (yarışmanın sorumlusu kim) sordum ve sorun olmadığını söyledi. Tek şey, her gün bir meydan okuma olduğu
Luis felipe De jesus Munoz

0gruplar veya sınıflar için geçerli bir değer?
nimi

1
@Shaggy Herhangi bir falsey / truthy değeri
Luis felipe De jesus Munoz

Yanıtlar:


14

Brachylog , 4 bayt

Bir meydan okuma görmek ve brakilogun herkesi yeneceğini bilmek her zaman güzeldir. Mevcut sınıfları girdi, yeni sınıfları çıktı olarak alır; Öğrencilere uyacak bir yol bulursa doğru çıkacaktır, aksi takdirde yanlış

p≤ᵐ⊆

açıklama

Kod, siparişin gerçekten önemli olmadığı 3 bölümden oluşmaktadır.

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

Çevrimiçi deneyin!


4

Pyth, 11 bayt

.AgM.t_DMQ0

Listelerin bir listesi olarak giriş yapar, önce sınıf boyutları, ikinci grup boyutları. Online Deneyin burada ya bir kerede tüm test durumları doğrulamak burada .

.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

Jöle , 9 bayt

Sınıfları birinci argüman ve grupları ikinci argüman olarak alır.

Œ!~+Ṡ‘ḌẠ¬

Çevrimiçi deneyin!

Yorumlananlar

Not: Bu Ṡ‘ḌẠ¬çok uzun. Ancak bunun yine de doğru bir yaklaşım olmadığını düşünüyorum.

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

ñÍí§Vñn)e

Deneyin veya tüm test durumlarını TIO'da çalıştırın

ñÍí§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

Deneyin veya tüm test durumlarını TIO'da çalıştırın

ñÍ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

Meraktan, 2 - nIn Japt için neden tek baytlık bir yerleşik var ? Ne tür bir kullanım vakası, onu 1 baytlık bir yerleşik olarak haklı göstermek zorundadır?
Kevin Cruijssen

1
Güzel soru, @KevinCruijssen. ÍBu, n2<space>dizeleriyle kullanım için bir kısayoldur ve bunları taban-2'den taban-10 sayılarına dönüştürür (oldukça yaygın bir ihtiyaç). Bununla birlikte, nbir sayıya uygulandığında, bu sayı, yöntemin argümanından çıkarılır (default = 0). Yani burada, 0diziden çıkarmanın diziyi ters sırada sıralamak için yeterli olmasına rağmen , kısayolu kullanmak bana bir bayt kazandırır ñn<space>. Sıralama sırasında da kullanabilirdim, Vancak yöntemi )kapatmak için hala bir alana ihtiyaç duyduğum için herhangi bir bayttan tasarruf etmemeliydim í.
Shaggy


3

MATL , 10 bayt

yn&Y@>~!Aa

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın .

açıklama

Giriş göz önünde [20, 10, 30], [20, 20, 50, 40]bir örnek olarak. Yığın alttan üste gösterilir.

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 bayt

€{í0ζÆdP

Port @Sok 'ın Pyth cevap , çok emin onu da upvote olun!

Girdiyi bir liste olarak alır, sınıf listesi birinci madde ve grup listesi ikinci öğe olarak alır.

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Açıklama:

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

Eski 12 baytlık cevap:

æε{I{0ζÆdP}à

Önce sınıf listesini, ardından grup listesini alır.

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Açıklama:

æ             # 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
Heth, Pyth’in bir değişiklik için 05AB1E’yi mağlup etmesine hoş bir şekilde şaşırdım, ancak sonuçta algoritma olduğu ortaya çıktı: oP
Sok

1
@Sok Seni hayal kırıklığına uğrattığım için üzgünüm. ; p Ama -4 bayt için teşekkürler. : D
Kevin Cruijssen

3

C # (Visual C # Etkileşimli Derleyici) , 77 74 bayt

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

Çevrimiçi deneyin!

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

1
Bunun için makul bir tek astar bulamadım. İyi iş!
Cehalet


2

Bash + GNU araçları, 68 bayt

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

69 bayt

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

TIO

öğrenci odalarını newline ile sınırlandırılmış string sayıları olarak birinci ve ikinci argüman olarak alır, true için 1, status false için 0 döndürür.



2

Ortak Lisp, 74 bayt

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

Sigara minified

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

Dene

Sıralamanın listeyi kalıcı olarak değiştirdiğini ve pop'un değişkeni bir sonraki öğeye yeniden bağladığını unutmayın.

Aslında bu, tekrarlı bir şekilde, en büyük öğrenci grubunun en büyük odaya sığabileceğini kontrol eder. 3 temel durum vardır:

  1. Öğrenci yok - T dönüş
  2. Öğrenciler ama oda yok - NIL’e geri dönün
  3. Öğrenciler ve odalar, ancak en büyük odalardan daha büyük öğrenci grupları - dönüş NIL


1

Retina 0.8.2 , 50 bayt

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

Çevrimiçi deneyin! Bağlantı test paketi içerir. İki grup ve oda ;listesini alır (test takımı liste ayırıcı olarak kullanır ). Açıklama:

\d+
$*

Birliğe dönüştür.

%O^`1+

Her listeyi ayrı ayrı sıralayın.

%`$
,

Her listeye virgül ekleyin.

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

İlk listedeki numaraların her birinin ikinci listedeki uygun numara ile eşleştirilebildiğini kontrol edin. Her seferinde \3önceden eşleşen odaları içerir ve bir sonraki grubun bir \2sonraki odaya sığması gerekir. Daha (?>\3?)önce hiç oda bulunmadığı zaman ilk odadaki durumu ele alır.


1

Mangal kömürü , 28 bayt

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

Çevrimiçi deneyin!Bağlantı, kodun ayrıntılı bir versiyonudur. Odalar gruplara -uygunsa, oda ve grup listelerini ve çıktılarını listeler . Açıklama:

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

Bir grup bir odaya atanırken tekrarlayın.

UMθΦκ⁻ν⌕κ⌈κ

En büyük odayı ve grubu listelerinden çıkarın.

¬⊟θ

Ayrılmamış grup kalmadığını kontrol edin.


1

JavaScript, 56 bayt

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

Dene


Grupları için başarısız 7ve 9sınıflarında 8ve 10.
Neil

Bunu gösterdiğin için teşekkürler, @Neil. Çıplak türün kıçımda beni ısırmaya gelmeyip gelmeyeceğini merak ettim! Tekrar denemek için zaman bulana kadar orijinal çözümüme geri dönmem gerekecek.
Shaggy,

1

Perl 6 , 34 bayt

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

Çevrimiçi deneyin!

İki listenin, grupların ve sınıfların bir listesi olarak girdi alır ve doğru / yanlış değerine yükseltilebilecek bir Yok Kavşağı döndürür.

Açıklama:

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

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

Çevrimiçi deneyin!

Alır c, sınıflar için rodalar için. Sıralama kullanmak yerine odaların tüm izinlerini kontrol eder, çünkü ters sıralama çok fazla bayt tutar. Yine de oldukça uzun görünüyor ...


1

C # (Visual C # Etkileşimli Derleyici) , 105 93 91 82 81 79 77 76 74 bayt

Şimdi dana'nın skoruyla eşleşiyor!

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

Yanlış ise yanlış atar, doğru değilse hiçbir şey alamaz.

@Destrogio sayesinde -12 bayt!

Çevrimiçi deneyin!

açıklama

//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 Teşekkürler!
Cehalet Davası,

0

Java (OpenJDK 8) , 183 bayt

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

Çevrimiçi deneyin!

Kevin Cruijssen'in küçük bir tavsiyesi ve kodumla ilgili başka bir bakışta, sadece üç İngilizce kelimeyi değiştirerek puanımı% 9 azaltabilirim!

Java (OpenJDK 8) , 166 bayt

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

Çevrimiçi deneyin!


import java.util.*;Bayt sayınıza dahil etmeniz gerekir . İçin yapabilirsiniz ancak golf bunu 144 byte değiştirerek Java 10'da Java 8 veya 140 yılında booleanbirlikte var.
Kevin Cruijssen

Not: Eğer gerekiyorsa true/ falsekodunuzda, 1>0/ 0>1kısa alternatiflerdir . :)
Kevin Cruijssen

Aslında, fazladan 24 baytı benim sayıma dahil etmeyi hatırladım! (aylar önce XD'den bu kural hakkında bilgi verdiğine inanıyorum), ama bahşiş için teşekkür ederim! Bir şans vereceğim!
X1M4L

3
Bu, son test vakası başarısız olur.
Shaggy,

166-byte versiyonunuz hakkında: soru durumuna geri dönebilseniz de 1/0, sanırım bu durumda sorun değil, lütfen Java’da Python, JavaScript, C, vb . Ve ilk yorumumda 144 baytlık bir versiyondan bahsettim . :) Her ne kadar, şimdi de geçersiz çünkü @Shaggy tarafından belirtildiği gibi son test durumu için çalışmaz . 1/0
Kevin Cruijssen

0

PowerShell , 80 bayt

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

Çevrimiçi deneyin!

Daha az golf oynadığı test senaryosu:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.