表情符号自动贩卖机


23

看不到表情符号?请点击这里

您将模拟自动售货机。这些项目是56种不同的表情符号,可以表示为两个替代UTF-8字符,从🍅(U + D83C U + DF45)到🍼(U + D83C U + DF7C)。在HTML中,这些表情符号可以UTF-16形式表示为&#x1F345&#x1F37C。在基数10中,第一个UTF-8字符的值为55356。第二个字符的值的范围是5715757212是一个生成所有相关表情符号的CJam程序。为避免混淆,此挑战将以字符而不是字节来评分。有些表情符号是2个字符,有些是3个字符。http://www.lettercount.com将为您提供准确的计数以应对这一挑战。

定价💵💵💵

有8种不同的价格类别:

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

显示自动售货机

这是程序启动时和购买后用户所看到的。您可以使用常规数字代替表情符号数字,但是表情符号数字的优点是与其他表情符号的宽度相同。如果您使用表情符号数字,则可以从乐谱中减去14个字符,因为表情符号数字各为3个字符。

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

如果用户输入G5,则选择🍳。输入E6选择🍦。

加现金💸💸💸

要加钱,用户应输入/,然后输入硬币或钞票的代码。硬币为(N)镍($ 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]。每次只能添加一张钞票或硬币。以下是包含三行输入的示例:

/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)Base 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

无效的代码

  • 如果输入以/但不是有效的货币输入开头,则输出 Money not Accepted
  • 如果输入的是已经购买的商品,则输出 Item out of stock
  • 如果输入是不在范围内的数字字母组合(例如A0J2,则输出“无效代码”
  • 对于所有其他无效输入,输出“错误”

奖励(-15%):卡纸

出售物品时,机器有10%的机会被卡住,物品被卡住。输出JAM!!!一次。在这种情况下,用户必须输入“打孔”或“踢”。每次用户这样做时,商品就有20%的机会会挣脱并正常出售。在清除卡纸之前,唯一识别的输入是“打孔”和“踢”。所有其他输入均不执行任何操作。这是一个示例:

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

(卡纸已清除。恢复正常。)

红利(-10%):ID

如果用户试图购买含酒精的饮料(除了奶瓶,最后一行上的任何物品),您都必须提供年龄证明。为此,您要求用户将13和19(含)之间的两个随机数相乘。输出ID required: [13-19]x[13-19] = ?。如果用户回答正确,则购买可以通过。如果不是,请打印🔞(U + D83D U + DD1E)以10为基数:(55357 56606)

替代挑战:《我的世界》

在Minecraft中,这一挑战似乎是可能的。要成功创建此程序的Minecraft版本,播放器必须

  • 拥有8x7网格,可从56个独特物品中进行选择
  • 能够向余额中添加资金(也许对上述不同面额使用不同类型的宝石。)
  • 如果用户投入了足够的“钱”,则给用户他/她选择的项目
  • 最后向用户返回适当的更改量。

兼容模式

  • 我只能在程序开始时输入

    • 不用担心,您可以制作一个程序,将所有输入都放在前面。如果您的程序在评估所有输入后仍未终止,则假定在最后调用了“完成”。如果您采用这种方法,您将没有资格获得任何奖金。
  • 我无法查看/输出表情符号

    • 您可以将输入和输出复制并粘贴到此Stack Snippet中(或在此处)。它既可以理解unicode表情符号,也可以理解表情符号的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>

这是自动售货机显示屏的兼容模式的缩写版本,您可以在Stack Snippet中进行测试:

   &#x31&#x20E3&#x32&#x20E3&#x33&#x20E3&#x34&#x20E3&#x35&#x20E3...
A&#x1F345&#x1F346&#x1F347&#x1F348&#x1F349...
B 
...
  • 我可以输出表情符号,但不能输出到STDOUT。

    • 貌似,Mac OS X Terminal是已知的唯一能够输出表情符号的终端。如果您无法在终端中输出表情符号,则其他选择是
      • 将所有输出发送到文件。
      • 在窗口中显示所有输出。
      • 使用“我无法查看/输出表情符号”中描述的技术。

5
$ can be replaced with your local currency如果您然后要求硬币为(N)根(D)imes和(Q)uarters,则没有任何意义。我建议您删除它,因为它会增加混乱。
水平河圣

@steveverrill好点。我已经改变了。我的问题是,非美国键盘上有$按钮,还是有代码?
geokavel 2015年

$符号是ASCII字符集的一部分,因此可以安全地假设几乎所有键盘和语言都可以使用它。它是7位ASCII字符集中的唯一货币符号。结果,由于不兼容的字符串编码,其他符号(例如GBP符号或EUR符号€)可能会错误地呈现,但实际上不会发生$
级圣河

@steveverrill我知道他们可以处理,但是有物理键盘按钮吗?
geokavel 2015年

除了相关的本地货币符号外,我的英式和西班牙文键盘也有它,我认为其他键盘也有。除了是世界上使用最广泛的货币符号(包括许多不称为美元的货币)之外,该$符号在大多数编程语言中都有特殊含义,因此,键盘上无法使用该符号将是一个严重的限制。我在西班牙语键盘上输入该字符,实际上获得$(shift + 4)比获得€(alt gr + E)更容易,因此您可以看到后面的符号被添加了。
级圣河

Answers:


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并显示购买的物品《太空侵略者》 👾。每次命令后,机器都会重新绘制。

松散(不知何故)

$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;

OS在OS X上使用PHP 5.5和5.6进行了测试👾


编辑

  • 增加了 12个字节。固定了出口Done并打了一些弦。
  • 增加了 306个字节。修复了一个或两个错误,并增加了对奖金的支持。有了奖金,现在缩短了将近15个字节
  • 增加了 66个字节。必须采用不同的格式,也必须接受的更多值([A-Z][0-9]Invalid code
  • 保存了 10个字节。找到一个空白并将其.=转换=为适用的。
  • 由于进行了一些重构,节省了36个字节
  • 通过重构一些循环和分配节省20个字节

哇,玩起来真有趣!我注意到的唯一问题:您需要将3和3.5之类的价格格式化为$ 3.00和$ 3.50。
geokavel 2015年

另外,当我键入内容时,J5我会收到消息:“无效代码”。
geokavel 2015年

@geokavel感谢您的反馈。我添加了正确的货币格式,并且目前还接受更多变体Invalid code。这是一个有趣的挑战-尽管它有很多选择……1K个字符可以说明一切……:)
insertusernamehere

恭喜,您是赢家!感谢两位选手成为有价值的竞争对手,并竭尽全力超越对方!
geokavel 2015年

@geokavel我和斯蒂芬之间的挑战很有趣,乒乓球很好。如果将来有人提出一个更短的解决方案,我会在那里。;)
insertusername此处,2015年

5

C#6(.Net框架4.6),1356 1324 1304 1311 1307 1238 1235 1231 1220字母- 14个字母(表情符号数字) - (15%果酱加成+ 10%ID加成)= 1017 993 978 972.75 969.75 918 915.75 904.5信

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。

编辑:从十进制切换为双精度,删除了20个字母。

编辑:切换到表情符号数字,删除了7个字母

编辑:通过将所有内容都切换为double而不是double和ints的混合,删除了4个字母。

编辑:删除69个字母-找到无效的代码o_O最佳输入C#:D

编辑:删除了3个字母-切换了最后一个if-else语句

编辑:删除了4个字母-从短路操作符(&&和||)切换为常规&和|

编辑:删除11个字母-使用条件逐字字符串从h.WriteLine切换到w()。


看起来不错。我能够在这里使用静态输入进行测试。有没有一种方法可以在线或在Mac上使用动态输入对其进行测试?
geokavel 2015年

尽管表情符号显示为,但您可以在此处使用动态输入进行测试??
geokavel

我发现的唯一问题是,“无效代码”仅应针对不在范围内的数字-数字组合显示。所有未指定的错误应输出“错误”。
geokavel

在我的路上@insertusernamehere:D
Stephan Schinkel

嘿....我把它讲到了php :) @insertusernamehere
Stephan Schinkel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.