絵文字自動販売機


23

絵文字が表示されませんか?こちらをクリックしてください

自動販売機をシミュレートします。アイテムは56種類の絵文字で、:( U + D83C U + DF45)から🍼(U + D83C U + DF7C)までの2つの代理UTF-8文字として表すことができます。HTMLでは、これらの絵文字は&#x1F345から&#x1F37CとしてUTF-16形式で表すことができます。ベース10では、最初のUTF-8文字の値は55356です。二番目の文字の値は、より範囲の5715757212これは、関連するすべての絵文字を生成するCJamプログラムです。混乱を避けるため、このチャレンジはbytesではなく文字でスコアリングされます。一部の絵文字は2文字で、一部は3文字です。http://www.lettercount.comは、このチャレンジの正確なカウントを提供します。

価格設定💵💵💵

8つの異なる価格カテゴリがあります。

  • $ 1.00:🍅🍆🍇🍈🍉🍊🍋
  • $ 1.50:🍌🍍🍎🍏🍐🍑🍒
  • $ 2.00:🍓🍔🍕🍖🍗🍘🍙
  • $ 2.50:🍚🍛🍜🍝🍞🍟🍠
  • 3.00ドル:🍡🍢🍣🍤🍥🍦🍧
  • $ 3.50:🍨🍩🍪🍫🍬🍭🍮
  • $ 4.00:🍯🍰🍱🍲🍳🍴🍵
  • 4.50ドル:🍶🍷🍸🍹🍺🍻🍼

自動販売機の展示

これは、プログラムの開始時および購入後にユーザーに表示されるものです。絵文字番号の代わりに通常の番号を使用できますが、絵文字番号には他の絵文字と同じ幅であるという利点があります。絵文字番号を使用する場合、絵文字番号はそれぞれ3文字であるため、スコアから14文字を差し引くことができます。

  1️⃣2️⃣3️⃣4️⃣5️⃣6️⃣7️⃣
A 🍅🍆🍇🍈🍉🍊🍋
B 🍌🍍🍎🍏🍐🍑🍒
C 🍓🍔🍕🍖🍗🍘🍙
D 🍚🍛🍜🍝🍞🍟🍠
E 🍡🍢🍣🍤🍥🍦🍧
F 🍨🍩🍪🍫🍬🍭🍮
G 🍯🍰🍱🍲🍳🍴🍵
H 🍶🍷🍸🍹🍺🍻🍼 

ユーザーが入力するG5と、thatが選択されます。入力するとE6🍦が選択されます。

現金の追加💸💸💸

お金を追加するには、ユーザーが入力して/から、コインまたは請求書のコードを入力する必要があります。コインは(N)ickel($ 0.05)、(D)ime($ 0.10)、および(Q)uarter($ 0.25)です。請求書は(O)ne($ 1.00)、(F)ive($ 5.00)、(T)en($ 10.00)です。ユーザーが請求書またはコインを追加するたびに、プログラムはを出力する必要がありますBalance: [New Balance]。毎回追加できるのは1つの紙幣またはコインのみです。以下に、3行の入力を含む例を示します。

/D
Balance: $0.10
/Q
Balance: $0.35
/F
Balance: $5.35

アイテムを選択する

ユーザーは、B2またはなどのアイテムコードを入力してアイテムを選択しますC3。ユーザーがお金を追加していない場合、プログラムはを出力する必要がありますItem Cost: [Cost of Item]。ユーザーがお金を追加したが、アイテムを購入するのに十分でない場合、出力はになりますInsufficient Funds. Item Cost: [Cost of Item]。ユーザーが十分な金額を追加した場合、プログラムは次を出力する必要がありますItem at [Item Location] Purchased. Remaining Balance: [Balance - Cost of Item]。次に、独自の行で、購入したアイテムの絵文字を印刷します。次に、購入したアイテムを🚫(U + D83D U + DEAB)ベース10:(55357 57003)に置き換えて、自動販売機全体を印刷します(「自動販売機の表示」を参照)。

プログラムの終了

ユーザーがアイテムを購入して残高を0.00ドルにした場合、プログラムは自動的に終了します。あるいは、ユーザーがいつでも「完了」を入力した場合、プログラムはユーザーに変更の残りの残高を提供する必要があります。変更は、ニッケル、ダイム、クォーターのみで行われ、可能な限り最小のコインでなければなりません。たとえば、残りの残高が$ 1.45の場合、出力はになるはずですQQQQQDD

サンプル実行

(入力は「-」で始まります)

  1️⃣2️⃣3️⃣4️⃣5️⃣6️⃣7️⃣
A 🍅🍆🍇🍈🍉🍊🍋
B 🍌🍍🍎🍏🍐🍑🍒
C 🍓🍔🍕🍖🍗🍘🍙
D 🍚🍛🍜🍝🍞🍟🍠
E 🍡🍢🍣🍤🍥🍦🍧
F 🍨🍩🍪🍫🍬🍭🍮
G 🍯🍰🍱🍲🍳🍴🍵
H 🍶🍷🍸🍹🍺🍻🍼  
-E1
Item Cost: $3.00
-/F
Balance: $5.00
-E1
Item at E1 Purchased. Remaining Balance: $2.00
🍡 
  1️⃣2️⃣3️⃣4️⃣5️⃣6️⃣7️⃣
A 🍅🍆🍇🍈🍉🍊🍋
B 🍌🍍🍎🍏🍐🍑🍒
C 🍓🍔🍕🍖🍗🍘🍙
D 🍚🍛🍜🍝🍞🍟🍠
E 🚫🍢🍣🍤🍥🍦🍧
F 🍨🍩🍪🍫🍬🍭🍮
G 🍯🍰🍱🍲🍳🍴🍵
H 🍶🍷🍸🍹🍺🍻🍼
-Done
QQQQQQQQ

無効なコード

  • 入力がで始まる/が、有効なマネー入力ではない場合、output Money not Accepted
  • 入力が既に購入済みのアイテムである場合、出力 Item out of stock
  • 入力が範囲外の数字と文字の組み合わせである場合(A0またはなどJ2、出力「無効なコード」
  • 他のすべての無効な入力については、「エラー」を出力します

ボーナス(-15%):ジャム

アイテムを販売するとき、機械が詰まる可能性が10%あり、アイテムがスタックします。JAM!!!1回出力します。この場合、ユーザーは「パンチ」または「キック」を入力する必要があります。ユーザーがそうするたびに、アイテムが自由に壊れ、通常どおり販売される可能性が20%あります。紙詰まりが解消するまで、認識される入力は「パンチ」と「キック」のみです。他のすべての入力は何もしません。サンプルを次に示します。

-A4
Item at A4 purchased. Remaining Balance: $1.00
JAM!!!
-punch
-kick
-kick
-punch
-punch
🍚

(紙詰まりは解消されました。通常どおり再開してください。)

ボーナス(-10%):ID

ユーザーがアルコール飲料(哺乳瓶以外の最後の行のアイテム)を購入しようとする場合、年齢の証明を要求する必要があります。これを行うには、ユーザーに13から19(両端を含む)の2つの乱数を乗算するように依頼します。出力ID required: [13-19]x[13-19] = ?。ユーザーが正解すると、購入は完了します。そうでない場合は、base(U + D83D U + DD1E)base 10:(55357 56606)を印刷します

代替チャレンジ:Minecraft

この課題は、Minecraftで可能なことのように思えます。このプログラムのMinecraftバージョンを正常に作成するには、プレーヤーは

  • 56個の一意のアイテムから選択するための8x7グリッド
  • 残高にお金を追加することができます(上記のさまざまな額面にさまざまな種類の石を使用している可能性があります)。
  • ユーザーが十分な「お金」を入れた場合に選択したアイテムをユーザーに提供します
  • 最後に適切な量の変更をユーザーに返します。

互換モード

  • プログラムの開始時にのみ入力を取得できます

    • 心配しないで、すべての入力を事前に受け取るプログラムを作成できます。すべての入力を評価した後、プログラムが終了していない場合は、最後に「完了」が呼び出されたと想定します。この方法を実行すると、ボーナスの対象になりません。
  • 絵文字を表示/出力できません

    • 入力と出力をこのスタックスニペット(またはここ)にコピーして貼り付けることができます。ユニコード絵文字と絵文字用のHTMLコードの両方を理解できます。このページで出力が正しいように見える場合、プログラムは合格です。サンプルの入出力の一部を貼り付けて、どのように見えるかを確認してください。

function parse() {
var o = document.getElementById("output");
var text = document.getElementById("in").value;
o.innerHTML = text.replace(/\n/g,"<br/>").replace(/ /g,"&nbsp");
twemoji.parse(o);
}
<head>
<script src="//twemoji.maxcdn.com/twemoji.min.js"></script>  
</head>
<body>
<h1>Emoji to Image</h1>
<textarea id="in" rows="10" cols="50"></textarea>
<input type="submit" onclick="parse()">
<div id="output"></div>
</body>

以下は、スタックスニペットでテストできる自動販売機ディスプレイの互換モードの短縮バージョンです。

   &#x31&#x20E3&#x32&#x20E3&#x33&#x20E3&#x34&#x20E3&#x35&#x20E3...
A&#x1F345&#x1F346&#x1F347&#x1F348&#x1F349...
B 
...
  • 絵文字は出力できますが、STDOUTには出力できません。

    • 一見、Mac OS Xターミナルは絵文字を出力できることが知られている唯一のターミナルです。端末で絵文字を出力できない場合、他のオプションは
      • すべての出力をファイルに送信します。
      • すべての出力をウィンドウに表示します。
      • 「絵文字を表示/出力できない」で説明されている手法を使用します。

5
$ can be replaced with your local currencyコインを(N)ickels(D)imesと(Q)uartersにする必要がある場合はあまり意味がありません。混乱を招くため、削除することをお勧めします。
レベルリバーセント

@steveverrill良い点。変更しました。私の質問は、米国以外のキーボードには$ボタンがありますか、それともコードはありますか?
geokavel

$シンボルは、それはほとんどすべてのキーボードと言語がそれを扱うことができると仮定しても安全です、ASCII文字セットの一部です。これは、7ビットASCII文字セットで唯一の通貨記号です。その結果、GBPシンボルやEURシンボル€などの他のシンボルは、互換性のない文字列エンコードのために誤ってレンダリングされる可能性がありますが、実際には起こりません$
レベルリバーセント

@steveverrill私は彼らがそれを処理できることを知っていますが、物理的なキーボードボタンはありますか?
geokavel

私の英国およびスペイン語のキーボードには、関連する現地通貨記号に加えてそれがあり、他のキーボードにもあります。(ドルと呼ばれない多くの通貨を含む)世界で最も広く使用されている通貨記号であることに加えて、この$記号はほとんどのプログラミング言語で特別な意味を持つため、キーボードで使用できないことは深刻な制限になります。スペイン語のキーボードでこれを入力しているので、実際には€(alt gr + E)より$(shift + 4)を取得する方が簡単なので、後者の記号が後付けとして追加されていることがわかります。
レベルリバーセント

回答:


8

PHP、(1295-14)-25%= 960.75文字

古いスコア1315 1351 1361 1295 989 977

それは楽しかったし、それが最初の答えだ。

$i=[A=>[🍅,🍆,🍇,🍈,🍉,🍊,🍋],B=>[🍌,🍍,🍎,🍏,🍐,🍑,🍒],C=>[🍓,🍔,🍕,🍖,🍗,🍘,🍙],D=>[🍚,🍛,🍜,🍝,🍞,🍟,🍠],E=>[🍡,🍢,🍣,🍤,🍥,🍦,🍧],F=>[🍨,🍩,🍪,🍫,🍬,🍭,🍮],G=>[🍯,🍰,🍱,🍲,🍳,🍴,🍵],H=>[🍶,🍷,🍸,🍹,🍺,🍻,🍼]];$p=[A=>1,B=>1.5,C=>2,D=>2.5,E=>3,F=>3.5,G=>4,H=>4.5];$v=[N=>.05,D=>0.1,Q=>.25,O=>1,F=>5,T=>10];a:$m='';$w=$x=0;$q=$c[0];$r=$c[1];$f=fgets;$n=rand;$u=number_format;if('Done'==$c&&$e=1)foreach([Q,D,N]as$_)while($b&&round($b-$v[$_],2)>=0&&$m.=$_)$b-=$v[$_];elseif('/'==$q){$v[$r]?$b+=$v[$r]:$m="Money not accepted
";$m.="Balance: $".$u($b,2);}elseif(in_array($q,range(A,Z))){if(0<$r&&8>$r--&&($_=$p[$q])){$b&&$b<$_?$m="Insufficient funds. ":0;if($b<$_)$m.="Item cost: $".$u($_,2);elseif(👾==$i[$q][$r])$m="Item out of stock.";else{$t=0;if(H==$q&&$r<6){$t=$n(13,19);$s=$n(13,19);echo"ID required: {$t}x$s = ?
";if($f(STDIN)!=$t*$s)$m=🔞;else$t=0;}if(!$t){$b-=$_;if(1>$n(0,9)){$w=1;}$x=$i[$q][$r];$m="Item at $c purchased. Remaining balance: $".$u($b,2).($w?"":"
$x");$i[$q][$r]=👾;if(!$b)$e=1;}}}else$m="Invalid code";}if($c&&!$m&&!$e)$m=Error;system(clear);echo"  1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣";foreach($i as$k=>$_){echo"
$k ";foreach($_ as$_)echo"$_ ";}echo"
$m
";if($w){echo"JAM!!!
";for(;$c!=kick&&$c!=punch||7>$n(0,9);$c=trim($f(STDIN)));echo"$x
";}$e?exit:$c=trim($f(STDIN));goto a;

自動販売機が使用した90年代を思い出させ、goto購入したアイテムにはSpace Invader 👾が表示されます。マシンは、コマンドごとに再描画されます。

未ゴルフ(なんとか)

$i=[A=>[🍅,🍆,🍇,🍈,🍉,🍊,🍋],B=>[🍌,🍍,🍎,🍏,🍐,🍑,🍒],C=>[🍓,🍔,🍕,🍖,🍗,🍘,🍙],D=>[🍚,🍛,🍜,🍝,🍞,🍟,🍠],E=>[🍡,🍢,🍣,🍤,🍥,🍦,🍧],F=>[🍨,🍩,🍪,🍫,🍬,🍭,🍮],G=>[🍯,🍰,🍱,🍲,🍳,🍴,🍵],H=>[🍶,🍷,🍸,🍹,🍺,🍻,🍼]];
$p=[A=>1,B=>1.5,C=>2,D=>2.5,E=>3,F=>3.5,G=>4,H=>4.5];
$v=[N=>.05,D=>0.1,Q=>.25,O=>1,F=>5,T=>10];

a:
$m='';
$w=$x=0;
$q=$c[0];
$r=$c[1];
$f=fgets;
$n=rand;
$u=number_format;

if('Done'==$c&&$e=1)
    foreach([Q,D,N]as$_)
        while($b&&round($b-$v[$_],2)>=0&&$m.=$_)
            $b-=$v[$_];
elseif('/'==$q){
    $v[$r]?$b+=$v[$r]:$m="Money not accepted
";
    $m.="Balance: $".$u($b,2);
}elseif(in_array($q,range(A,Z))){
    if(0<$r&&8>$r--&&($_=$p[$q])){
        $b&&$b<$_?$m="Insufficient funds. ":0;
        if($b<$_)$m.="Item cost: $".$u($_,2);
            elseif(👾==$i[$q][$r])
                $m="Item out of stock.";
            else{
                $t=0;
                if(H==$q&&$r<6){
                    $t=$n(13,19);
                    $s=$n(13,19);
                    echo"ID required: {$t}x$s = ?
";
                    if($f(STDIN)!=$t*$s)
                        $m=🔞;
                    else
                        $t=0;
                }
                if(!$t){
                    $b-=$_;
                    if(1>$n(0,9)){
                        $w=1;
                    }
                    $x=$i[$q][$r];
                    $m="Item at $c purchased. Remaining balance: $".$u($b,2).($w?"":"
$x");
                    $i[$q][$r]=👾;
                    if(!$b)$e=1;
                }
            }
    }else
        $m="Invalid code";
}

if($c&&!$m&&!$e)$m=Error;

system(clear);
echo"  1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣";
foreach($i as$k=>$_){
    echo"
$k ";
    foreach($_ as$_)
        echo"$_ ";
}
echo"
$m
";

if($w){
    echo"JAM!!!
";
    for(;$c!=kick&&$c!=punch||7>$n(0,9);$c=trim($f(STDIN)));
    echo"$x
";
}

$e?exit:$c=trim($f(STDIN));
goto a;

PHP OS X上でPHP 5.5および5.6でテスト済み👾


編集

  • 12バイトを追加しました。出口の修正Doneといくつかの弦のゴルフ。
  • 306バイトを追加しました。1つまたは2つのバグを修正し、ボーナスのサポートを追加しました。ボーナスにより、15バイト近く短くなりました。
  • 66バイトを追加しました。お金のフォーマットを変更する必要があり、さらにの値([A-Z][0-9])を受け入れる必要がありましたInvalid code
  • 10バイトを保存しました。一部になっ空白と見つかったもの.=には=適用できませんでした。
  • リファクタリングにより36バイト節約されました。
  • いくつかのループと割り当てをリファクタリングして20バイトを節約しました。

うわー、それは遊ぶのがとても楽しかったです!私が気づいた唯一の問題:3と3.5のような価格を3.00ドルと3.50ドルにフォーマットする必要があります。
geokavel

また、入力するJ5と、「無効なコード」というメッセージが表示されます。
geokavel

@geokavelご意見ありがとうございます。正しい通貨形式を追加しましたが、Invalid code現在のところ、より多くのバリエーションを受け入れています。それは楽しい挑戦です-多くのオプションがありますが…1Kのキャラクターはそれを代弁します…:)
insertusernamehere

おめでとう、わずかな差で、あな​​たが勝者です!ふさわしい競争相手であり、お互いに熱心に挑戦しようとしている両方のプレイヤーに感謝します!
geokavel

@geokavelステファンと私との間の楽しいチャレンジであり、卓球だった。将来誰かがより短い解決策を思い付くなら、私はそこにいるでしょう。;)
ユーザー名をここに挿入し

5

C#6(.Net Framework 4.6)、1356 1324 1304 1311 1307 1238 1235 1231 1220 Letters-14 Letters(Emoji Numbers)-(15%Jam Bonus + 10%ID Bonus)= 1017 993 978 972.75 969.75 918 915.75 904.5 Letters

using h=System.Console;class c{static void Main(){double b=0,z,p,x=0,i=57157,j,n,r,c,m;var a=1==0;var d=new System.Collections.Hashtable();for(;i<57213;)d.Add(x++,""+(char)55356+(char)i++);for(var e=new System.Random();;){for(w("  1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣"),x=0;x<8;x++,w(""))for(h.Write((char)('A'+x)),i=0;i<7;)h.Write(" "+d[x*7+i++]);for(;;){var k=h.ReadLine();if(k[0]==47){var l=k[1];z=b;b+=l=='N'?.05:l=='D'?.1:l=='Q'?.25:l=='O'?1:l=='F'?5:l=='T'?10:0;a=a|z!=b;w(z!=b?$"Balance {b:0.00}":"Money not Accepted");}else{if(k=="Done"){for(;b/.25>=1;b-=.25)h.Write("Q");for(;b/.1>=1;b-=.1)h.Write("D");for(;b/.05>=1;b-=.05)h.Write("N");return;}r=k[0]-65;c=k[1]-49;if(r<0|r>7|c<0|c>6)w("Invalid code");else{p=1+r/2;if(!a|p>b)w($"{(a&p>b?"Insufficient Funds. ":"")}Item Cost: ${p:0.00}");else{m=r*7+c;if(d[m]=="🚫")w("Item out of stock");else{if(r>6&c<6){j=e.Next(13,20);n=e.Next(13,20);w($"ID required: {j}x{n} = ?");if(int.Parse(h.ReadLine())!=j*n){w("🔞");break;}}b-=p;w($"Item at {k} Purchased. Remaining Balance: ${b:0.00}");if(e.Next(10)==1)for(w("Jam!!!");;){var f=h.ReadLine();if((f=="punch"|f=="kick")&e.Next(10)<2)break;}w(""+d[m]);d[m]="🚫";if(b==0)return;break;}}}}}}}static void w(string s)=>h.WriteLine(s);}

LinqPad 5(C#6)で使用するために、もう少しゴルフをしていません。F4でh = System.Consoleを使用します。

void Main()
{
    double b=0,z,p,x=0,i=57157,j,n,r,c,m;
    var a = 1==0;
    var d = new Hashtable();
    for (; i < 57213;) d.Add(x++, ""+(char)55356 + (char)i++);
    for (var e = new Random(); ;)
    {
        for (w("  1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣"), x = 0; x < 8; x++, w(""))
            for (h.Write((char)('A' + x)), i = 0; i < 7;)
                h.Write(" " + d[x * 7 + i++]);

        for (; ;)
        {
            var k = h.ReadLine();
            if (k[0] == 47)
            {
                var l = k[1];
                z = b;
                b += l == 'N' ? .05 : l == 'D' ? .1 : l == 'Q' ? .25 : l == 'O' ? 1 : l == 'F' ? 5 : l == 'T' ? 10 : 0;
                a = a|z!=b;
                w(z != b ? $"Balance {b:0.00}" : "Money not Accepted");
            }
            else
            {
                if (k == "Done")
                {
                    for (; b / .25 >= 1; b -= .25) h.Write("Q");
                    for (; b / .1 >= 1; b -= .1) h.Write("D");
                    for (; b / .05 >= 1; b -= .05) h.Write("N");
                    return;
                }
                r = k[0] - 65;
                c = k[1] - 49;
                if(r<0|r>7|c<0|c>6)w("Invalid code");
                else
                {
                    p = 1 + r / 2;
                    if (!a | p > b) w($"{(a&p>b?"Insufficient Funds. ":"")}Item Cost: ${p:0.00}");
                    else
                    {
                        m = r * 7 + c;
                        if (d[m] == "🚫")
                            w("Item out of stock");
                        else
                        {
                            if (r > 6 & c < 6)
                            {
                                j = e.Next(13, 20);
                                n = e.Next(13, 20);
                                w($"ID required: {j}x{n} = ?");
                                if (int.Parse(h.ReadLine()) != j * n)
                                {
                                    w("🔞");
                                    break;
                                }
                            }

                            b -= p;
                            w($"Item at {k} Purchased. Remaining Balance: ${b:0.00}");
                            if (e.Next(10) == 1)
                                for (w("Jam!!!"); ;)
                                {
                                    var f = h.ReadLine();
                                    if ((f == "punch" | f == "kick") & e.Next(10) < 2)
                                        break;
                                }
                            w(""+d[m]);
                            d[m] = "🚫";
                            if (b == 0) return;
                            break;
                        }
                    }
                }
            }
        }
    }
}

void w(string s)=>h.WriteLine(s);

編集:for(;;)ヒントをありがとう;)

編集:ストライク!! PHPよりも良い;-)

編集:24文字を削除しました。まだphpに何かが残っています。

編集:10進数から2倍に切り替えることで20文字を削除しました。

編集:絵文字番号に切り替えて7文字を削除

編集:ダブルとイントの混合の代わりにすべてをダブルに切り替えることにより、4文字を削除しました。

編集:69文字を削除-デッドコードo_OベストエントリC#を発見:D

編集:3文字を削除-最後のif-elseステートメントを切り替えました

編集:4文字を削除-短絡演算子(&&および||)から通常の&および|に切り替え

編集:11文字を削除-条件付きの逐語的文字列でh.WriteLineからw()に切り替えました。


いいね。ここで静的入力を使用してテストできました。オンラインで、または動的入力を使用してMacでテストする方法はありますか?
geokavel

ここで動的入力を使用してテストできますが、絵文字はとして表示され??ます。
geokavel

私が見つけた唯一の問題は、「無効なコード」は範囲外の数字と数字のコンボに対してのみ表示されるということです。不特定のエラーはすべて「エラー」を出力するはずです。
geokavel

途中で@insertusernamehere:D
ステファンシンケル

ちょっと....私は、PHPの下にそれを持っている:) @insertusernamehereを
シュテファン・シンケル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.