Mudança da escola (dia 1)


21

Desafio Tomado com permissão do meu Concurso de Desafio de Código da Universidade


Há alguns anos, o número de alunos na minha escola tem crescido constantemente. Primeiro, o número de alunos foi aumentado em sala de aula, mas depois foi necessário converter alguns espaços para alguns grupos darem aulas lá, como a academia ou, neste último curso, até a sala de vassouras.

No ano passado, as autoridades acadêmicas conseguiram o orçamento para a construção de um novo prédio e iniciaram as obras. Finalmente, eles terminaram e o novo prédio já pode ser usado, para que possamos nos mudar (o antigo prédio será reabilitado e será usado para outra função), mas nos pegou no meio do percurso. O diretor quer saber se a mudança será possível sem a divisão ou a junção de grupos ou se alguns alunos precisam mudar de grupo.

Desafio

Dada a quantidade de alunos dos grupos atuais e as novas salas de aula (capacidade), produza um valor verdadeiro, se for possível atribuir uma sala de aula diferente, com capacidade suficiente, a cada um dos grupos atuais ou, caso contrário, um valor de falsey.

Casos de teste

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

Notas

  • Você pode receber a entrada em qualquer formato razoável
  • Você pode produzir qualquer valor Truthy / Falsey ( 1/0, True/False, etc ...)

5
g=[1,2,3], c=[1,1,2,3]
Caso de

Você tem permissão para publicá-lo aqui?
Adám 6/02

2
@ Adám Sim. Perguntei ao meu professor (quem é o responsável pelo concurso) e ele disse que não há problema. A única coisa é que é um desafio a cada dia
Luis felipe De jesus Munoz

É 0um valor válido para grupos ou salas de aula?
nimi 6/02

1
@Shaggy Qualquer valor falsey / truthy
Luis felipe De jesus Munoz

Respostas:


14

Braquilog , 4 bytes

É sempre bom ver um desafio e saber que o brachylog vai vencer todos. Toma aulas atuais como entrada e novas salas de aula como saída; Ele produzirá true se encontrar uma maneira de ajustar os alunos, false caso contrário

p≤ᵐ⊆

Explicação

O código tem três partes, das quais o pedido realmente não importa

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

Experimente online!


4

Pitão, 11 bytes

.AgM.t_DMQ0

Recebe a entrada como uma lista de listas, tamanhos da sala de aula primeiro e tamanhos de grupo em segundo. Experimente online aqui ou verifique todos os casos de teste de uma vez aqui .

.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

Geléia , 9 bytes

Toma as salas de aula como primeiro argumento e os grupos como segundo argumento.

Œ!~+Ṡ‘ḌẠ¬

Experimente online!

Comentado

NB: Isso Ṡ‘ḌẠ¬é muito longo. Mas suspeito que essa não seja a abordagem correta de qualquer maneira.

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

Japonês , 9 bytes

ñÍí§Vñn)e

Experimente ou execute todos os casos de teste no 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

Experimente ou execute todos os casos de teste no 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

Por curiosidade, por que há um byte embutido no 2 - nIn Japt? Que tipo de casos de uso ele tem para justificar a criação de um byte de 1 byte?
Kevin Cruijssen 07/02

1
Boa pergunta, @KevinCruijssen. Íé um atalho para n2<space>e foi criado para uso com cadeias de caracteres, convertendo-as dos números da base 2 para a base 10 (uma necessidade bastante comum). No entanto, o nmétodo, quando aplicado a um número, subtrai esse número do argumento do método (padrão = 0). Portanto, aqui, embora subtrair de 0seja suficiente para classificar a matriz na ordem inversa, o uso do atalho me poupa um byte ñn<space>. Eu também poderia usá-lo ao classificar, Vmas não salvaria nenhum bytes, pois ainda precisaria de um espaço, em vez de ), para fechar o ímétodo.
Shaggy


3

MATL , 10 bytes

yn&Y@>~!Aa

Experimente online! Ou verifique todos os casos de teste .

Explicação

Considere entradas [20, 10, 30], [20, 20, 50, 40]como um exemplo. A pilha é mostrada de baixo para cima.

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 bytes

€{í0ζÆdP

Resposta do Porto da Pyth do @Sok , por isso não deixe de vota-lo também!

Recebe a entrada como uma lista de listas, com a lista de sala de aula como primeiro item e a lista de grupos como segundo item.

Experimente online ou verifique todos os casos de teste .

Explicação:

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

Resposta antiga de 12 bytes:

æε{I{0ζÆdP}à

Leva a lista da sala de aula primeiro e depois a lista do grupo.

Experimente online ou verifique todos os casos de teste .

Explicação:

æ             # 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, fiquei agradavelmente surpreso que Pyth tivesse vencido 05AB1E para variar, mas, afinal, era o algoritmo: oP
Sok

1
@ Sok Desculpe desapontá-lo. ; p Mas obrigado pelos -4 bytes. : D
Kevin Cruijssen 07/02

3

C # (Compilador interativo do Visual C #) , 77 74 bytes

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

Experimente online!

Código comentado:

// 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
Não consegui encontrar uma linha razoável para isso. Bom trabalho!
Modalidade de ignorância


2

Ferramentas Bash + GNU, 68 bytes

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

69 bytes

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

TIO

aceita os quartos dos alunos como primeiro e segundo argumentos, pois os números de string delimitados por nova linha retornam o status de saída 1 para verdadeiro ou 0 para falso



2

Lisp comum, 74 bytes

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

Não minificado

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

Teste-o

Observe que a classificação muda permanentemente a lista e pop reenvia a variável para o próximo elemento.

De fato, isso apenas verifica recursivamente se o maior grupo de estudantes pode caber na maior sala. Existem 3 casos básicos:

  1. Sem alunos - retorno T
  2. Estudantes, mas não há quartos - retorne NIL
  3. Alunos e salas, mas o maior grupo de estudantes maior que a maior sala - retorne NIL


1

Retina 0.8.2 , 50 bytes

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

Experimente online! O link inclui o conjunto de testes. Toma duas listas de grupos e salas (a suíte de testes usa ;como separador de lista). Explicação:

\d+
$*

Converta para unário.

%O^`1+

Inverter classifique cada lista separadamente.

%`$
,

Acrescente uma vírgula a cada lista.

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

Verifique se cada um dos números na primeira lista pode corresponder ao número apropriado na segunda lista. Cada vez que \3contém as salas correspondidas anteriormente, o próximo grupo \2precisa, portanto, poder caber na próxima sala. Ele (?>\3?)lida com o caso da primeira sala quando ainda não há salas anteriores.


1

Carvão , 28 bytes

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

Experimente online! Link é a versão detalhada do código. Leva uma lista de listas de salas e grupos e saídas -se as salas puderem acomodar os grupos. Explicação:

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

Repita enquanto um grupo pode ser atribuído a uma sala.

UMθΦκ⁻ν⌕κ⌈κ

Remova a maior sala e grupo de suas listas.

¬⊟θ

Verifique se não há grupos não alocados restantes.


1

JavaScript, 56 bytes

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

Tente


Falha para grupos de 7e 9em classes de 8e 10.
Neil

Obrigado por apontar isso, @ Nee. Eu me perguntei se o tipo nu não voltaria para me morder na bunda! Terei que reverter para a minha solução original até encontrar tempo para tentar novamente.
Shaggy

1

Perl 6 , 34 bytes

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

Experimente online!

Recebe a entrada como uma lista de duas listas, os grupos e as salas de aula, e retorna uma Junção Nenhuma que pode ser boolificada para verdadeiro / falso.

Explicação:

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

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

Experimente online!

Toma caulas, rpara quartos. Verifica todas as permutações de salas em vez de usar a classificação, porque a classificação reversa custa muitos bytes. Ainda parece bastante longo ...


1

C # (Compilador interativo do Visual C #) , 105 93 91 82 81 79 77 76 74 bytes

Agora corresponde à pontuação de dana!

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

Lança um erro se falso, nada se verdadeiro.

-12 bytes graças a @Destrogio!

Experimente online!

Explicação

//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 Thanks!
Realização da ignorância

0

Java (OpenJDK 8) , 183 bytes

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

Experimente online!

Com um pequeno conselho útil de Kevin Cruijssen e simplesmente outro olhar sobre meu código, eu posso diminuir minha pontuação em 9% inteiros apenas substituindo três palavras em inglês!

Java (OpenJDK 8) , 166 bytes

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

Experimente online!


Você precisará incluir o import java.util.*;na sua contagem de bytes. No entanto, você pode jogar golfe para 144 bytes no Java 8 ou 140 no Java 10 substituindo booleanpor var.
Kevin Cruijssen 6/02

PS: Se você precisar true/ falseno seu código, 1>0/ 0>1são alternativas mais curtas . :)
Kevin Cruijssen

na verdade, lembrei-me de incluir os 24 bytes extras na minha contagem! (acredito que você me informou dessa regra meses atrás, XD), mas obrigado pela dica! vou tentar!
X1M4L 6/02

3
Isso falha no último caso de teste.
Shaggy

Sobre a sua versão de 166 bytes: embora a pergunta afirme que você pode retornar 1/0e eu acho que está bem nesse caso, observe que em Java, diferente de Python, JavaScript, C, etc. 1/0geralmente não são considerados como saídas válidas de verdade / falsey . E no meu primeiro comentário, mencionei uma versão de 144 bytes . :) Embora agora também seja inválido porque não funciona no último caso de teste, como mencionado por @Shaggy .
Kevin Cruijssen 6/02

0

PowerShell , 80 bytes

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

Experimente online!

Script de teste com menos golfe:

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.