创建一个程序,将输入字符串转换为以输入字符串开头的回文。该程序本身必须是回文。
例如输入:neverod
,打印neveroddoreven
。您还应该处理多字,多行输入。
neverod
- > neverodadoreven
(有a
介于两者之间)
创建一个程序,将输入字符串转换为以输入字符串开头的回文。该程序本身必须是回文。
例如输入:neverod
,打印neveroddoreven
。您还应该处理多字,多行输入。
neverod
- > neverodadoreven
(有a
介于两者之间)
Answers:
⌽,,⌽
其他解决方案:
⌽,⊢⊢,⌽
⌽⊢⊢,⊢⊢⌽
它们只是:
{⌽((,⍵),(⌽⍵))}
{⌽((,⍵)⊢((⊢⍵),(⌽⍵)))}
{(⌽⍵)⊢((⊢⍵),((⊢⍵)⊢(⌽⍵)))}
单声道,
,⊢
对字符串不执行任何操作。Dyadic ,
是串联的。Dyadic ⊢
返回其右操作数。并且⌽
显然是还原。
qL;_-1%1-_;Lq
qL; "Read the input, Put an empty array on stack and pop that array";
_-1% "Now the string is on top, make a copy and reverse the copy";
1- "Remove occurrences of integer 1 from the reverse string. [no-op]";
_; "Copy the reversed string and pop it";
Lq "Put an empty array on stack and read the remaining input. Remaining";
"input will be empty as we already read whole of the input";
要么..
.-1%}%1-.
. "Input is already on stack. Make a copy";
-1% "Reverse the copy";
} "This marks the beginning of a super comment. Anything after this in the";
"code is a comment";
%1-. "no-op comment";
#
此处进行普通评论也一样。
}
就被认为是超级评论:)
#include<cstdio>//
main(){int c=getchar();if(c>0)putchar(c),main(),putchar(c);}//};)c(rahctup,)(niam,)c(rahctup)0>c(fi;)(rahcteg=c tni{)(niam
//>oidtsc<edulcni#
main(c){c=getchar();if(c>0)putchar(c),main(),putchar(c);}//};)c(rahctup,)(niam,)c(rahctup)0>c(fi;)(rahcteg=c{)c(niam
a b fa=fa<|>b
fa=reverse>>=a
main=interact fa
niam=main
af tcaretni=niam
a=>>esrever=af
b>|<af=af b a
这必须Control.Applicative
在范围内的模块下运行,可以通过ghci init文件进行设置.ghci
::m Control.Applicative
(-> +22字节)。
没有注释技巧,只有7个函数从未调用其中的4个。
如果允许使用功能(而不是程序):
a b fa=fa<|>b
f=reverse>>=a
a=>>esrever=f
b>|<af=af b a
用法f "qwer"
->"qwerrewq"
编辑:以前的版本是错误的。
s=gets p
s+=s.reverse||esrever.s=+s
p steg=s
从stdin接受多行字符串作为输入,输出该字符串的Ruby表示,并串接成反向。可以通过替换||
为#
来修剪字符,以注释掉第二行中的无效代码。
s=gets p
!=p steg=s
较新的语言,没有竞争
aη+i_i+ηa
说明:我只是刚开始做Jolf,我认为我没有正确解释这一点。
aη alert function, arity of the function can't be reduced by 1 so it stays at 1
+i_i concatenate the input with the reversed input
+η arity of the add reduced by 1, it just takes the following character (a)
a returns the input
η
在解决方案中使用的方式,做得很好。您可以通过消除mu来节省两个字节,例如:a+i_i+a
。(Jolf也有隐式输入来填充其余的参数,但这不是问题,因为一次只给出一个输入。)我还是将原始解决方案保留在答案中。
$args|%{$_+-join$_[$_.Length..0]}#}]0..htgneL._$[_$nioj-+_${%|sgra$
如@mazzy所建议,使用静态范围时,代码可以缩短12个字节。但是,这将输入长度限制为9KB。从理论上讲9MBytes是可能的,但是它将大大降低代码的速度。
$args|%{$_+-join$_[9kb..0]}#}]0..bk9[_$nioj-+_${%|sgra$
param($s)$s+-join$s[$s.Length..0]#]0..htgneL.s$[s$nioj-+s$)s$(marap
$args|%{$_+-join$_[9Kb..0]}#}]0..bK9[_$nioj-+_${%|sgra$
55个字节
FOG比此挑战要新,因此这是不竞争的。
^dz''sjX@Xjs''zd^
19个字节的替代解决方案:
^Czs''.jX@Xj.''szC^
它们都接受输入,重复和反向,然后加入堆栈。
说明:
^dz''sj@js''zd^
^ # Get input
d # Duplicate ToS (input)
z # Reverse ToS
'' # Push empty string (for joining separator)
s # Move the empty string to the inactive stack
j # Join the active stack with the top of the inactive stack as the delimiter and push the result.
X # Print the ToS
@ # End the program
Xjs''zd^ # Backwards version of the beginning.
|=||==>|=|=|=+|=>==||==>=|+=|=|=|>==||=|
我的第一个念头是Brainfuck,但无法匹配花括号...幸运的是tinyBF具有更简单的流控制。
没有注释,它将以零终止的字符串作为输入,并以零终止的字符串返回结果。您可以在此处对其进行测试,只是要警告它不会停止(尽管Firefox至少会提示您停止无响应的脚本)。
评论:
|=| Retrieve a byte of input.
| Positive (opening) bracket.
== Output the byte.
> Move the pointer in positive direction.
|=| Retrieve a byte of input.
= Switch direction to negative.
| Negative (closing) bracket.
= Switch direction.
+ Increment byte to execute return loop.
| Opening bracket.
=> Move the pointer in negative direction.
== Output the byte.
| Closing bracket.
|=| Output the null terminator.
|==>|=|=|=+|=>==| ...and keep null terminating it just to be sure.
请注意,如果将其编码为2位指令,则会将其大小缩减为10个字节(不会是回文)。
a=input()#
print(a+a[::-1])#([1-::]a+a)tnirp
#()tupni=a
我尽力找到一个只用一行的解决方案,但是我没有运气。
a=input()#()tupni=a#
print(a+a[::-1])#([1-::]a+a)tnirp
#a=input()#()tupni=a
我最初的尝试是每行都是回文。我认为这个挑战不是必需的,但我以防万一。
lambda
很长):print((lambda a:a+a[::-1])(input()))#)))(tupni()]1-::[a+a:a adbmal((tnirp
z:Zr?rZ:z
z Grab all string input from the command line arguments.
: Duplicate this stack.
Z Print all elements in this stack as a string.
r Reverse (reverses an empty stack).
? Go right a stack.
r Reverse (reverses the input).
Z Print all elements in this stack as a string.
: Duplicate the stack (duplicates an empty stack).
z Grab all input from the command line (the command line arguments stack is already empty).
;print$_=<>,~~reverse;m;esrever~~,><=_$tnirp;
非常简单,print
输入($_=<>
)后跟reverse
。之所以reverse
返回,$_
是因为我们在标量上下文中使用前缀~~
。然后,我们匹配(m//
使用;
作为分隔符),在无效的情况下,对脚本的反向。
如果可以保证,我们将不必创建回文,esrever,><=_$tnirp
我们可以将代码缩短为43个字节:
g.print$_=<>,reverse.m.esrever,><=_$tnirp.g
echo -n 'neverod' | perl -e 'g.print$_=<>,reverse.m.esrever,><=_$tnirp.g'
neveroddoreven
包含25个字节的代码+ 1个-p
。
$_.=reverse;m;esrever=._$
我认为这是不正确的,因为它需要-p
我不认为可以轻易将其组合到脚本内容中以构成真正回文的标志。与上面几乎相同的调用,不同之处在于它依赖于以下事实:在幕后(在更新的Perls上)-p
添加了一个;
闭包m//
。
echo -n 'neverod' | perl -pe ';$_.=reverse;m;esrever=._$;'
neveroddoreven
我不是在使用“注释技巧”,而是在使用转义引号技巧。
"a\"};))''(nioj.)(esrever.)''(tilps.b(tacnoc.b nruter{)b(a noitcnuf";function a(b){return b.concat(b.split('').reverse().join(''));};"\a"
";
。;
在字符串中添加最后一个字符应该可以解决此问题。
p=>p+[...p].reverse().join``//``nioj.)(esrever.]p...[+p>=p
作为未命名的lambda,假定s
为string
[](auto s){decltype(s)r;for(auto c:s){r=c+r;}return s+r;}//};r+s nruter};r+c=r{)s:c otua(rof;r)s(epytlced{)s otua(][
旧解决方案:
[](auto s){auto r=s;for(auto p=s.rbegin()-1;++p!=s.rend();r+=*p);return r;}//};r nruter;)p*=+r;)(dner.s=!p++;1-)(nigebr.s=p otua(rof;s=r otua{)s otua(][
用法:
auto f=[](auto s){decltype(s)r;for(auto c:s){r=c+r;}return s+r;};
main(){
string a="123456789";
cout << f(a) << endl;
}
«q«Â
说明:
 # Bifurcate (short for Duplicate & Reverse) the (implicit) input
# i.e. "neverod" → "neverod" and "doreven"
« # Concat both together
# i.e. "neverod" and "doreven" → "neveroddoreven"
q # Exit the program (and implicitly output the concatted result)
«Â # No-ops
或者:
R«q«R
where R
是反向的,并且«
再次隐式地接受输入。
注意:如果允许我们neverodoreven
为input 输出neverod
仍然是回文的输入,则可以用1个字节来完成,而不用内置的palindromize:
û
80 39 00 48 8B D1 4C 8B C1 74 0B 48 FF C2 49 FF C0 80 3A 00 75 F5 48 FF CA 8A 02 41 88 00 48 8B C2 48 FF CA 49 FF C0 48 3B C1 77 ED C3 ED 77 C1 3B 48 C0 FF 49 CA FF 48 C2 8B 48 00 88 41 02 8A CA FF 48 F5 75 00 3A 80 C0 FF 49 C2 FF 48 0B 74 C1 8B 4C D1 8B 48 00 39 80
拆解:
0000000000000000: 80 39 00 cmp byte ptr [rcx],0
0000000000000003: 48 8B D1 mov rdx,rcx
0000000000000006: 4C 8B C1 mov r8,rcx
0000000000000009: 74 0B je 0000000000000016
000000000000000B: 48 FF C2 inc rdx
000000000000000E: 49 FF C0 inc r8
0000000000000011: 80 3A 00 cmp byte ptr [rdx],0
0000000000000014: 75 F5 jne 000000000000000B
0000000000000016: 48 FF CA dec rdx
0000000000000019: 8A 02 mov al,byte ptr [rdx]
000000000000001B: 41 88 00 mov byte ptr [r8],al
000000000000001E: 48 8B C2 mov rax,rdx
0000000000000021: 48 FF CA dec rdx
0000000000000024: 49 FF C0 inc r8
0000000000000027: 48 3B C1 cmp rax,rcx
000000000000002A: 77 ED ja 0000000000000019
000000000000002C: C3 ret
000000000000002D: ED in eax,dx
000000000000002E: 77 C1 ja FFFFFFFFFFFFFFF1
0000000000000030: 3B 48 C0 cmp ecx,dword ptr [rax-40h]
0000000000000033: FF 49 CA dec dword ptr [rcx-36h]
0000000000000036: FF 48 C2 dec dword ptr [rax-3Eh]
0000000000000039: 8B 48 00 mov ecx,dword ptr [rax]
000000000000003C: 88 41 02 mov byte ptr [rcx+2],al
000000000000003F: 8A CA mov cl,dl
0000000000000041: FF 48 F5 dec dword ptr [rax-0Bh]
0000000000000044: 75 00 jne 0000000000000046
0000000000000046: 3A 80 C0 FF 49 C2 cmp al,byte ptr [rax+FFFFFFFFC249FFC0h]
000000000000004C: FF 48 0B dec dword ptr [rax+0Bh]
000000000000004F: 74 C1 je 0000000000000012
0000000000000051: 8B 4C D1 8B mov ecx,dword ptr [rcx+rdx*8-75h]
0000000000000055: 48 00 39 add byte ptr [rcx],dil
0000000000000058: 80
请注意,ret
指令后面的代码2C
是无法访问的,因此不要说废话
êêêê
U.ê("ê".ê("ê")) Transpiled to JS
.ê("ê") String.ê(string): true if `this` is palindrome
"ê".ê("ê") true (treated same as 1)
U.ê( ) String.ê(number): palindromify
"abc"->"abccba" if `number` is odd, "abcba" otherwise
`true` is odd number, so we achieve the desired function
pwwp
U.p("w".w("p")) Transpiled to JS
"w".w( ) Reverse of "w" ("p" is ignored)
U.p("w") Append U.w(), which is reverse of U, to the right of U
iH~0}|{<:: oi]io ::<{|}0~Hi
与这里的许多解决方案不同,该解决方案实际上可以使用palindromised代码!
i 0 |{ Get the first character and enter the loop
: o Output the character while preserving it
i : Get input and duplicate it
<{ Turn around
] Increment the copy to check if EOF
}| < Loop again if not EOF
~ If EOF, pop the extra copy of EOF
H Terminate, printing the contents of the stack.
总共,未执行的指令是:
: i o : |}0~Hi