普通の人のようにスキトルズを食べる


47

スキトルズは、5つの異なるフレーバーがある色付きのキャンディーです。ブドウ、青リンゴ、レモン、オレンジ、イチゴはそれぞれ(p)urple、(g)reen、(y)ellow、(o)range、および(r)edで表されます。私は、すべての異なる色を並べ替えて、順番にそれらを食べることによって、スキトルズを食べるのが常でした。オフィスでいくつかの奇妙な外観を取得した後、私は今それらを普通の人のように食べるふりをします。あなたの仕事はこれをエミュレートすることです:

コード(完全なプログラムまたは機能)は、スキトルの配列(10x10)を(妥当な形式で)入力として受け取ります。この配列は、並べ替えられていないスキトルズの山を表します。一番好きな色から好きな色に「食べる」ことがあなたの仕事です。私の優先順位はグレープ、青リンゴ、レモン、オレンジ、イチゴですが、一貫して実施されている限り、任意の順序を自由に選択できます(提出物に好みを記載して、判断できるようにしてください)。各キャンディーを食べた後、コードは、食べたものをスペースに置き換えた残りのパイルを(入力と同じ形式で)出力します。お気に入りだけが残るまで繰り返します。スキトルを選択して食べることができます(ランダムまたは確定的)。末尾のスペースは保持する必要があります。

たとえば、出力シーケンスは次のようになります(簡潔にするために5x5を使用し、スペースをとして表示します.

start   1     2     3     4     5        n 
.org. .org. .org. .org. .or.. .or..    ..r..
prgrg .rgrg .rgrg .rgrg .rgrg .r.rg    .r.r.
gggpr gggpr ggg.r ggg.r ggg.r ggg.r    ....r
oyyor oyyor oyyor oyyor oyyor oyyor    ....r
.r.p. .r.p. .r.p. .r... .r... .r...    .r...

これはなので、バイト単位の最短コードが優先されます

TL; DRルール:

  • 提出は完全なプログラムまたは機能である場合があります
  • 入力は、妥当な方法(STDIN、関数の引数など)によって、妥当な形式(文字列、リスト、行列など)で行われます。ただし、行間には線引きが必要です
  • 出力は、妥当な方法(STDOUT、関数戻りなど)による入力と同じ形式で生成する必要があります。中間出力は区切られる場合とされない場合があります
  • 最初の出力は最初の入力とする
  • 末尾のスペースは保持する必要があります
  • 任意の色の順序を使用できます(回答に記載してください)
  • 現在の色のスキトルを食べることができます
  • 最後の出力は、お気に入りの色とスペースのみになります
  • 可能であれば、オンラインコンパイラへのリンクを含めて提出物をテストしてください

4
@MukulKumarは、正しい、あなたが一緒に行くようにそれらをよりよくなりたい
wnnmaw

2
スキトルズは、単一の100スキトルズ文字列として受け入れられますか、改行などは受け入れられませんか?
ガブリエルベナミー16

1
中間出力は何かで区切る必要がありますか?
ポケ


8
このチャレンジに参加することを検討し、「あなたの提出物にあなたの好みを記載してください。そうすれば、あなたがそれを判断できるようになります」と読みました。人々はすでに私の好みを判断しすぎていると思います!
トビーSpeight

回答:


16

ゼリー16 14  13 バイト

Ṅ⁶ỤṪ$¦µQL>3µ¿

TryItOnline!

OCDを真剣に考えている人は、アルファベット順です。

入力および出力をテキストとして受け取ります(つまり、行は改行で区切られます)。

方向を逆にして別の方法を使用することで3バイト節約されました。アルファベットから文字を見つけるのではなく、グレードアップします。

どうやって?

Ṅ⁶ỤṪ$¦µQL>3µ¿ - Main link: Skittle text
      µ    µ  - monadic chain separation
            ¿ - while
       Q      - unique items
        L     - length
         >3   - greater than 3 (until only new lines, spaces and 'g's remain)
Ṅ             -     print z and a line feed, yield z
    $         -     treat last two links as a monad
  Ụ           -         grade up (get indices of: new lines; spaces; gs; os; ps; rs; ys)
   Ṫ          -         tail (the last of those, so last y if there is one, else last r, ...)
 ⁶            -     space character
     ¦        -     apply at index (replace that index with a space)

8

JavaScript(ES6)、74 75 74バイト

課題は、ブドウ、青リンゴ、レモン、オレンジ、イチゴのチャレンジで説明されているように注文されます。

中間出力は改行で区切られます。

f=(s,n=3,r=s)=>(S=s.replace('oygp'[n],' '))!=s&&(r+=`
`+S)||n--?f(S,n,r):r

テストケース

このテストケースでは、5x5の例を使用しています。他のグリッドサイズは期待どおりに機能するはずです。


8

バッシュ、 48、46バイト

更新:

  • printfに生のパラメーターを使用して2バイトを保存しました。

ゴルフ

sed -nz "p;:a;`printf "s/%s/ /p;ta;" p g y o`"

stdinで入力を受け取り、stdoutに出力します。紫、緑、黄色、そしてオレンジを食べます。

同等のsedプログラムは次のとおりです。

p;:a;s/p/ /p;ta;s/g/ /p;ta;s/y/ /p;ta;s/o/ /p;ta

サンプル出力(区切り記号はわかりやすくするためのものです)

-----
 org 
prgrg
gggpr
oyyor
 r p 
-----
-----
 org 
 rgrg
gggpr
oyyor
 r p 
-----
-----
 org 
 rgrg
ggg r
oyyor
 r p 
-----
-----
 org 
 rgrg
ggg r
oyyor
 r   
-----
-----
 or  
 rgrg
ggg r
oyyor
 r   
-----
-----
 or  
 r rg
ggg r
oyyor
 r   
-----
-----
 or  
 r r 
ggg r
oyyor
 r   
-----
-----
 or  
 r r 
 gg r
oyyor
 r   
-----
-----
 or  
 r r 
  g r
oyyor
 r   
-----
-----
 or  
 r r 
    r
oyyor
 r   
-----
-----
 or  
 r r 
    r
o yor
 r   
-----
-----
 or  
 r r 
    r
o  or
 r   
-----
-----
  r  
 r r 
    r
o  or
 r   
-----
-----
  r  
 r r 
    r
   or
 r   
-----
-----
  r  
 r r 
    r
    r
 r   
-----

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


7

Python 2、60 57 56バイト

def f(s):print s;q=max(s);q>'g'and f(s.replace(q,' ',1))

repl.it

最後の緑を残して、逆アルファベット順で食べる再帰関数。

入力sは、aの序数より小さい行区切り文字'g'(たとえば、改行またはコンマ)を持つ文字列です。

この関数は入力を出力し、その入力に 'g'より大きい値が含まれている場合は再帰し、最大文字が最初に現れる場所をスペースに置き換えて入力を渡します。

(ほぼ私のゼリーのポートの答え。)


6

Perl、53 46 + 2 = 48バイト

で実行 -0n

@Dadaのおかげで-10バイト

編集:また、指摘してくれた@Dadaのおかげで、入力を最初の出力として印刷するのを忘れていました。それは修正されました。

say;eval sprintf"say while s/%s/./;"x4,p,o,g,r

この答えには少し巧妙なものがあるので、何が起こっているのかを分析します。

まず、Perlは複数行のパラメーターが渡されることを好みません。変数$/は入力レコードの区切り文字であり、入力に格納されている文字が検出されるたびに、インタープリターはその入力を終了し、新しい入力を開始します。デフォルトのコンテンツは改行文字\nです。つまり、複数行の文字列を渡すことはできません。そのためには、$/そのコンテンツの設定を解除する必要があります。ところです-0フラグが入って来:設定が-0保存されますnull変数に$/通訳が暗黙の変数にすべてを読み取ることができるように、$_一度に。

次の策略はevalステートメントです。まさに何をしているのevalでしょうか?このステートメントevalの結果はsprintf次のように分類されています。

最初にsprintf渡されるのは、"say while s/%s/./;"4回繰り返される文字列です。したがって、

say while s/%s/./;say while s/%s/./;say while s/%s/./;say while s/%s/./;

次に、sprintf4つのベアワード文字が渡さp,o,g,rsprintfます%s。これらの文字は、ステートメントに補間され、の各インスタンスを置き換えます。次に取得されるのは、eval関数に渡される次の文字列です。

say while s/p/./;say while s/o/./;say while s/g/./;say while s/r/./;

whileループは式を評価しますs/[color]/./。これは、暗黙変数$_にある色の最初のインスタンスをピリオドに置き換えます。置換が行われた場合はを返し1、そうでない場合は何も返しません。以来、s///副作用を有し、それは、元の変数変更$_内容次いで介して印刷されているが、say。このループの4つのバージョンが実行され、紫、オレンジ、緑、そして赤が置き換えられ、黄色のみが残されます。

黄色が残っている理由yは、それが実際には関数であるため、裸語になれないためでyあり、これらの文字の代わりにを使用するとエラーがスローされます。引用符で囲む(+2バイト)か、大文字のYを使用して大文字と小文字を区別しない正規表現(+1バイト)にすることでこれを変更できますが、ではすべてのバイトがカウントされるため、実際に好きだと決めましたレモンスキットルズが一番。

TL; DR: Grape, Orange, Green Apple, Strawberry, Lemon


-0フラグは、10バイトの周りにあなたを救うはずです
ダダ

また、私はあなたがルールを逃したことを恐れていますFirst output shall be the first input
ダダ

1
あなた自身の個人的な好みを犠牲にするためにあなたの良いは2つのバイトを保存する
wnnmaw

4

Perl、30 31 33 + 2 = 32 33 35バイト

for$x(g,o,p,r){say;s/$x/ /&&redo}

-n0(2バイトのペナルティ)で実行します。

どうやら、私はプログラムがそのように短くなるので、アルファベット順でスキトルズを食べるのが好きです。プログラムはあまり説明を必要としません:-n0入力を暗黙的に-n読み取ります(「暗黙的に入力を読み取る」、-0「改行で入力を中断しない」を意味します)。for$x(g..r)ループ実行される$xから、各文字のセットgr順番にします。say;突然変異の後に現在の入力を出力します。(具体的には、最初の)のs/$x/ /1つのコピーを$x、可能であればスペースに置き換えます。&&redo置換が成功した場合、中括弧内のコードを繰り返します(ループカウンターを進めることなく)。

このプログラムは、長さを変えずに、より多くのフレーバーのSkittleに簡単に一般化でき、あらゆるサイズのパイルで機能します。

ここに、テストできるIdeoneリンクがあります。(Ideoneではコマンドラインオプションを指定できません。そのため、最初に設定する行-n0-M5.010無料で取得する行をいくつか追加する必要がありました。)


1
同じ山のスキトルズを数回印刷することが許可されているかどうかはわかりません..(実際にはできないと思います)に切り替えるかもしれませんsay;for$x(g..r){say while s/$x/ /}
ダダ

そうだね。私はもともと持っていなかっfor$x(p,o,g,r)たでしょう。say whileは1バイトだけ長く、代替として考えていたものなので、単純に変更できます。

そして、あなたsay;はルールで言うので開始する必要がありますFirst output shall be the first input
ダダ

ああ、その場合for$x(g,o,p,r)、最初に入力をコピーするバージョンに戻ります。(色が欠落している場合は検索に余分な時間がかかりますが、スキットルのパックに色が欠落するとは思われません。)レコードの場合、say;最初のバージョンは37バイトになります。

ただし、Dadaの元のコメントはまだ有効です。現在のコードは、同じ設定を2回連続で印刷します(たとえば、緑の最後に1回、オレンジの最初に2回)。
DLosc

4

C#、134 148バイト

注文: G -> O -> Y -> P -> R

I=>{var v=new string(I)+";\n";int i,j=0,c;for(;j<4;){c="goyp"[j++];for(i=0;i<I.Length;i++)if(I[i]==c){ I[i]='.';v+=new string(I)+";\n";}}return v;};

文字配列を文字列に変換する必要があるため、@ Pokeの回答からいくつかの類似のものを使用しましたが、現在はもう少し長くなっています;(


ハ!3文字であなたを打ちます!
ムクルクマール

4

Java 7、139 135130151138135バイト

void t(char[]s){int i,j=-1;for(;++j<5;)for(i=-1;++i<109;)if(j>3|s[i]=="yogp!".charAt(j)){System.out.println(s);if(j>3)return;s[i]=32;}}

スキトルズを黄色、オレンジ、緑、紫、赤の順に食べる

これは2つのprint文よりも優れていると思います>。>


1
もちろんできますが、関数の名前はskit:P -3です。
Yodle

1
@Yodleおっと!ハハハ
ポケ

1
私たちは常に10×10グリッドを受信している場合、私はむしろ使用してthatn長さをハードコーディングできs.length
ポケ

1
開始前に一度印刷してから:sを食べる必要はありません
Yodle

1
@Yodleそれが私が「!」を食べている理由です 最初にスキトルズ;)...私はそのトリックを破ったと思う
ポケ

4

C 145-5-18-1 = 121バイト

#define l(a)for(a=0;a<10;a++)
i,j,k,b='a';F(char a[][11]){while(b++<'x')l(i)l(j)if(a[i][j]==b){a[i][j]=32;l(k)puts(a[k]);puts("");}}  

なし+かわいい

#include<stdio.h>
#include<windows.h>
i,j,k;
F(char a[][11])
{
    char b='a';
    while(b++<'x')
        for(i=0;i<10;i++)
            for(j=0;j<10;j++)
                if(a[i][j]==b)
                {
                    system("cls");
                    a[i][j]=32;
                    for(k=0;k<10;k++)
                        puts(a[k]);
                    puts("");
                    Sleep(35);
                }
}
main()
{
    char a[][11]={
            "gggggggggg",
            "goooooooog",
            "goppppppog",
            "goprrrrpog",
            "gopryyrpog",
            "gopryyrpog",
            "goprrrrpog",
            "gopppppppg",
            "goooooooog",
            "gggggggggg"
    };
    for(i=0;a[i][j];)
        puts(a[i++]);
    F(a);
}  

ここでa[][11]は、終了に1文字が必要な長さ11のn文字列を取得することを意味します。技術的には10文字しか表示されません。

order:アルファベット順で、
この関数'g'は指定された入力をチェックして1/1を削除し'g'、次の一致(おそらくletter 'o')が見つかるまで保持している変数を増やし、一致した文字を削除します。
欠点は、この関数があまりにも注意しすぎていることです。したがって、スキッテルがa〜zの26文字でコード名が付けられた異なる色である場合、この関数もその入力を処理します。


多くの3今より:P
Yodle

@Yodle yeah ..で定義できるマクロのおかげです#define。これにより19バイトが削減されました
Mukul Kumar

3

オクターブ、49バイト

スキトルズをアルファベット順に食べ、最も高いアスキーコードを最初に。

A=input("");do [~,p]=max(A(:));A(p)=32 until A<33

3

ES6(Javascript)、 72、71バイト

編集:

  • マイナス1バイト、のテンプレートリテラルを使用し

Javascriptの非再帰バージョン。

ゴルフ

s=>{r=s;for(c of`pogy`)while(s!=(s=s.replace(c,' ')))r+=`
`+s;return r}

入力と出力は複数行の文字列で、「紫色=>オレンジ=>緑色=>黄色」の順番で錠剤を食べます。

テスト

S=s=>{r=s;for(c of`pogy`)while(s!=(s=s.replace(c,' ')))r+=`
`+s;return r}

console.log(
S(` org 
prgrg
gggpr
oyyor
 r p `)
);


2

Python 3-141 99 75バイト

s=input();[exec("print(s);s=s.replace(c,' ',1);"*s.count(c))for c in'orgy']

プログラムはこの順番でスキトルズを食べOrange Red Green Yellow Purpleます- 。

編集 -24バイトの削減に協力してくれたFlp.Tkcに感謝します!

入力- 
ygro goppr rppog rppog orgy

出力- 
ygro goppr rppog rppog orgy
ygr goppr rppog rppogオージー
ygr g ppr rppog rppog orgy
ygr g ppr rpp g rppogオージー
ygr g ppr rpp g rpp g乱交パーティー
ygr g ppr rpp g rpp g rgy
yg g ppr rpp g rpp g rgy
yg g pp rpp g rpp g rgy
yg g pp pp g rpp g rgy
yg g pp pp g pp g rgy
yg g pp pp g pp g gy
yg pp pp g pp g gy
y pp pp g pp g gy
y pp pp pp g gy
y pp pp pp gy
y pp pp pp y
        pp pp pp y
        pp pp pp  

とてもシンプルに見えるので、さらにゴルフができると思います。


2
それは一度に一つだけを食べなければならないのに対し、このようになり、一度に1つの色のすべてを食べている
wnnmaw

1
また、あなたが巣リストとして入力を取ったが、文字列を生産している、入力と出力の両方が同じ形式であるように、あなたのコードを変更してください
wnnmaw

@wnnmaw変更が行われました。今は大丈夫だと思います:)
グルパッドママダプール

1
私は短いソリューションがすでにあります知っているが、あなたはそれが何かにより、このアルゴリズムでゴルフをすることができます滞在し、この
FlipTack 16

3
につながった順序を具体的に選択した方法が気に入っていますorgy
ニックハートリー

2

Vim 57 55バイト

行区切り文字を削除して2バイトを保存します。残念なことに、正確性を確認して確認することは非常に難しくなります:(。

:set ws!
yGP/o
qqnr G9kyGGp@qq@q/y
@q/p
@q/g
@qdG

印刷できないもの:

:set ws!
yGP^O/o
^Oqq^Hnr G9kyGGp@qq@q/y
^O@q/p
^O@q/g
^O@qdG

TryItOnline

oypgの順序で食べ、最後まですべてのrを残します:)


1

Mathematica、67バイト

Most[#/.(i=0;#:>"."/;i++≤0&/@Characters@"ryop")&~FixedPointList~#]&

赤、黄色、オレンジ、紫の順に食べる。


少年は私がいないビルトインこのためがあり嬉しい
wnnmaw

1

Java 7、125バイト

紫、黄、緑、赤、オレンジ。このソリューションで注文を選択できることを楽しんでいます。:D

ゴルフ

String s(String p){String r=p;for(String c:"pygr".split(""))for(;p.contains(c);r+="\n\n"+p)p=p.replaceFirst(c," ");return r;}

非ゴルフ

String s(String p) {
    String r=p;
    for (String c : "pygo".split("")) {
        for (; p.contains(c); r += "\n\n" + p) {
            p = p.replaceFirst(c, " ");
        }
    }
    return r;
}

ここで試してみてください!

@Pokeによる他のJava回答への異なるアプローチ。最初に、元の文字列のコピーを作成します。各色を反復処理し、見つかった場合はスペースで置き換えるたびに、出力文字列に新しいレイアウトを追加し、オレンジ以外をすべて食べた後に戻ります。

ノート

ステップ間の分離は二重の改行\n\nで行われますが、入力グリッドの末尾に改行がある場合は、ちょうどに短絡できます\n


1

Haskell、60バイト

f x|(a,b:c)<-span(<maximum x)x,b>'g'=(:)<*>f$a++' ':c|1<2=[]

入力は、行がで区切られた単一の文字列,です。戻り値は、すべての中間ステップを含む文字列のリストです。順序はアルファベット順で、最初に大きいため、緑色のままです。使用例:

*Main> mapM_ putStrLn $ f " org ,prgrg,gggpr,oyyor, r p "
 org ,prgrg,gggpr,o yor, r p 
 org ,prgrg,gggpr,o  or, r p 
 o g ,prgrg,gggpr,o  or, r p 
 o g ,p grg,gggpr,o  or, r p 
 o g ,p g g,gggpr,o  or, r p 
 o g ,p g g,gggp ,o  or, r p 
 o g ,p g g,gggp ,o  o , r p 
 o g ,p g g,gggp ,o  o ,   p 
 o g ,  g g,gggp ,o  o ,   p 
 o g ,  g g,ggg  ,o  o ,   p 
 o g ,  g g,ggg  ,o  o ,     
   g ,  g g,ggg  ,o  o ,     
   g ,  g g,ggg  ,   o ,     
   g ,  g g,ggg  ,     ,     

単純な再帰。戻り値の入力リストを保存し、大きい方の最大要素gをスペースに置き換えて、関数を再度呼び出します。基本ケースは、削除する要素が残っていない場合です。


1

MATL、24バイト

`tDX:t2#X>wx32w(10etun2>

オンラインでお試しください!私はスキトルズをアルファベットの逆順で食べることを好みます。緑は私の好きな色です。説明:

                           % Take input implicitly.
`                          % Start do ... while loop
 tD                        % Duplicate skittle pile (nom!), but give away for display
   X:                      % Put skittles in long row (like normal people do)
     t2#X>                 % Get least favourite skittle name and number in the row
          wx               % Discard the skittle name
            32w            % Put an eaten skittle on the stack (ASCII 32)
               (           % Put the eaten skittle back in the row of skittles.
                10e        % Shape the row back into a 10x10 array
                   tun     % Check the number of unique skittles
                      2>   % Loop while this number >2 (eaten skittles + favourite skittles)
                           % Implicit end of do... while loop. 
                           % Display last iteration implicitly, since it's still on the stack.

0

QBasic、125バイト

クリエイティブルールの乱用!

DATA 71,89,82,79
?INPUT$(109)
DO
READ s
FOR r=1TO 10
FOR c=1TO 10
IF s=SCREEN(r,c)THEN SLEEP 1:LOCATE r,c:?" "
NEXT
NEXT
LOOP

この投稿では、多くのことが問題ないことを前提としています。

  • 入力と出力は大文字(GORPY
  • 入力は、109回連続してキーが押されたと見なされ、最後のキーが入力されるまで画面にエコーされません。最後の行を除く各行の最後で、ユーザーは改行を入力する必要があります。
  • Skittlesのパイルを複数回印刷する代わりに、プログラムは各ステップの前に1秒の休止で画面にそれを表示します。(QBasicには出力スクロールバックがないため、パイルを複数回印刷しても最後の2 1/2ステップしか得られません。また、この方法は、食べるとスキトルの山がどのように進化するかをより良く描写します。)
  • プログラムはエラーで終了します。

また、小文字を使用してエラーが発生しない130バイトバージョンもあります。

以下は、5x5グリッド用に変更されたQB64でのサンプル実行です。10929

スキットルズを食べる

説明

DATA 71,89,82,79店舗ASCIIコードのGYR、とO

?INPUT$(109) ユーザーから109回キーを押して印刷します。

次に、無限のDO ... LOOP構造を入力します。毎回READ、現在のSkittleのASCIIコードをに入れsます。次に、行と列を1から10までループします。SCREEN(r,c)画面上の行r、列の文字のASCIIコードを取得しますc。これは現在のスキットルに等しい場合s、我々SLEEP1秒間、その後にスペースを印刷しrc

メインループは4回実行され、緑、黄色、赤、およびオレンジのスキトルズが削除されます。5回目の反復でREADは、データが不足しているためエラーが発生します。

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