整数がキューに加わるとき


26

前書き

キューは、要素は抽象データ型である前部に添加(エンキュー)及び背面から除去(デキュー)。これは、FIFO(先入れ先出し)原理とも呼ばれます。

例で最もよく示されています。

ここに画像の説明を入力してください


チャレンジ

所与の非空含む配列正の整数示す要素デキュー(元素を除去する)、出力キューの最終的なリストを。

Xこの例でデキューを示しているとしましょう。次のリストを見てみましょう。

[45, X, X, 37, 20, X, 97, X, 85]

これは、次のキュー擬似コードに変換できます。

                   Queue
Enqueue 45    ->   45
Dequeue       ->   
Dequeue       ->              (dequeue on an empty queue is a no-op)
Enqueue 37    ->   37
Enqueue 20    ->   20 37
Dequeue       ->   20
Enqueue 97    ->   97 20
Dequeue       ->   97
Enqueue 85    ->   85 97

最終的に、結果が[85, 97]であり、このシーケンスの出力であることがわかります。


テストケース

あなたがのために、他の記号や文字を選択することがX、それは正の整数ではありません限り、。

[1, X, 2, X, 3, X]      ->     []
[1, 2, X]               ->     [2]
[1, 2, 3]               ->     [3, 2, 1]
[1, 2, X, X, X, 3]      ->     [3]
[1, 2, X, 3, X, 4]      ->     [4, 3]

これはであるため、バイト数が最小の提出が勝ちです!


配列の代わりにスペースで区切られた文字列にすることはできますか?
ライリー

あなたのための最高の作品何でも@Riley確かに、
アドナン・

2
xに負の数を使用できますか(Haskellは異種リストをサポートしていません)
汎用表示名

2
...またはゼロまたは半分のような他の非負でない整数?
ジョナサンアラン

@GenericDisplayNameうーん、良い点。長い間、それは正の整数ではないと私はそれを許可します
アドナン・

回答:


4

ゼリー、8バイト

F;@Ṗṛ?¥/

偽の値(0または空の反復可能)を使用してデキューします。

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

使い方

F;@Ṗṛ?¥/  Main link. Argument: A (array)

       /  Reduce A by the link to the left.
      ¥     Combine the two links to the left into a dyadic chain.
F             Flatten the left argument.
    ṛ?        If the right argument is truthy:
 ;@             Concatenate the right argument and the flattened left argument.
              Else:
   Ṗ            Pop; remove the last element of the flattened left argument.
                This is why flattening is required, as Ṗ doesn't handle integers
                as intended for this challenge.

1
実際には禁止されていません。正の整数のみが禁止され、0は中立です。
エリックアウトゴルファー

それは私が答えを投稿したときに言ったことではありませんが、率直に感謝します。
デニス


7

Mathematica、102バイト

間違いなく最短の解決策ではありませんが、それは一種のひねくれたものなので、私は抵抗できませんでした。

r=Reverse@{##}&
a_~f~b___:=b
f[a_,b___,]:=b
ToExpression[{"r[","f["~Table~StringCount[#,"]"],#}<>"]"]&

いくつかのヘルパー関数の後、これは入力として文字列を受け取る純粋な関数を定義します。文字列では、数字はカンマで区切られます(空白はオプションです)。デキュー文字は"]";です。また、リストの前後に区切り文字はありません。たとえば、OPの最初の例は文字列として入力されます"45,],],37,20,],97,],85"。関数の出力は数値のリストです。

この関数は"]"、入力文字列に含まれるデキューの数をカウントし、その数のコピーを"f["文字列の先頭に追加してから、全体をで囲み"r[...]"ます。上記の例では、これにより"r[f[f[f[f[45,],],37,20,],97,],85]";が生成されます。ブラケットのバランスが取れていることに注意してください。

次に、ToExpression結果の文字列をMathematicaコードの一部として解釈し、実行します。この関数fは、最初の引数を除くすべての引数を保持するように便利に定義されており(末尾のコンマも無視します。これは空のキューのデキューを処理するために必要です)、r結果の数値シーケンスを正しい順序で数値のリストに変換します。


行3のコンマはb___,そこにあることを意図していますか?それは動作しますが、コンマターンはそれのために赤いです。(また、2行目と3行目の違いは何ですか?)
numbermaniac

1
良い目:) 2行目はf[a_,b___]:=b(カンマなし)と同等で、3行目はと同等f[a_,b___,Null]:=bです。どちらの場合でも、b___任意の数の引数を参照します(引数なしを含む)。3行目はより具体的であるため、適切な場合は常に2行目の前に使用されます。したがって、関数fは最初の引数を無視し、その引数がの場合、最後の引数も無視しますNull。これは、空のキューのデキューを処理するために必要でした。典型的な入力のような式が得られることに注意してくださいr[f[f[f[5,3,],2,],],11]各コンマの前にここで、]再び表しますNull
グレッグマーティン

1
うわー、非常にいい:)。ちなみに、実際には102バイトだと思います。最後に余分な改行文字をカウントした可能性があります。
numbermaniac


4

JavaScript、70 63 53 50 43バイト

@ Neil、forループと三項表現の代わりにx.mapを使用して10バイトをゴルフしてくれてありがとう

@ Arnauld、3バイトのゴルフをありがとう

@ ETHproductions、7バイトのゴルフをありがとう

x=>(t=[],x.map(a=>+a?t=[a,...t]:t.pop()),t)

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

デキューには、true以外の任意の非数値を指定できます。


これは、if ステートメントの代わりに3項を使用した場合は短くなりmap、ループの代わりに使用した場合はさらに短くなり、ブロックの代わりに式を使用した場合はさらに短くなります。ヒントを参照してください。
ニール

私が働いた最初のバージョンを投稿しました。それから私は夕食を食べました:P
fəˈnɛtɪk

x=>(t=[],x.map(a=>a>0?t.unshift(a):t.pop()),t)return
ETHproductions

x=>x.map(a=>a>0?t.unshift(a):t.pop(),t=[])&&tさらに短いです。
ニール

(または単にa?十分でしょうか?)
ニール

3

Mathematica、46 45バイト

1バイトを節約してくれたngenisisに感謝します。

Reverse[#//.{_Integer:0,a___,X,b___}:>{a,b}]&

基本的に私のRetinaの回答と同じですが、パターンマッチングを使用します。X最初の番号を繰り返し照合し、最初の番号(存在する場合)とともに削除します。完了したら、リストを逆にします。




3

MATL13 12バイト

vi"@?@wh}IL)

入力は、0「デキュー」のための数字の配列です。

出力は、スペースで区切られた数字です。空の結果は何も表示されません。

オンラインでお試しください!または、すべてのテストケースを確認します

説明

v        % Concatenate stack contents: gives []. This will grow to represent the queue
i        % Input numeric array
"        % For each entry in the input array
  @?     %   If current entry is non-zero
    @wh  %     Prepend current entry to the queue
  }      %   Else
    IL)  %     Remove last element from the queue
         %   End (implicit)
         % End (implicit)
         % Display (implicit)


3

ジュリア、78 76 73 57バイト

f(a)=(q=[];[x<1?q=q[2:end]:push!(q,x)for x=a];reverse(q))

ジュリアの素晴らしいゴルフの提案をしてくれたHarrison Grodinに感謝します。if / elseを3項に、for / endをリスト内包表記に置き換えて、16バイト節約しました。

f(a)=(q=[];for x in a if x<1 q=q[2:end]else q=[q...,x]end end;reverse(q))

3バイトの節約のためにいくつかの不要なスペースを削除しました。

負の数またはゼロが許可される前:

f(a)=(q=[];for x in a if x==:X q=q[2:end] else q=[q...,x] end end;r everse(q))

ゴルフをしていない:

function dequeue(list)
    queue = []

    for x in list
        if x < 1
            queue = queue[2:end]
        else
            queue = [queue..., x]
        end
    end

    reverse(queue)
end

私はジュリアにはかなり新しいです。より良い方法があるかもしれません。:XジュリアのシンボルであるXに使用します。更新:0が許可されたため、Xに0(または任意の負の数)を使用して、2文字を保存します。再度更新して、不要なことに気づかなかった空白を削除しました。


2

05AB1E12 11バイト

ライリーのおかげでバイトを節約

)Evyai¨ëy¸ì

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

説明

デキューは、任意の文字で示されます

)             # wrap stack in a list (pushes empty list)
 Ev           # for each y in evaluated input
   yai        # if y is a letter
      ¨       # remove the first element of the list
       ëy¸ì   # else, prepend y to the list

2

GNU Sed、43

スコアには-rおよび-nフラグの使用のための+2が含まれます。

G
s/X\n( *|(.*)\b\S+ *)$/\2/
s/\n/ /
h
$p

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

説明

                            # Implicitly read the next line
G                           # append a newline, then the contents of the hold space
s/X\n( *|(.*)\b\S+ *)$/\2/  # If the input was an X, remove it, the newline, and any element at the end
s/\n/ /                     # Otherwise if the input was not an X, it is simply enqueued by removing the newline between it and the rest of the line
h                           # save a copy of the queue to the hold space
$p                          # since we're using -n to suppress output at the end of processing each input line, then this explicit print is required in the last line

2

PHP、85バイト

<?$r=[];foreach($_GET as$v)is_int($v)?array_unshift($r,$v):array_pop($r);print_r($r);

すべてのデキュー値がfalseに属する場合では$vなく、-8バイトis_int($v)



2

Perl 5、28 + 1 = 29バイト

28バイトのコード+ -pフラグ。

/\d/?$\=$_.$\:$\=~s/.*
$//}{

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

文字列($\)をキューとして使用します:入力に整数(が含まれている場合、()/\d/?の先頭に追加し、そうでない場合は最後の文字を。で削除します。最後に、フラグのおかげで暗黙的に出力されます(そして比類のないもの)。$\$\=$_.$\s/.*\n$//$\-p}{


その他のアプローチ:

  • キューとして配列を使用する33バイト(これはPerlで最も自然な方法ですが、最短ではありません):

    /X/?pop@F:unshift@F,$_}{$_="@F"

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

  • 52バイト、正規表現を使用してreverse(たまたまMartin EnderのRetinaの答えとまったく同じことです-2バイトを保存してくれたおかげです)。ただし、整数を保持するには、文字列を配列に変換して逆にし、印刷して文字列に戻す必要があるため、リストの反転には多くの文字が必要です。(say for代わりに$_=join$",2バイトを節約できますが、-Eor が必要であり、-M5.010それほど面白くありません)。

    s/\d+ (.*?)X ?|^X/$1/&&redo;$_=join$",reverse split

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



1

バッチ、160バイト

@set s=.
@for %%n in (%*)do @if %%n==X (call set s=%%s:* =%%)else call set s=%%s:~,-1%%%%n .
@set t=
@for %%n in (%s:~,-1%)do @call set t= %%n%%t%%
@echo%t%

これは必要以上に困難でした。

  • Batchは文字列の分割結果を列挙できますが、列挙から要素を簡単に削除することはできません。
  • 最初のアイテムを削除できますが、少なくとも1つのアイテムがある場合のみです。そうしないとごみが出ます。

つまり、a)削除されないキューの終了マーカーが必要であり、b)キューを前後に操作する必要があるため、新しいマーカーが終了マーカーの直前に挿入されます。古いアイテムを前面から削除できるようにするため、c)印刷する前にキューを逆にする必要があります。


1

PHP、70バイト

foreach($argv as$v)+$v?$r[]=$v:array_shift($r);krsort($r);print_r($r);

1

C#、115バイト+33バイトを使用

l=>{var r=new List<int>();foreach(var n in l)if(n<0)try{r.RemoveAt(0);}catch{}else r.Add(n);r.Reverse();return r;};

エンキューおよびデキュー操作を実行した後に整数のリストを返す匿名メソッド。負の整数は、キューから要素を削除するために使用されます。

ungolfedメソッドとテストケースを含む完全なプログラム:

using System;
using System.Collections.Generic;

public class Program
{
    static void PrintList(List<int> list)
    {
        var s = "{";
        foreach (int element in list)
            s += element + ", ";
        if (s.Length > 1)
            s += "\b\b";
        s += "}";
        Console.WriteLine(s);
    }

    public static void Main()
    {
        Func<List<int>, List<int>> f =
        l =>
        {
            var r = new List<int>();
            foreach (var n in l)
                if (n < 0)
                    try
                    {
                        r.RemoveAt(0);
                    }
                    catch
                    { }
                else
                    r.Add(n);
            r.Reverse();
            return r;
        };

        // test cases:
        var list = new List<int>(new[]{1, -1, 2, -1, 3, -1});   // {}
        PrintList(f(list));

        list = new List<int>(new[]{1, 2, -1});  // {2}
        PrintList(f(list));

        list = new List<int>(new[]{1, 2, 3});   // {3, 2, 1}
        PrintList(f(list));

        list = new List<int>(new[]{1, 2, -1, -1, -1, 3});   // {3}
        PrintList(f(list));

        list = new List<int>(new[]{1, 2, -1, 3, -1, 4});    // {4, 3}
        PrintList(f(list));
    }
}

1

Scala、97バイト

type S=Seq[_];def f(a:S,b:S):S=a match{case h::t=>f(t,if(h==0)b dropRight 1 else h+:b);case _=>b}

入力として、「dequeue」要素としてfリストを使用0します。2番目のパラメーター(b)で末尾再帰を使用し、アキュムレーターとして機能します。最初bは、空SeqNil)です。

説明:

type S=Seq[_]                               // defines a type alias (save 1 byte since Seq[_] is used 3 times)
def f(a: S, b: S): S = {                    // a is the initial list, b is an accumulator
    a match {                           
        case h::t =>                        // if a is non-empty
            f(t,                            // recursive call to f with 1st parameter as the tail
                if (h==0) b dropRight 1     // if h == 0 (dequeue) then remove last element of b,
                else h+:b                   // otherwise, just add h at the beginning of b in recursive call
            )
        case _ => b                         // when the list is empty, return b (final result)
    }
}

注: 例外を避けるb dropRight 1代わりに使用されb.tailます:tail of empty list

テストケース:

f(Seq(45, 0, 0, 37, 20, 0, 97, 0, 85), Nil)     // List(85, 97)
f(Seq(1, 0, 2, 0, 3, 0), Nil)                   // List()
f(Seq(1, 2, 0), Nil)                            // List(2)
f(Seq(1, 2, 3), Nil)                            // List(3, 2, 1)
f(Seq(1, 2, 0, 0, 0, 3), Nil)                   // List(3)
f(Seq(1, 2, 0, 3, 0, 4), Nil)                   // List(4, 3)

fまた、他のタイプで動作することができます(Stringchar、...、これらのタイプのさえ異質リスト!):

f(Seq(false, '!', "world", 0, "Hello"), Nil)    // List(Hello, world, !)

1

REXX、115バイト

arg n
do while n>''
  parse var n m n
  if m=X then pull
  else queue m
  end
o=
do while queued()>0
  pull a
  o=a o
  end
say o

スペースで区切られた文字列を受け取り、スペースで区切られた文字列を出力します



1

Swift 3、70バイト

次のようなIntの配列があると仮定します let x = [1, 2,-1,3,-1,4]

print(x.reduce([].prefix(0)){(a,i)in return i>0 ?[i]+a:a.dropLast(1)})

[].prefix(0)空のArraySliceを取得するための巧妙な方法であることに注意してください

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