Desafio do Advento 5: Mova os presentes para as docas de transporte!

9

<< Anterior Próximo >>

Graças à comunidade PPCG, o Papai Noel conseguiu remanufaturar todos os seus presentes e, após a linha de montagem, os presentes estão prontos para serem transportados para as docas de transporte!

Cada uma das docas de transporte do Papai Noel tem apenas uma variedade de tamanhos atuais, porque os trenós de transporte são especializados para um tamanho específico (mais leve e seria um desperdício, mais pesado e o trenó não seria capaz de lidar com a carga). Assim, ele precisa de você para ajudá-lo a pegar seus presentes e classificá-los nas docas de transporte corretas.

Desafio

Dada uma lista e os intervalos da doca de transporte, organize os presentes de maneira estável na ordem correta.

Vamos tomar isso por exemplo: os presentes são [5, 3, 8, 6, 2, 7]e os intervalos de encaixe são [[1, 5] and [6, 10]].

Os presentes 5, 3e 2ir para a primeira doca e os presentes 8, 6e 7ir para o segundo dock. Isso pode ser mostrado como [[5, 3, 2], [8, 6, 7]]. Essa lista estará mais próxima de ser classificada do que a entrada, mas stablysignifica que dentro de cada estação, a ordem dos presentes deve ser a mesma da ordem da entrada (caso contrário, você pode classificar a lista inteira).

Sua saída final para este caso seria [5, 3, 2, 8, 6, 7](como uma lista simples).

Especificações de formatação

Irá ser dada entrada como uma lista de números inteiros plana e uma lista dos intervalos em qualquer formato razoável (por exemplo, o intervalo para o processo acima pode ser dada como [[1, 5], [6, 10]], [1, 5, 6, 10]ou [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]). Sua saída deve ser uma lista simples de números inteiros em qualquer formato razoável.

A entrada pode conter valores duplicados; Nesse caso, você precisa retornar todas as instâncias delas. Todos os tamanhos atuais estarão exatamente em um intervalo de tamanho e você pode assumir que os intervalos nunca se sobrepõem. Pode haver falhas nos intervalos, desde que todos os tamanhos atuais sejam cobertos.

Regras

  • As brechas padrão se aplicam
  • Isso é , então a resposta mais curta em bytes vence
  • Nenhuma resposta será aceita
  • Você pode assumir que não haverá intervalos vazios ( [7, 4]seria inválido porque os intervalos aumentam)

Casos de teste

[1, 2, 3, 4, 5, 6, 7] ; [[1, 3], [4, 7]] => [1, 2, 3, 4, 5, 6, 7]
[1, 2, 3, 4, 5, 6, 7] ; [[4, 7], [1, 3]] => [4, 5, 6, 7, 1, 2, 3]
[7, 3, 5, 4, 6, 1, 2] ; [[1, 3], [4, 5], [6, 7]] => [3, 1, 2, 5, 4, 7, 6]
[4, 7, 6, 3, 5, 2, 1] ; [[1, 4], [5, 7]] => [4, 3, 2, 1, 7, 6, 5]
[1, 1, 3, 3, 6, 4, 7] ; [[1, 4], [6, 7]] => [1, 1, 3, 3, 4, 6, 7]

Nota: Eu me inspirei para esta série de desafios da Advent Of Code . Não tenho afiliação com este site

Você pode ver uma lista de todos os desafios da série consultando a seção 'Vinculado' do primeiro desafio aqui .

HyperNeutrino
fonte
Sempre apenas 2 docas?
usar o seguinte código
Os intervalos podem se sobrepor?
RamenChef
@LiefdeWen Veja o terceiro caso de teste.
Xcoder
Será que os pares docas estar sempre {pequeno, grande}
LiefdeWen
@RamenChef No ..
HyperNeutrino

Respostas:

5

Haskell , 26 bytes

a#s=[x|r<-s,x<-a,elem x r]

Experimente online! Exemplo de uso: [1,2,3,4,5,6,7] # [[1,2,3],[4,5,6,7]]rendimentos [1,2,3,4,5,6,7].

Laikoni
fonte
4

Gelatina , 4 bytes

fЀẎ

Experimente online!

Leva como entrada a lista atual, faixas completas.

Erik, o Outgolfer
fonte
yaay que é a solução de geléia eu esperava: DDD
HyperNeutrino
@HyperNeutrino Hehe, a solução esperada acaba por não ser a mais curta. Ao descobrir como o produto externo do 05ab1e funciona, achei que ele também fþFfunciona no Jelly, por 3 bytes . O crédito vai para Adnan .
Xcoder
@ Mr.Xcoder Você ou Adnan devem postar isso.
Erik the Outgolfer
@ Mr.Xcoder Vou esperar um pouco e ver: P, mas parece consideravelmente diferente, se eu acabar postando, vou postar outra resposta.
Erik the Outgolfer
4

Mathematica, 39 bytes

x##&@@Cases[x,#|##&@@Range@##]&@@@#&

-22 bytes de JungHwan Min
-4 bytes de Martin

Experimente online!

J42161217
fonte
Você também pode se livrar de Rangetudo, apenas usando os intervalos expandidos como entrada.
27516 Martin Ender #
3

Pitão , 5 bytes

s@Rvz

Experimente aqui!

Pitão , 10 bytes

s.gx}LkQ1E

Experimente aqui!

Como eles trabalham

s @ Rvz | Programa completo.

  R Mapa certo ...
 @ ... Usando interseção.
   vz Da primeira entrada com a segunda.
s Achate um nível.
s.gx} LkQ1E | Programa completo.

 .g E | Agrupe os itens na segunda entrada por ...
    } LkQ | Mapeie a primeira entrada e verifique se o item atual está na lista.
   x 1 | Pegue o índice do primeiro elemento de verdade.
s Aplainar.

Toma as docas primeiro, com todos os números inteiros nos intervalos e depois os presentes em uma nova linha.

Mr. Xcoder
fonte
3

05AB1E , 3 bytes

δØ

Experimente online! (obrigado a Adnan por me informar que δexiste, -1 byte)

Como funciona

δî Programa completo.

δ Vetorize duas vezes o próximo comando (algo como um produto externo).
 Ã | Interseção de lista. Como esta é uma díade, a primeira entrada é automaticamente
     | usado para preencher o argumento ausente (tanto quanto eu sei).
  ˜ Aplainar.
Mr. Xcoder
fonte
Bem, €Ã˜parece não funcionar.
Erik the Outgolfer
Não, não existe. BTW, o motivo €Ã˜falha é porque Ãleva dois argumentos e espera uma função com um argumento; portanto, ele retorna [[]](acho que isso é um bug), então ˜achatará, retornando []. ε, porém, funciona de maneira diferente. Para cada elemento do item superior, ele cria uma nova pilha e, em seguida, retorna a parte superior de cada nova pilha; portanto, quando não há itens suficientes para uma função, recebe uma entrada implícita.
Erik the Outgolfer
Ainda não testei, mas é o δØque você está procurando?
Adnan
@ Mr.Xcoder Eu não acho que seja exatamente o mapa diádico de Pyth, ele se comporta mais como um produto externo ou algo assim.
Erik the Outgolfer
3

Retina , 37 36 bytes

O$`(\d+)(?=.*¶(.*)\[.*\b\1\b)
$2
G1`

Experimente online! Recebe entrada como uma lista de presentes na primeira linha e uma lista de intervalos na segunda linha; o link inclui um cabeçalho para dividir os casos de teste no formato desejado. Editar: salvou 1 byte graças a @MartinEnder. Explicação: O primeiro estágio corresponde aos presentes e localiza o encaixe correspondente. Os presentes são classificados pela substring do início da linha até o [, agrupando os presentes por doca. O segundo estágio exclui as docas.

Neil
fonte
2

Alistar , 3 bytes

f₱Ẏ

Experimente online!

Como funciona

f ₱ Ẏ | Programa completo.

 ₱ Mapa sobre o argumento certo.
f Usando a interseção de lista, contando multiplicidades.
  Ẏ Aperte (achatar em 1 nível).
Mr. Xcoder
fonte
11
: D O alistamento não foi esquecido: D Na verdade, foi meio que, mas não pela comunidade, mas por mim :(: P
HyperNeutrino
2

APL + WIN, 29 bytes

(,⍉<\p←n∘.≤∊¯1↑¨⎕)/(×/⍴p)⍴n←⎕

Solicita a entrada na tela para números inteiros e intervalos. Os números inteiros como uma lista simples e os intervalos como um vetor aninhado, por exemplo, caso 3:

(1 3) (4 5) (6 7)

Explicação:

(×/⍴p)⍴n←⎕ prompt for screen input of integers and replicate by the number of ranges 

∊¯1↑¨⎕ prompt for screen input of ranges and select the top of each

p←n∘.≤ create a boolean matrix using outer product with less than the top of each range

,⍉<\ identify the first range which each element fits in and ravel into a partition vector

(.....)/.... use the partition vector to select the elements in each range in order
Graham
fonte
2

C ++, 127 bytes

Aceite a entrada como duas matrizes representadas por pares de ponteiros [start, end).

#import<algorithm>
[](int*A,int*x,int*B,int*y){for(;B!=y;B+=2)A=std::stable_partition(A,x,[&](int a){return a>=*B&&a<=B[1];});}

Experimente online!

Colera Su
fonte
Bem, C ++ tem um built-in para tudo ... ou faz? / Como os intervalos de entrada não contêm 0, é possível obter alguns bytes usando a matriz B terminada em nulo, embora possa ser considerado trapaça. / Infelizmente, em [&](int a)->int{a=a>=vez de [&](int a){return a>=não salva nenhum bytes. / #import<algorithm>pode ser #import<regex>, pelo menos no TIO. Descobri que após a pesquisa exaustiva ("pesquisa binária manual") todos os cabeçalhos listados nesta página e este é o mais curto. / Além disso, +1 de mim.
user202729
2

J, 15 bytes

[/:[:I.e.&>"0 1

Aceita a entrada como argumento à esquerda e os intervalos como argumento à direita . Os intervalos são listas em caixa dos intervalos completos.

por exemplo, para o primeiro intervalo:

   NB. This produces the range
   (1 2 3 ; 4 5 6 7)
┌─────┬───────┐
│1 2 3│4 5 6 7│
└─────┴───────┘

Experimente online!

Explicação

[/:[:I.e.&>”0 1
          >”0 1  Pair each element on the left with each range on the right
       e.        Is the element in the range?
     I.          Indices of ones
[/:              Sort the elements by this array
Cole
fonte
2

J , 26 bytes 24

2 bytes graças a cole

[:;]<@#~1=-&1 0"1@[I."1]

Como funciona:

O argumento esquerdo contém os intervalos.

-&1 0"1@[ diminui o limite inferior de cada intervalo em 1

I."1] verifica em que faixa se encaixa cada presente

1= está na faixa correta

]<@#~ copia e caixas os presentes que estão no intervalo atual

; - raze (desembalagem)

Experimente online!

Galen Ivanov
fonte
11
Tenho certeza que você não pode remover zeros desde a entrada é integral (por exemplo falhar este caso de teste (0 4,:_3 _1) f _2 _1 0 1 2)
cole
@ Cole Hm, eu tinha negligenciado totalmente esses casos. Vou precisar pensar neles.
Galen Ivanov
11
Sim, acho que a maneira mais fácil provavelmente seria encaixotar e depois arrasar. 24 bytes dessa maneira.
Cole
@ obrigado Obrigado! Não é apenas mais curto, mas resolve facilmente o problema com 0.
Galen Ivanov
2

R , 113 48 55 41 bytes

Uma versão anterior não classificava corretamente os objetos quando as docas não estavam em ordem crescente.

function(P,D)for(d in D)cat(P[P%in%d],"")

Experimente online!

Toma Dcomo uma lista de vetores de intervalos, ou seja, list(4:7,1:3)seria [[4, 7], [1, 3]].

Provavelmente a resposta ingênua que eu deveria ter chegado há séculos; imprime em stdout.

Giuseppe
fonte
2

Japonês , 6 bytes

ñ@VbøX

Tente


Explicação

Entrada implícita da matriz U(presentes) e 2d-matriz V(faixas completas). Classifique ( ñ) os presentes passando-os por uma função ( @) que obtém o índice do primeiro elemento ( b) em Vque contém ( ø) o presente atual ( X).

Shaggy
fonte
1

Python 2, 97 85 bytes

l,d=input()
k=lambda i,j=0:-~j*(d[j][0]<=i<=d[j][1])or k(i,j+1)
print sorted(l,key=k)

-11 bytes de ovs

-1 byte do Sr. Xcoder

Experimente online!

Classifica a lista usando uma lambda recursiva como chave. Explicação em breve ™ abaixo.

Explicação:

l,d=input()             # l is the lsit of presents, d is the list of ranges
k=lambda i,j=0:-~j*(d[j][0]<=i<=d[j][1])or k(i,j+1)# recursive lambda to sort with
k=lambda i,j=0:                                    # i is the present
                                                   # j is the index in the list of ranges
               -~j*(d[j][0]<=i<=d[j][1])           # return the index of the list of
                                                   # ranges(plus one) if the present is
                                                   # in the range
                                        or k(i,j+1)# if the present is not in the range,
                                                   # try the next range
print sorted(i,key=k)   # print the list of presents sorted by the lambda
pizzapants184
fonte
1

Javascript ES6, 53 47 45 bytes

p=>l=>l.map(d=>p.filter(a=>d.includes(a)))+''

Experimente online!

RamenChef
fonte
45 bytes . Você pode usar todos os intervalos como entrada. Uma alternativa um pouco mais agradável 47 byter
Sr. Xcoder
1

PowerShell , 37 bytes

param($a,$b)$b|%{$i=$_;$a|?{$_-in$i}}

Experimente online!

Toma $acomo uma matriz literal dos presentes e $bcomo uma matriz de matrizes, cada uma das quais é o intervalo completo (por exemplo, em @(1,2,3,4,5)vez de @(1,5)). Em seguida, passamos um loop sobre cada item $bcom |%{...}. Por dentro, precisamos definir um auxiliar $ipara ser o item atual e, em seguida, usar uma Where-Objectcláusula $apara extrair apenas os itens que são -ina $bmatriz atual .

Esses são deixados no pipeline e a saída está implícita. Como o comportamento padrão de Write-Outputinserir uma nova linha entre os elementos da matriz, é isso que obtemos. Aqui está uma versão ligeiramente aprimorada que é -joineditada por vírgulas em vez de uma nova linha, apenas para mostrar diferenças.

AdmBorkBork
fonte
1

Vermelho , 73 bytes

f: func[b r][n: copy[]foreach p r[foreach a b[if find p a[append n a]]]n]

Experimente online!

Galen Ivanov
fonte
1

C # (.NET Core) , 50 + 18 bytes

a=>b=>b.SelectMany(x=>a.Where(y=>y>=x[0]&y<=x[1]))

+18 bytes de

using System.Linq;

É preciso uma coleção de presentes e uma coleção de matrizes para docas.

Experimente online!

Grzegorz Puławski
fonte
1

Lote do Windows (CMD), 90 79 bytes

set/pX=||exit
set/pY=
for %%n in (%*)do if %X% LEQ %%n if %%n LEQ %Y% %%n
%0 %*

Use o formato de fim de linha LF. Cada caractere de fim de linha pode ser contado como 1 byte.

Nenhum TIO (porque o TIO usa Linux)

Pegue a lista nos argumentos da linha de comando e varia de stdin.

Por exemplo, se o programa for executado (suponha que o arquivo seja nomeado r1.cmd)

r1 7 3 5 4 6 1 2

e com stdinentrada

1
3
4
5
6
7

, o programa será enviado para stderrcom o formato

'3' is not recognized as an internal or external command,
operable program or batch file.
'1' is not recognized as an internal or external command,
operable program or batch file.
'2' is not recognized as an internal or external command,
operable program or batch file.
'5' is not recognized as an internal or external command,
operable program or batch file.
'4' is not recognized as an internal or external command,
operable program or batch file.
'7' is not recognized as an internal or external command,
operable program or batch file.
'6' is not recognized as an internal or external command,
operable program or batch file.

(corresponde à sequência de saída 3 1 2 5 4 7 6)


Explicação:

set /p X=       Prompt for variable X (min range)
   ||exit       If failed (end of file), exit - similar to short-circuit of logical OR
set /p Y=       Prompt for variable Y
for %%n in (%*)do     For each number %%n in all command-line arguments
   if %X% LEQ %%n     If X <= n
      if %%n LEQ %Y%  and n <= Y
         %%n          run command named "n", which lead to an error.

%0 %*           Call itself, process other ranges

Código não-bloqueado (com interação ativada se truefor passado como argumento 1; solicitar a lista de stdin, use gotopara evitar o estouro de pilha - na verdade, eu apenas tentei executar um script que se chama mais de 70000 vezes sem ver nenhum problema, então acho que deve ser bastante seguro):

@echo off

set INTERACTIVE=%1

if "%INTERACTIVE%" == "true" (
    set rangeMinPrompt=Enter range min: 
    set rangeMaxPrompt=Enter range max: 
    set listPrompt=Enter list: 
) else (
    set rangeMinPrompt=
    set rangeMaxPrompt=
    set listPrompt=
)


set /p list=%listPrompt%

:loop_label

set /p rangeMin=%rangeMinPrompt%&& set /p rangeMax=%rangeMaxPrompt%|| exit /b

for %%n in (%list%) do (
    if %rangeMin% LEQ %%n (
        if %%n LEQ %rangeMax% (
            echo %%n
        )
    )
)

goto :loop_label
user202729
fonte
Você pode salvar mais bytes exigindo que os presentes sejam argumentos e uso da linha de comandos (%*). Feito isso, é possível %0 %*reiniciar o script após o processamento de cada intervalo. (Na verdade, eu acabei com uma contagem de bytes maior porque eu usei a sua versão interativa com os toques agradáveis &&, exit/be echocomo ponto de partida.)
Neil
@ Neil Nice, obrigado! Inicialmente, tentei usar, %1mas as aspas "fazem o espaço não funcionar como separadores, então acabei usando set /p.
user202729
Oh wow, há ainda $~1...
user202729
1

Limpo , 59 bytes

import StdEnv;f p l=flatten[[n\\n<-p|a<=n&&n<=b]\\[a,b]<-l]

Experimente online!

Toma duas listas, retorna uma lista.

Furioso
fonte
1

Wolfram Language (Mathematica) , 34 bytes

r#~SortBy~{#&@@@r~Position~#&}&

Experimente online!

é o Functionoperador.

Esta é uma função ao curry sem nome que deve ser chamada primeiro com a lista de intervalos de encaixe (expandidos) e depois com a lista de presentes. Por exemplo, se você atribuir a função a f:

f[ {{4,5,6,7},{1,2,3}} ][ {1,2,3,4,5,6,7} ]

A lista de presentes é simplesmente classificada pela posição de primeiro nível do valor na lista de intervalos de encaixe. Precisamos agrupar a SortByfunção em uma lista para tornar a classificação estável.

Martin Ender
fonte
1

Julia 0.6 , 31 30 bytes

p%d=vcat((∩(p,x)for x=d)...)

Experimente online!

Redefine o %operador e mapeia a interseção do conjunto ∩()sobre as docas, dmantendo a ordem e a multiplicidade da primeira entrada, a lista de presentes p. vcatcom a entrada expandida para vários argumentos, ...nivela a matriz aninhada resultante.

Editar, -1Byte: compreensão da lista em vez de map().

LukeS
fonte