撤消炸弹!


214

您已被聘用为您的技术知识,是特工的助手,以确保好人能完成工作并拯救世界。

这是您退休前的最后一项任务,以高薪和全世界的感激之情退休。但是在您必须解除Evil Genius的Big Overly Massive BOMB的武装之前(似乎邪恶的Genius是精明的驴子,喜欢递归首字母缩写词)。无论如何,您和您的好友都在Evil Genius秘密基地的核心地带,随时准备解除可能摧毁整个大陆的BOMB的武装。在上一个任务中,您设法获得了使您感到惊讶的只是“ PASSWORD_01”的撤防代码。您将键盘连接到BOMB,但是当您准备出发时,Evil Genius的帮派们就以一连串子弹进入。不幸的是,这些项目符号之一会影响您的键盘。“完成工作,而我分散了这些麻烦!” 说你的伙伴,然后开始开枪。

眼镜

  1. 编写一个程序,以所需的任何方式输出字符串PASSWORD_01(大写)。
  2. 由于键盘已被子弹击中,因此只能使用以下键:

    1 2 3 4 5

    Q W E R T

    A S D F G

    < > Z X C

    Ctrl Shift Tab Space

    使用Shift键,您的键盘允许您使用以下字符:

    ! " · $ %

  3. 除了键盘和屏幕(例如鼠标)之外,您没有任何其他硬件,也没有在计算机中写入密码的文件。

  4. 您没有互联网连接。

  5. 您可以假设在项目符号进入之前打开了解释程序外壳程序/源代码编辑器。可悲的是,您在敲击键盘之前还没有在其中编写任何内容。

  6. 您没有虚拟键盘。实际上,BOMB有一个TOO_FUNNY检测器,如果您尝试使用标准漏洞,它会爆炸。

  7. 由于您的伙伴正在等待您尽快完成逃离Secret Base的任务,因此您将必须编写最小的代码(因此,它是!)。

祝您好运,因为倒计时已经开始!

帮助模式:一个KEY奇迹(您只想从键盘上获得一个键,但没有Shift +键或任何其他组合)也奇迹般地幸存了下来。例如:您可以使用=0/…这个额外的键不能是其中的任何字母PASSWORD_01(因此您不能添加PO)。在答案中命名该键。无论使用多少次密钥您都将受到10个字符的惩罚


67
我可以将键盘的布局更改为DVORAK吗?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 2014年

42
我们至少得到回车键了吗?
6

72
空格,这是您的大机会!
german_guy 2014年

43
为什么不能输入密码stewardesses
密码破解者2014年

24
笑话答案:我是间谍,我切换到手表中隐藏的备用键盘。
2014年

Answers:



136

bash,vim和dc(343)

我坐在由Evil Genius配置的bash提示符下,当然他VISUAL=vim在默认环境中也有。对edit-and-execute-commandC-x C-e)使用默认的bash绑定,bash $VISUAL会在出口(ZZ)上调用并执行其缓冲区内容。我按以下顺序键入(注意:kbd-mode是在正常模式和控制顺序下发出的命令):

  1. C-xC-e
  2. a猫<<< 45 C-c4C-aaa

    现在,vim缓冲区包含cat<<<49a。继续...

  3. 45 C-c3C-aa

  4. 54 C-c41C-aa
  5. 55 C-c13C-aa

    现在,vim缓冲区包含cat<<<49a48a95a68a。继续...

  6. 51 C-c31C-aa

  7. 55 C-c24C-aa
  8. 44 C-c43C-aa
  9. 42 C-c41C-aa
  10. 42 C-c41C-aa
  11. 54 C-c11C-aa
  12. 55 C-c25C-aa

    现在,vim缓冲区包含 cat<<<49a48a95a68a82a79a87a83a83a65a80a>s

    退出插入模式,保存并退出

  13. C-cZZ

    s文件现在包含一个dc在堆栈上生成所需字符串的脚本,现在我们需要添加打印命令。

  14. C-xC-ea直流<<< 55 C-c25C-aaa >> sC-cZZ

    重复上述命令9次。

  15. C-xC-ea直流<<< 55 C-c25C-aaa >> sC-cZZ

  16. C-xC-ea直流<<< 55 C-c25C-aaa >> sC-cZZ

  17. C-xC-ea直流<<< 55 C-c25C-aaa >> sC-cZZ

  18. C-xC-ea直流<<< 55 C-c25C-aaa >> sC-cZZ

  19. C-xC-ea直流<<< 55 C-c25C-aaa >> sC-cZZ

  20. C-xC-ea直流<<< 55 C-c25C-aaa >> sC-cZZ

  21. C-xC-ea直流<<< 55 C-c25C-aaa >> sC-cZZ

  22. C-xC-ea直流<<< 55 C-c25C-aaa >> sC-cZZ

  23. C-xC-ea直流<<< 55 C-c25C-aaa >> sC-cZZ

  24. C-xC-ea猫<<< f >> s

    执行dc脚本:

  25. C-xC-ea直流电C-cZZ

输出:

PASSWORD_01

s文件内容:

49a48a95a68a82a79a87a83a83a65a80a
P
P
P
P
P
P
P
P
P
P
f

4
vim因为Ctrl角色的缘故,我本来想写剧本。很好的搭配dc!另外,出色的解决方案:)
nneonneo 2014年

2
您写所有这些<kbd> </ kbd>标签花了多长时间?
justhalf 2014年

15
@justhalf:我在vim中用这样的<Leader>k绑定写了它map <Leader>k i<kbd></kbd>^[F>a,所以它并不像看起来那样糟:-)。
2014年

18
现在很明显,特工Thor完全了解他的工具。先生,您应得的退休!
Justhalf 2014年

67

Ruby,57 + 10(*)= 67

$*<<4*4*5<<214%135<<44%25*5<<1%1
$><<"%cASSW%cRD%c%d1"%$*

该答案使用*%构建丢失字符的ASCII值(以及0作为Fixnum)并将其推入$*ARGV)。然后将此数组与格式字符串结合使用以生成正确的密码,并以$><<$>is stdout)打印。

Ruby,62 + 10(.)= 72,无换行符

$>.<< "%cASSW%cRD%c%d1".% %w%%<<311%231<<214%135<<321%113<<1%1

基本上与上述版本相同,但此处的数组是从空数组文字(%w%%)构建的。.需要一些摆弄才能获得所需的运算符优先级。


13
“这是您退休前的最后一项任务,将以高额薪水和全世界的感激之情退休。” 恭喜,我们都谢谢您:)
Timtech

4
最终证明Perl是Ruby的最大灵感之一。
Pierre Arlaud 2014年

11
您是如何进行换行的?
Cephalopod 2014年

4
@Arian nneonneo在将其键入REPL之后运行他的Python代码的方式相同。我将添加一个没有换行符的版本。
Ventero 2014年

邪恶的天才是否安装了红宝石?
Mhmd 2014年

36

空格(148 + 10 = 158)

Enter 这里需要使用密钥。

SS+1010000L // Push code of P
TLSS        // Output character
SS+1000001L // Push code of A
TLSS        // Output character
SS+1010011L // Push code of S
SLS         // Duplicate top stack
TLSS
TLSS
SS+1010111L // Push code of W
TLSS
SS+1001111L // Push code of O
TLSS
SS+1010010L // Push code of R
TLSS
SS+1000100L // Push code of D
TLSS
SS+1011111L // Push code of _
TLSS
SS+0L       // Push 0
TLST        // Output number
SS+1L       // Push 1
TLST        // Output number
LLL         // End program

我的符号解释:

  • S+0是空间。
  • T1是标签。
  • L 是新行。
  • // 开始评论。

每行都是空白语言的命令。

演示版


1
啊,我...我只是在努力:(
Teun Pronk 2014年

1
我也是,但我放弃了这一点,因为知道有人会更快
german_guy 2014年

我以为没有“ L”?
500-内部服务器错误

@ 500-InternalServerError:实际上L代表换行符。检查演示中的真实代码。我发布的是可读版本。
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 2014年

啊,我明白了。
500-内部服务器错误

25

蟒蛇(2200 395 + 10)

exec"""exec"exec"+"%ca"%34+"%c52+53"""+"%c55+55"%44+"%c34"%44+"%c45+35"%44+"%c"%44+"""34%%cexec"%"""+"%c"%54+"""1+"%c"%34+"%%5%c+"%5"""+"%c"%55+"""+"%c"%34+"%c"""+"%c"%112+"""r%%c%%ct%%c%%cASSW"+"%c%%34+"%34+"%c%%cRD"%34+"%c%%"""+"%c"%55+""""%34+"%c+"%5"""+"%c"%55+"""+"%c%%c"%34+"%c%%"%34+"%c5+"%5"""+"%c"%55+"""+"%c"%34+"%c1%%c"+"%c%%4"%34+"%c+"%5"""+"%c"%54+"""+"%c"%34+"%c%%a"+"%c%%34"%34"""

我需要一个+字符(成本+10),可以从数字键盘(或某些键布局)上获得。

是的,在我键入时,BOMB可能关闭了。

基本方法是使用exec和构造更大的字符集"%c"%(number)。彼此exec嵌套有四个。我的手指逐渐从

  1. 12345
  2. 1234567(6 = ASCII 54,7 = ASCII 55)
  3. 123456789(8 = ASCII 56,9 = ASCII 57)
  4. 0x0123456789abcdef

这样,在最后的迭代中就可以表达任何字符(以便最里面的版本实际上可以运行任何程序)。

大约50%的程序只是引号字符("%c"%34是双引号),因为exec语句的嵌套性质要求积极地“转义”引号字符。


如果使用数字键盘上的“ +”,则表示您独立于键盘语言。
celtschk 2014年

@celtschk:好点!我会编辑英寸
nneonneo

1
而不是使用嵌套的execs来构建数字集,您不能使用算术得到数字吗?例如 exec '%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c'%(112,114,51+54,55+55,1+115,32,4+35,25+55,11+54,31+52,31+52,32+55,24+55,31+51,13+55,41+54,3+45,4+45,4+35)
凯文

2
因为不能同时获得两个原谅。(我确实考虑过!)
nneonneo 2014年

此外,Python没有比%更强的绑定运算符。**是一个,但是对于构造大多数术语而言,它往往是毫无用处的。
nneonneo 2014年

25

失眠 39 35 31 29

当我寻找一种可以用单个ASCII字符编码其指令的语言时,就会出现这种语言。该语言实际上是使用字符的十进制ASCII码进行操作的,因此即使一半的键盘被破坏,它也仍然非常灵活。

将其进一步降低到29个字符,这可以在减少内存使用并增加搜索空间之后实现:

FdFzt%dF<rGdt>tt Gtreeet t%4s

我决定对整套允许的字符运行经过调整的程序,并将解决方案缩减为31个字符:

FdFGt dtreeC>tt FFdx<Fdtr ztq4s

我使用一个程序来搜索此解决方案。这是我的程序返回的许多解决方案之一,所有解决方案的大小都相同。

Fddx>"eCeezdC>CefCdddzCzzfCqred>r4s

手动构建的旧版本。我记得熬夜要这样做。

Fddx>"eCeezdC>Cef>dx"dCezeeedeCrqeeC%4s

这是用于测试的失眠解释器


3
+1(直到早上)与您选择的编程语言相匹配。
justhalf 2014年

20

一些窗口管理器上的Vim + PHP

65次击键,共击打44次,使用会罚10分=

aEACE<Alt+Tab>z=5<Alt+Tab>$xxxxaASSWRD<Alt+Tab>z=1<Alt+Tab>
$a$aA<Alt+Tab>==wxx$r1<^X>a1

细目:

  • Alt+Tab似乎可以Esc与Vim或终端仿真器一起使用。感谢您教我一些新知识!
  • aEACE<Alt+Tab>:进入追加模式并插入“ EACE”。出口。
  • z=5<Alt+Tab>:执行拼写更正。选择5,“和平”。出口。(Esc似乎在Enter这里工作!)
  • $xxxxaASSWRD<Alt+Tab>:转到行尾。删除4个字符并添加ASSWRD,结果为PASSWRD。返回正常模式。(不,4x不行。)
  • z=1<Alt+Tab>PASSWORD可能会成为这个第一校正。选择它。
  • $a$aA<Alt+Tab>:转到行尾,并添加一个$aA。返回正常模式。
  • ==:很好地格式化这行PHP,将camelCase更改$aA$a_a。这也将光标移回行的开头。
  • wxx:向前说一个字;光标现在在$。删除两个字符- $a-进行制作PASSWORD_a
  • $r1:转到该行的末尾,并用替换当前字符(即a1,结果为PASSWORD_1
  • ^X:减少游标下的整数,得出PASSWORD_0
  • a1:最后,追加1,对PASSWORD_01

我无法复制==命令,它只能在我的vi设置中切换大缩进模式(debian 7,v7.3.547)
Cengiz Can

11

Python 2,75889字节

没有多余的性格!

不幸的是,代码太长了。因此,下面是生成程序的代码:

x=[2**n for n in xrange(16)]
y=-5
print('exec"""exec'+x[7]*'%'+'c""'+x[6]*'%'+'cr'+x[-2]*'%'+'c'+x[-1]*'%'+'ct'+x[8]*'%'+'c'+x[-4]*'%'+'cASSW'+x[-5]*'%'+'cRD'+x[-3]*'%'+'c'+x[0]*'%'+'s1'+x[10]*'%'+'c '+x[9]*'%'+'c""'+x[y]*'%'+x[1]*'%'+'s'+x[y]*'%'+x[2]*'%'+'s'+x[y]*'%'+x[3]*'%'+'s'+x[y]*'%'+x[4]*'%'+'s'+x[y]*'%'+x[5]*'%'+'s"""'+'%`1>>1`%`2531>>5`%`321>>2`%`1521>>4`%`211>>1`%`221>>1`%112%34%34%34%34')

在线尝试

(要运行代码,请将外部更改printexec。或者,生成程序,然后粘贴并运行。或者从下面链接的pastebin中复制。)

说明:

目标是执行:

print"PASSWORD_01"

为了避免使用()+字符,我们必须使用链接在一起的多个字符串格式操作。这意味着添加的每个步骤实际上使上一个步骤所需的字符数加倍%

print"%cASSW%%cRD%%%%c%%%%%%%%c1"%80%79%95%48

但是这还不够,因为无法创建所需的一些数字,我们也不能创建print。因此,我们execprinting 添加了一个抽象级别,以及一个我们无法创建用于格式化的ASCII码点的级别。以下是我的答案,但每个字符串都%简化为一个字符串(请注意,这%s%s%s%s%s不是准确的表示形式,未能考虑每个字符串%之前所需的文字):

exec"""exec%c""%cr%c%ct%c%cASSW%cRD%c%s1%c %c""%s%s%s%s%s""" % `1>>1`%`2531>>5`%`321>>2`%`1521>>4`%`211>>1`%`221>>1`%112%34%34%34%34

第一步:最外层exec

exec""" ... ASSW%cRD ... %s%s%s%s%s""" % `1>>1` % `2531>>5` % `321>>2` % `1521>>4` % `211>>1` % `221>>1`
  1. 1>>10,用于0PASSWORD_01
  2. 2531>>579,用于内部执行程序创建O
  3. 321>>280,用于内部执行程序创建P
  4. 1521>>495,用于内部执行程序创建_
  5. 211>>1105,用于内部执行程序创建i
  6. 221>>1110,用于内部执行程序创建n

第二步:准备内心 exec

在上述之后,内部exec是这样的:

exec%c""%cr%c%ct%c%cASSWORD%c01%c %c""%79%80%95%105%110

除了您不太了解。仍然通过简化,您会得到:

exec%c""%cr%c%ct%c%cASSWORD%c01%c %c""798095105110

%需要包含文字。因此,基本上,我必须在每一个格式之前添加一堆,%s最后%在所有格式设置后都剩下文字。2**11其中。时代五。

其余的外部exec字符串格式操作为%112%34%34%34%34。的112p,而其他的都是引号。应用这些之后,结果是这样的:

exec"""pr%c%ct"%cASSW%cRD%c01" """%79%80%95%105%110

但实际上它还有很多%。是这样的:

exec"""pr%%%%%%%%c%%%%%%%%%%%%%%%%ct"%%cASSW%cRD%%%%c01" """%79%80%95%105%110

最后一步是简单地运行它,之后您将获得必要的输出。


完整代码在这里: http : //pastebin.com/rSFs6DiH


7
令人印象深刻!您是在BOMB爆炸之前手动键入所有内容的吗?没有犯任何错误(没有退格键)?先生或女士,您应该得到您的退休金。; D
DLosc

10

bash + vim(56)

借用Ctrl-XCtrl-EThor的解决方案中的bash技巧,这是我在bash + vim中的方法:

C-XC-E 启动默认编辑器(通常是vim)

a 开始插入模式

.space ASSW

C-Vx4f 插入 O

RD

C-Vx5f 插入 _

1

C-3等价于escape(不仅在vim中,而且在终端中的任何地方)

C-X1刚输入的i中减去1

a 再次插入模式

1 C-3

现在是缓冲内容 . ASSWORD_01

<< 取消缩进行(无操作,因为行未缩进),然后将光标移至第一列

a

C-X 开始单词补全

C-V 用ex命令完成

C-V 另外9次选择条目 Print

C-3 回到正常模式

XXXxx 删除 rint 

< < 回到第一栏

s删除.,开始插入模式

e c C-X C-Vex命令再次完成,echo由于ec输入了i ,因此已经选择了条目

space C-3 现在缓冲内容 echo PASSWORD_01

Z Z 保存缓冲区,关闭vim,bash执行文件内容,即 echo PASSWORD_01

顺便说一句:C-3有许多有用的弟兄:C-Jis EnterC-Iis TabC-His BackspaceC-2is C-@(即空字节)。对于emacs用户,很高兴知道Escape后面紧跟另一个键等于Alt+该键。因此,即使没有EscapeAlt您仍然可以像这样键入Meta-x:C-3x


9

Perl,(31 + 10/41 + 10/64 + 10)

^使用的键,3种方式)

exec"easswsrdcqw"^"5    <  <AF"                   # exec "PASSWORD_01"

  • 如果作为系统命令运行合格,则为“输出”。

exec"QQZSqeasswsrdcqw"^"422<Q5    <  <AF"         # exec "echo PASSWORD_01"

exec"EQAXqwQqQZQxqeasswsrdcqwxqq"^q!5434QZ4S534$S5    <  <AF$SS! 
                  # exec "perl -e\"die\\\"PASSWORD_01\\\"\""

脚本使用Perl的按位字符串XOR运算符^,该运算符对两个字符串的字符位进行XOR。这使我可以为PASSWORD_01重新创建缺少的字符,并为system命令创建字符。

我根据规则的宽松程度做出了三种变体。我假设由于变体2和3实际上在Ideone上输出了单词,所以解决方案是有效的。我删除了这里的小故事,因为我认为没有人会读它,但是如果您好奇的话,可以在编辑中阅读它!


4

oOo代码(300)

QwerTaSdfGzxCqwertAsDfgZxCQwerTasDfgZxcQweRtaSDfgZxCqwertAsDFgZXcQWeRtaSdFGzxcQwERTasdfGzxc
QwErtAsdFgzxcqWeRtaSdFGzxcQweRtaSDfGZxCqWErTAsDFgZXCqWerTasDfgZxcQweRtaSdfGzxCQwErTAsDFgZXC
qWertAsDfgzxcQwERtASdFGzXcqWeRTasdFGzXcQWeRtAsDfgzxcQwERtASdFGzXCqWerTaSDfgzXcQWErTaSdFgZxc
QwertaSdFgzXcQWertASdFgZXCq

简单。(换行是可选的,这里只是为了使代码“更具可读性”)使用的代码生成器:

o=lambda b,c:"".join(i.upper()if j else i for i,j in zip(__import__('itertools').cycle(c),map(int,"".join((3-len(i))*'0'+i for i in(bin('><[]-+.,'.index(i))[2:]for i in b)))))

相同的代码,但没有那么愚蠢的编码:

EeeeEeEeeEeeEeeeeeEeEeeEeEEeeeEeeEeeEeeEeeEeeEEeeEeEeeeeeEeEEeEEeEEeEeeEeEEeeeEeEEEeeeeEeee
EeEeeEeeEeeeeeEeEeeEeEEeeeEeeEeeEEeEEeEeEEeEEeEEeEEEeEeeEeeEeeEeeEeeEeeEeeEeeEEeEeEEeEEeEEE
eEeeeEeEeeeeeEeEEeEEeEEeEeeEeEEeeeEEeEeEEeEeEeEeeeeeEeEEeEEeEEeEEeEeeEeEEeeeEeEEEeEeEeEeEee
EeeeeeEeEeeEeEEeeeEEeEeEEEe


3

ferNANDo,179 + 10 = 189字节

2 1
1 2 1 2 1 1 1 1
1 2 1 1 1 1 1 2
1 2 1 2 1 1 2 2
1 2 1 2 1 1 2 2
1 2 1 2 1 2 2 2
1 2 1 1 2 2 2 2
1 2 1 2 1 1 2 1
1 2 1 1 1 2 1 1
1 2 1 2 2 2 2 2
1 1 2 2 1 1 1 1
1 1 2 2 1 1 1 2

在线尝试!

Enter用过的。我会使用01使代码更具可读性,但是我不能使用0


我认为可以进入。
Conor O'Brien

2
OP并未表示允许Enter。
acrolith

3

JS-Forth,103个字节

该字符串将作为字符数组返回到堆栈中。

12544 1 3 << >> 24 1 << 1521 4 >> 34 1 << 41 1 << 2531 5 >> 351 2 >> 332 2 >> 32 2 >> 131 1 >> 321 2 >>

在线试用 -评论版本


说明:

我首先找到了允许的单词列表。本质上,我唯一可以使用的有用的东西是:

  • 12345 数值常数
  • << 左移
  • >> 右移
  • s>f 推入单个以浮动堆栈
  • f>d 从浮动堆栈弹出双
  • fsqrt 浮法堆栈上的平方根

因此,我可以使用数值常量,移位和使用以下内容计算平方根(>>replaces drop,shifting by 0以删除0):

s>f fsqrt f>d >>

幸运的是,我发现创建所需的每个常量的可能位移比使用平方根短。在大多数情况下,我通过简单地打印每个平方的数字进行搜索,如果每个平方包含一个数字,则将其打印为更大的2的幂6-0。然后,我意识到我可以利用的精度损失f>d来找到更多的可能性。(我可以加上数字,但仍然得到相同的整数平方根。)过一会儿,我开始使用移位来查找某些常量,然后查找所有常量。>>位移越大,我可以增加更多的“幻数”,但仍然得到相同的结果。因此,我找到了可用于获得必要结果的最小位移位。偶数有时可以使用<<,必须使用赔率>>

带注释的代码(\开始注释):

\ 49
12544 1 3 << >>

\ 48
24 1 <<

\ 95
1521 4 >>

\ 68
34 1 <<

\ 82
41 1 <<

\ 79
2531 5 >>

\ 87
351 2 >>

\ 83 (x2)
332 2 >> 332 2 >>

\ 65
131 1 >>

\ 80
321 2 >>

gForth没有单词<<>>。相反,它具有lshiftrshift,而我不能使用


3

小数190 180 + 10 = 190个字节

12055D12025D41D301212055D12010D41D301212055D12025D41D12003D41D30130112004D41D301212055D12024D41D30112003D41D301212055D12013D41D301212055D12040D41D301212045D12003D41D30112001D41D301

在线尝试!十进制是一种神秘的语言,只使用十进制和字母D。但是,我需要+10的罚款,因为几乎每个命令都使用0

幸运的是,所有需要打印的命令PASSWORD_01都不需要数字6

  • 12...D -推一个角色
  • 2 -弹出一个值
  • 41D -弹出顶部两个堆栈值,相乘并推送结果
  • 301 -打印DSI(默认堆栈索引)

通过反复推送仅使用数字1到5的字符值,然后将它们相加,我可以为中的每个字母设置字符值PASSWORD_01

取消评论并评论:

12055D     ; push char 55 to stack
12025D     ; push char 25 to stack
41D        ; pop [DSI] and [DSI-1], add and push result
3012       ; print from stack to output, pop
12055D     ; push char 55 to stack
12010D     ; push char 10 to stack
41D        ; pop top two stack values, add and push result
3012       ; print from stack to output, pop
12055D     ; push char 55 to stack
12025D     ; push char 25 to stack
41D        ; pop x2, add, push
12003D     ; push char 3 to stack
41D        ; pop x2, add, push
301301     ; print, print
12004D     ; push char 4 to stack
41D        ; pop x2, add, push
3012       ; print, pop
12055D     ; push char 55 to stack
12024D     ; push char 24 to stack
41D        ; pop x2, add, push
301        ; print
12003D     ; push char 4 to stack
41D        ; pop x2, add, push
3012       ; print, pop
12055D     ; push char 55 to stack
12013D     ; push char 13 to stack
41D        ; pop x2, add, push
3012       ; print, pop
12055D     ; push char 55 to stack
12040D     ; push char 40 to stack
41D        ; pop x2, add, push
3012       ; print, pop
12045D     ; push char 45 to stack
12003D     ; push char 3 to stack
41D        ; pop x2, add, push
301        ; print
12001D     ; push char 1 to stack
41D        ; pop x2, add, push
301        ; print

3

空白,得分:111(101个字节+的10 Enter

[S S T  T   T   T   T   T   N
_Push_-31_1][S S T  T   S S S S S N
_Push_-32_0][S S S T    T   T   T   N
_Push_15__][S S T   T   T   S S N
_Push_-12_D][S S S T    S N
_Push_2_R][S S T    T   N
_Push_-1_O][S S S T T   T   N
_Push_7_W][S S S T  T   N
_Push_3_S][S N
S _Duplicate_3_S][S S T T   T   T   T   N
_Push_-15_A][S S S N
_Push_0_P][N
S S N
_Create_Label_LOOP][S S S T S T S S S S N
_Push_80][T S S S _Add][T   N
S S _Output_as_character][N
S N
N
_Jump_to_Label_LOOP]

字母S(空格),T(制表符)和N(换行符)仅作为突出显示而添加。
[..._some_action]仅作为说明添加。

在线尝试(仅使用空格,制表符和换行符)。

伪代码中的解释:

此解决方案比现有的Whitespace答案短(@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳要求我将其发布为单独的答案,当我建议将其作为高尔夫球时使用),方法是利用我的Whitespace提示

Push the code-points for the characters of "10_DROWSSAP" minus constant 80 to the stack
Start LOOP:
  Add 80 to the current code-point
  Pop and output it as character
  Go to the next iteration of LOOP

这个Java程序80已经生成了常量,我已经创建了该常量并将其用于我以前的一些Whitespace答案。


2

Stax,91 + 10字节

"W"EEEd$"$"1 !$Re]"$""ASSW"R"$""a"EEE$"$"a$Re]R"$""RD"R"$""a"EEEd$"$""5"Re]R"$"1 !$R"$""1"R

在线尝试!

用于]制作单身人士。

说明

让我们看看如何"P"生成以及如何在"ASSW"不使用normal的情况下附加+

"W"                             Push "W", or [87]
   E                            Convert to a scalar, 87
    E                           Convert to an array of digits, [8,7]
     E                          Push 8 on the stack, then push 7.
      d                         Pop the 7 and discard it.

                                Start making components of regex substitution
       $                        Pop 8, push "8"
        "$"                     Push "$"
           1 !                  Push 0. The space is necessary because normally one doesn't do 1! to obtain 0
              $                 Pop 0, push "0"
               R                Do regex substitution 's/$/0/g' on the string "8"

                                Basically doing "8"+"0" without using +
                e               Pop "80", push 80
                 ]              Singleton. Pop 80, push [80], or "P"
                  "$""ASSW"R    Use the same trick again to append "ASSW" to "P"

其余的只是重复同样的把戏。

"a"EEE$"$"a$Re]R交换"a"或的数字[97]以制作[79]"O"并将其附加到字符串。

"$""RD"R appends "RD"

"$""a"EEEd$"$""5"Re]R使用"a"再次获得"9",并丢弃"7",然后组合"9"以文字"5",以形成[95]"_",并将其附加到该字符串。

"$"1 !$R 通过逻辑非1获得零,并将其附加到字符串。

"$""1"R追加决赛"1",我们就完成了。

隐式输出。


1
O_O ...这很聪明。
递归

感谢您的赞赏。我相信可以将其缩短(也许通过选择其他键?)。

2

头脑操,400 + 10(+)= 410字节

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.<.>>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++..++++.<<++++++++++++++.+++.>>>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.<++++++++.>>>>++++++++++++++++++++++++++++++++++++++++++++++++.+.<

在线尝试!


2

MS-DOS .COM 8086机器代码(72字节)

时间是很宝贵的,所以没有时间与编译器或解释器打交道!只需打开您选择的文本编辑器,然后输入以下内容(\t用TAB 代替):

451D<1DAQX1D11D3AQX4c1DDQX4<SZ!Gq\tGq3WqEEEEESX5\t\t2!<<<<<<<<<eASSWzRD<11$

作为十六进制转储:

00000000 : 34 35 31 44 3C 31 44 41 51 58 31 44 31 31 44 33 : 451D<1DAQX1D11D3
00000010 : 41 51 58 34 63 31 44 44 51 58 34 3C 53 5A 21 47 : AQX4c1DDQX4<SZ!G
00000020 : 71 09 47 71 33 57 71 45 45 45 45 45 53 58 35 09 : q.Gq3WqEEEEESX5.
00000030 : 09 32 21 3C 3C 3C 3C 3C 3C 3C 3C 3C 65 41 53 53 : .2!<<<<<<<<<eASS
00000040 : 57 7A 52 44 3C 31 31 24                         : WzRD<11$

另存为.COM文件并运行以保存日期。

该代码假定寄存器的某些起始值,因此可能不适用于所有DOS版本。只是希望有人购买IBM 有被解雇的危险。

稍微容易理解的表示形式:

org 0x100
bits 16
cpu 8086

; Assumes the following start values for registers (as per http://www.fysnet.net/yourhelp.htm):
;
;   AX = 0
;   BX = 0
;   CX = 0x00ff
;   SI = 0x100

; Change e => P and z => O
    xor al, 0x35
    xor [si+0x3c], ax
    xor [si+0x41], ax

; Fix int 0x21 and ret
    push cx
    pop ax              ; AX = 0xFF
    xor [si+0x31], ax
    xor [si+0x33], ax

; Change <1 => _0
    inc cx              ; CX = 0x100
    push cx
    pop ax              ; AX = 0x100
    xor al, 0x63        ; AX = 0x163
    xor [si+0x44], ax

; We're using DOS interrupt 0x21, function 0x09 to output the final string.

; AH must equal 0x09 to select the function.
; DS:DX must point to the $-terminated string we want to output.

; Get DX to the correct value (0x13c)
    push cx
    pop ax              ; AX = 0x100
    xor al, 0x3c        ; AX = 0x13c
    push bx
    pop dx              ; DX = 0

; We use part of the Program Segment Prefix to temporarily store the value,
; since MOVing or PUSHing AX is impossible.
; The part in question is the second File Control Block, which we will not use anyway.
    and [bx+0x71], ax
    or [bx+0x71], ax
    xor dx, [bx+0x71]   ; DX = 0x13c

; NOPs to get int 0x21 and ret on high enough addresses
    inc bp
    inc bp
    inc bp
    inc bp
    inc bp

; Set AH to the correct value. AL is set too, but is ignored by the DOS interrupt.
    push bx
    pop ax              ; AX = 0
    xor ax, 0x0909      ; AX = 0x0909

; What will become instructions int 0x21 and ret
    db 0x32, 0x21
    db 0x3c

; Padding to have the password at an address we can refer to.
    times 60-($-$$) db '<'

; Password
    pw  db  "eASSWzRD<11$"

1

Befunge-98,43 +10 = 53字节

"1qA·DR·WSSA·g"%,$,,,,$"s"%,,,$"c"%,%,,q

在线尝试!

10个字节的罚款是因为,密钥的使用(不确定为什么不能用Shift+ 来完成<,但这似乎是规则)。尽管从技术上讲源是40个字符,但是·由于它们的UTF-8编码,这三个字符又贡献了三个字节。


1

05AB1E87 86字节

"."A1.$R24.$AT<.$R15>.$A21<.$R5.$.V.VD21s.V.V15>X.V"ASSW"15X.V"RD"122D<s2X.V.VTRTX.V.V

在线尝试!

也许是最长的05AB1E代码?

不幸的是,该语言不支持"Q"<“减Q以获得P”之类的功能

我的额外键是V。

感谢@Kevin Cruijssen提供-1个字节。

码:

Build the string ".b". This is the code to turn integers to upper case letters:
"."             push "."
A               push the lower case alphabet
1.$             drop the first letter of that
R               reverse the remaining string 
24.$            drop the first 24 letters of that, so only "b" remains
AT<.$R15>.$     do the same trick for "j"
A21<.$R5.$      and for "u" 
.V              run "u" as code to turn "j" to "J"
.V              run "J" as code, to join ".", "b" to ".b"

Save that string for later use:
D               duplicate
21              push 21
s               switch the top two elements [".b", 21, ".b"]
.V              run ".b" as code, to get "U"
.V              run "U" as code, to save ".b" in X

Build password string:
15>X.V          push the 16th letter of the alphabet ("P")
"ASSW"          push "ASSW"
15X.V           push "O"
"RD"            push "RD"
122D<s2X.V      push 121, 122, "B"
.V              run that as code to push "_"
TR              push 01
TX.V            push "J"
.V              run that as code, to join everything to the desired string 

进行比较:打印“ PASSWORD_01”的最短方法是6个字节长

在线尝试!


也许是有史以来最长的05AB1E代码? ”不,这是我的其中一个的近六倍大。; p好的答案无论如何。很难仅使用一定数量的允许的ASCII字符。如此众多的便捷内置函数无法应对这一挑战。:(
Kevin Cruijssen

1
通过使用-1字节TR代替输出1<101一部分。
凯文·克鲁伊森

1

Emacs,26个字节(可能+ 10 = 36或− 2 = 24)

此答案所需的额外键是Esc。它位于仍完好无损的键盘的一半上,但由于某些原因未在问题中提及,因此可能会或可能不会给分数带来损失。(EscAlt是在Emacs同等学历; Alt也是在键盘的完整的一半,但在问题没有提及,但举行,而不是挖掘,所以我不能用它作为我的额外关键,这将节省两个字节。 ,因为它的编码比以前短Esc。)

程序本身(逗号分隔Emacs用来接受其输入的在线格式字节之间的边界):

WSEsc$DACtrl- ,TSRWDEsc$5- CtrlQ5f- CtrlXr- CtrlSpace1- CtrlXr,,g -1CtrlT

将此编码为原始字节,以证明字节数:

00000000: 5753 1b24 4441 1453 5257 441b 2435 1135  WS.$DA.SRWD.$5.5
00000010: 6618 7200 3118 7267 3114                 f.r.1.rg1.

(注意:有些细节可能会根据Emacs的配置方式而有所不同;此答案要求quoted-char-radix设置为16,并且Emacs使用我的英式英语系统中默认的拼写检查字典。就像合理的配置设置一样,但是您的Emacs副本的配置可能会有所不同,不同的字典可能仍会提供26字节的程序,但是可能需要使用略有不同的拼写错误,以便我们可以接受我们想要的更正非子弹键。)

说明

我不确定它是否会对编辑器大战产生任何影响,但是Emacs似乎至少在这个问题上胜过了vim。Emacs非常适合以字节为单位的编辑高尔夫,因为它很大程度上依赖于占用多个按键但仅一个字节的和弦(因此,Emacs程序的键入速度通常比等效的Vim程序慢,但在磁盘上更短)。此外,大多数最重要的Emacs命令都位于键盘的左下角,要靠近,对于Ctrl此类问题非常有帮助。

“您可以假设在子弹进入之前打开了解释程序外壳/源代码编辑器。可悲的是,您在敲击键盘之前还没有在其中编写任何内容。”因此,我假设我们在Emacs中打开了一个空文件,并且需要输入密码。(我们之后需要保存文件,并可能退出Emacs,但是其他人的答案中没有计入该字节,因此我也不在此处计算它们。使用键盘,Ctrl- XCtrl- SCtrl- XCtrl- C。)

一次接受一个命令(或类似命令的块):

  • WS:输入WS到文档中。
  • Esc$:调用拼写检查器。WS不是一个真正的词,但它会找到许多类似的两个字母的词。
  • D:使用拼写检查器,更正WSPS。(当拼写检查器使用调用Alt- $,这里发生的事情(EscAlt相当于Emacs的),只检查一个字,所以它这样做后停用。)
  • A:插入A,给予PSA
  • Ctrl- T:交换前两个字符,输入PAS
  • SRWD:类型SRWD,捐赠PASSRWD
  • Esc$5:我们再次调用拼写检查,因为我们要纠正我们的错误拼写PASSRWDPASSWORD。请注意,我们无法像初次尝试时那样猜测我们想要的单词PASSWRD,因为接受最接近的实词的键是0我们无法按下的键。结果,使用稍微更极端的拼写错误PASSRWD将我们想要的单词推到位置5,我们可以接受它。
  • Ctrl- ,Q5f插入用字符代码U + 5F,即字符_。现在,文档将读取PASSWORD_(或者当我们开始键入下一个命令时将读取;在此之前,如果我们键入另一个十六进制数字,则不会出现下划线)。
  • Ctrl- ,Xr- CtrlSpace1储存在寄存器1中的当前光标位置(相对于文件的开始)理由很奇怪,这是1索引,所以(具有迄今书面9个字符)光标位于位置10
  • Ctrl- ,Xrg1寄存器1的内容复制到文档中。现在读取PASSWORD_10
  • Ctrl- T:交换光标前的两个字符。我们现在有了PASSWORD_01,就像问题所要求的那样。

如果允许使用Alt,我们可以将“ invoke spellchecker”命令编码为单个字节,a4而不必将其拼写为1b 24; 它出现两次,因此节省了两个字节。(大多数现代终端都将1b 24其用作Alt- 的编码,$以避免与UTF-8发生冲突,但是a4有时也会遇到编码,有时可以将其作为配置选项使用。)

可能的字节节省可能涉及高尔夫球手的错误拼写纠正。PSASWRD键入时会短一个字节,但是不幸的是,拼写检查器似乎无法从中收集PASSWORD信息,PASSRWD所以到目前为止,我发现的最佳方法是。基于寄存器的获取10方法也很笨拙,但是在Emacs中没有很多方法可以从零开始创建数字0,否则很难忍受。(至少有两个非常有用的巧合:游标刚好碰巧停在position 10,它0在需要时包含一个;以及Emacs接受冗余g寄存器操作以将寄存器内容插入文档中的事实,除了更直观i

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.