アドベントチャレンジ5:プレゼントを輸送ドックに移す!


9

<<前 へ次へ>>

PPCGコミュニティのおかげで、サンタはすべてのプレゼントを再製造することができ、組み立てラインの後、プレゼントは輸送ドックに移動する準備ができました!

輸送用そりは特定のサイズに特化しているため、サンタの各輸送ドックは現在のサイズの範囲しか保持しません(軽量で無駄になり、重くなり、そりが負荷を処理できなくなります)。したがって、彼はあなたが彼が彼のプレゼントを取り、それらを正しい輸送ドックに分類するのを助けるあなたを必要としています。

チャレンジ

リストと輸送ドックの範囲を考慮して、プレゼントを正しい順序で安定して整理します。

たとえば、これを見てみましょう。プレゼントは[5, 3, 8, 6, 2, 7]で、ドックの範囲は[[1, 5] and [6, 10]]です。

プレゼント532最初のドックやプレゼントに入り86、及び7第二ドックに入ります。これはと表示できます[[5, 3, 2], [8, 6, 7]]。このリストは入力よりも並べ替えstablyられますが、各ドック内では、プレゼントの順序は入力の順序と同じでなければなりません(それ以外の場合は、リスト全体を並べ替えることができます)。

この場合の最終的な出力は[5, 3, 2, 8, 6, 7](フラットリストとして)になります。

フォーマット仕様

あなたが(例えば、上記の場合の範囲はとして与えることができる任意の合理的なフォーマットの整数のフラットリストと範囲のリストとして入力を与えられる[[1, 5], [6, 10]][1, 5, 6, 10]または[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]])。出力は、適切な形式の整数のフラットリストである必要があります。

入力には重複した値を含めることができます。この場合、それらのすべてのインスタンスを返す必要があります。現在のすべてのサイズは正確に1つのサイズ範囲にあり、範囲が重複することはないと想定できます。現在のすべてのサイズがカバーされている限り、範囲にギャップが存在する可能性があります。

ルール

  • 標準抜け穴が適用されます
  • これはなので、バイト単位の最短の回答が優先されます
  • 回答は受け付けられません
  • 空の範囲はないと想定できます([7, 4]範囲が上がるため無効になります)

テストケース

[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]

注:このチャレンジシリーズは、Advent Of Codeからインスピレーションを得ました。このサイトとは関係ありません

こちらの最初のチャレンジの「リンクされた」セクションを見ると、シリーズのすべてのチャレンジのリストを確認できます


常に2つのドックだけですか?
LiefdeWen 2017

範囲は重複できますか?
RamenChef 2017

@LiefdeWen 3番目のテストケースを参照してください。
Xcoder氏、2017

ドックのペアは常に{small、big}になります
LiefdeWen 2017

@RamenChef No ..
HyperNeutrino 2017

回答:



4

ゼリー、4バイト

fЀẎ

オンラインでお試しください!

現在のリスト、全範囲として入力を受け取ります。


それが私が期待したゼリーの解決策だよ:DDD
HyperNeutrino

@HyperNeutrino Hehe予想されるソリューションは最短ではないことが判明しました。05ab1eの外積が機能する方法を見つけることにより、私はそれfþFがJellyでも3バイトで機能することを理解しました。クレジットはアドナンに送られます。
Xcoder氏17

@ Mr.Xcoderあなたかアドナンのどちらかが投稿してください。
Erik the Outgolfer 2017

@ Mr.Xcoder少し待って、:Pを見てみますが、見た目はかなり異なります。
Erik the Outgolfer 2017


3

Pyth、5バイト

s@Rvz

ここでお試しください!

Pyth、10バイト

s.gx}LkQ1E

ここでお試しください!

それらがどのように機能するか

s @ Rvz | 完全なプログラム。

  R | 右の地図...
 @ | ...交差点を使用しています。
   vz | 最初の入力と2番目の入力。
s | 1レベルずつ平坦化します。
s.gx} LkQ1E | 完全なプログラム。

 .g E | 2番目の入力の項目をグループ化して...
    } LkQ | 最初の入力にマップし、現在のアイテムがリストにあるかどうかを確認します。
   x 1 | 最初の真実の要素のインデックスを取る。
s | 平らにする。

最初にドックを受け取り、すべての整数を範囲内にし、次に現在行を新しい行に表示します。



3

05AB1E、3バイト

δØ

オンラインでお試しください!(存在を知らせてくれたAdnanに感謝δ、-1バイト)

使い方

δÃ〜| 完全なプログラム。

δ| 次のコマンド(外積のようなもの)を二重ベクトル化します。
 Ã| 交差点をリストします。これはダイアドなので、最初の入力は自動的に
     | 欠落している引数を埋めるために使用されます(私の知る限り)。
  〜| 平らにする。

まあ、€Ã˜動作していないようです。
Erik the Outgolfer 2017

いいえ、ありません。ところで理由€Ã˜ので、失敗はあるÃ二つの引数をとり、一つの引数を持つ関数を期待し、それを返しますので、[[]](私はそれはバグだと思う)の代わりに、そうして˜戻って、平らにします[]εただし、動作は異なります。最上位アイテムの各要素に対して、新しいスタックを作成してから、各新しいスタックの最上位を返します。そのため、関数に十分なアイテムがない場合は、代わりに暗黙的な入力を受け取ります。
Erik the Outgolfer 2017

私はまだそれをテストしていませんが、δØあなたが探しているのは何ですか?
Adnan 2017

@ Mr.Xcoder私はそれがピスが持っているダイアディックマップではないと思います、それは外積か何かのように振る舞います。
Erik the Outgolfer 2017

3

Retina37 36バイト

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

オンラインでお試しください!1行目にはプレゼントのリスト、2行目には範囲のリストとして入力を受け取ります。リンクには、テストケースを目的の形式に分割するためのヘッダーが含まれています。編集:@MartinEnderのおかげで1バイトが節約されました。説明:最初のステージはプレゼントと一致し、一致するドックを見つけます。プレゼントは、行の先頭からまでの部分文字列で並べ替えられ、[ドックごとにプレゼントがグループ化されます。次に、第2ステージでドックを削除します。


2

Enlist、3バイト

f₱Ẏ

オンラインでお試しください!

使い方

f₱Ẏ| 完全なプログラム。

 ₱| 正しい引数にマップします。
f | リストの交差を使用して、多重度をカウントします。
  Ẏ| 締めます(1レベルずつ平らにします)。

1
:D Enlistは忘れられませんでした:D実際には、コミュニティではなく、私
自身でした

2

APL + WIN、29バイト

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

整数と範囲の両方の画面入力を要求します。整数をフラットリストとして、範囲をネストされたベクトルとして(例:ケース3)

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

説明:

(×/⍴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

2

C ++、127バイト

ポインタのペアで表される2つの配列として入力を受け取ります[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];});}

オンラインでお試しください!


まあ、C ++にはすべての機能が組み込まれています...それともそうですか?/入力範囲に0が含まれていない場合、不正なコードと見なされることもありますが、nullで終了する配列Bを使用して一部のバイトを調べることができます。/残念ながら、[&](int a)->int{a=a>=代わりに[&](int a){return a>=バイトを節約しません。/ #import<algorithm>#import<regex>、少なくともTIO上で可能です。徹底的に検索した後(「手動バイナリ検索」)、このページにリストされているすべてのヘッダーが最も短いことがわかりました。/また、+ 1してください。
user202729 2017

2

J、15バイト

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

入力を左の引数、範囲を右の引数として受け取ります。範囲は、完全な範囲のボックスリストです。

たとえば、最初の範囲の場合:

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

オンラインでお試しください!

説明

[/:[: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

2

J26 24バイト

コールのおかげで2バイト

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

使い方:

左の引数は範囲を保持します。

-&1 0"1@[ 各範囲の下限を1減らします

I."1] それぞれの存在に適合する範囲をチェックします

1= 正しい範囲内ですか

]<@#~ 現在の範囲にあるプレゼントをコピーして箱に入れる

; -レイズ(ボックス化解除)

オンラインでお試しください!


1
入力が整数であるため、ゼロを削除できないと確信しています(たとえば、このテストケースに失敗します(0 4,:_3 _1) f _2 _1 0 1 2
cole

@coleうーん、私はこれらの事件を完全に無視していた。それらについて考える必要があります。
Galen Ivanov 2017

1
ええ、私はおそらく最も簡単な方法はおそらくボックスに入れてからレイズすることだと思います。そのように24バイト。
cole 2017

@coleありがとうございます!それだけでなく、短いですが、簡単に0で問題を解決
ガレン・イワノフ

2

R113 48 55 41バイト

以前のバージョンでは、ドックが昇順でない場合、オブジェクトが正しくソートされませんでした。

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

オンラインでお試しください!

D範囲のベクトルのリストとして受け取りlist(4:7,1:3)ます[[4, 7], [1, 3]]。つまり、になります。

おそらく私が何年も前に到着したはずの素朴な答え。stdoutに出力します。


2

Japt、6バイト

ñ@VbøX

それを試してみてください


説明

配列U(存在)および2D配列V(全範囲)の暗黙的な入力。現在のプレゼント()を含む()内の最初の要素()のインデックスを取得ñする関数(@)に渡してプレゼントをソート()します。bVøX


1

Python 2、97 85バイト

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)

ovsから-11バイト

Xcoder氏からの1バイト

オンラインでお試しください!

再帰的なラムダをキーとして使用してリストをソートします。説明はすぐに™の下に来る™

説明:

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


1

PowerShell、37バイト

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

オンラインでお試しください!

かかる$a提示のリテラル配列として及び$bフルレンジ(例えば、それぞれその配列の配列など@(1,2,3,4,5)の代わりに@(1,5))。私たちは、その後の各項目をループ$b付き|%{...}。内部では、ヘルパー$iを現在のアイテムに設定し、次にWhere-Object句を使用$aして-in、現在の$b配列であるアイテムのみを引き出します。

それらはパイプラインに残され、出力は暗黙的です。のデフォルトの動作ではWrite-Output、配列要素の間に改行が挿入されるため、これが得られます。以下は、微調整されたバージョンで-join、違いを示すために改行ではなくカンマでまとめられています。




1

Windowsバッチ(CMD)、90 79バイト

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

LF行末フォーマットを使用します。各行末文字は1バイトとしてカウントできます。

TIOなし(TIOはLinuxを使用するため)

コマンドライン引数からリストを取得し、範囲はからstdinです。

たとえば、プログラムが実行されている場合(ファイルの名前がであると想定r1.cmd

r1 7 3 5 4 6 1 2

そしてstdin入力あり

1
3
4
5
6
7

、プログラムはstderr形式で出力されます

'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.

(出力シーケンスに対応3 1 2 5 4 7 6


説明:

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

Ungolfedコード(true引数1として渡された場合に相互作用が有効になっています;からのリストのプロンプト、スタックオーバーフローを回避するためstdinに使用gotoしてください-実際には、問題なく70000回以上呼び出されるスクリプトを実行しようとしたので、私はそれを推測しますかなり安全でなければなりません):

@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

プレゼントをコマンドライン引数にしてを使用することで、より多くのバイトを節約できます(%*)。これを行ったら、を使用%0 %*して、各範囲の処理後にスクリプトを再起動できます。(実際には、インタラクティブなバージョンを素敵なタッチで&&exit/bそしてecho私の出発点として使用したため、バイトカウントが大きくなりました。)
Neil

@ニールニース、ありがとう!私は最初に使用しようとしました%1が、引用符"がスペースをセパレータとして機能させないため、結局はを使用しましたset /p
user202729 2017

ああ、すごい$~1です...
user202729


1

Wolfram言語(Mathematica)、34バイト

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

オンラインでお試しください!

あるFunctionオペレータが。

これは名前のないカリー化された関数で、最初に(拡張された)ドック範囲のリストを使用して、次にプレゼントのリストを使用して呼び出す必要があります。たとえば、関数をf次のように割り当てたとします。

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

プレゼントのリストは、ドック範囲のリスト内の値の第1レベルの位置によって単純にソートされます。SortByソートを安定させるには、関数をリストでラップする必要があります。


1

ジュリア0.631の 30バイト

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

オンラインでお試しください!

%オペレーターを再定義し、セットの交差∩()をドックにマップしてd、最初の入力のpresentsのリストの順序と多重度を維持しますpvcat入力を複数の引数に展開して...、結果のネストされた配列をフラット化します。

編集、-1Byte:の代わりに内包表記をリストしmap()ます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.