给定根据此挑战生成的回文,请对其进行去盲化。
测试用例
abcdedcba -> abcde
johncenanecnhoj -> johncena
ppapapp -> ppap
codegolflogedoc -> codegolf
因为这是关于去palindromating的,所以您的代码不能是回文。
请记住,这是code-golf,所以字节最少的代码将获胜。
给定根据此挑战生成的回文,请对其进行去盲化。
abcdedcba -> abcde
johncenanecnhoj -> johncena
ppapapp -> ppap
codegolflogedoc -> codegolf
因为这是关于去palindromating的,所以您的代码不能是回文。
请记住,这是code-golf,所以字节最少的代码将获胜。
Answers:
我无法在手机上进行测试,但这应该可以:
lambda s:s[:-~len(s)/2]
apt-get
在手机上找到它,那可能不是普通的手机。
感谢Neil,节省了1个字节:
s=>s.slice(0,-s.length/2)
由于Downgoat,先前的解决方案有 26个字节:
s=>s.slice(0,s.length/2+1)
32个字节:
s=>s.slice(0,(l=s.length/2)+l%2)
s=>s.slice(0,s.length/2+1)
因为长度总是很奇怪
s=>s.slice(0,s.length/2+.5)
也可以使长度均匀。
-s.length/2
适用于奇数和偶数长度。
db$t0 L1;.for(r$t1=@$t0;@$p;r$t1=@$t1+1){db$t1 L1};da$t0 L(@$t1-@$t0)/2
不插入NULL,而是将长度传递给-16个字节 da
输入通过psuedo-register中的地址传递$t0
。例如:
eza 2000000 "abcdedcba" * Write string "abcdedcba" into memory at 0x02000000
r $t0 = 33554432 * Set $t0 = 0x02000000
* Edit: Something got messed up in my WinDB session, of course r $t0 = 2000000 should work
* not that crazy 33554432.
它的工作原理是将中间字符的右边(如果字符串的长度为偶数,则替换为中间字符的右边)为null,然后从原始的起始内存地址打印该字符串。
db $t0 L1; * Set $p = memory-at($t0)
.for (r $t1 = @$t0; @$p; r $t1 = @$t1 + 1) * Set $t1 = $t0 and increment until $p == 0
{
db $t1 L1 * Set $p = memory-at($t1)
};
da $t0 L(@$t1-@$t0)/2 * Print half the string
输出:
0:000> eza 2000000 "abcdeedcba"
0:000> r $t0 = 33554432
0:000> db$t0 L1;.for(r$t1=@$t0;@$p;r$t1=@$t1+1){db$t1 L1};da$t0 L(@$t1-@$t0)/2
02000000 61 a
02000000 61 a
02000001 62 b
02000002 63 c
02000003 64 d
02000004 65 e
02000005 65 e
02000006 64 d
02000007 63 c
02000008 62 b
02000009 61 a
0200000a 00 .
02000000 "abcde"
9LQ2/)
9L % Push array [1, 1j]
Q % Add 1: transforms into [2, 1+1j]
2/ % Divide by 2: transforms into [1, 0.5+0.5j]
) % Apply as index into implicit input. The array [1, 0.5+0.5j] used as an index
% is interpreted as [1:0.5+end*0.5]
end
,并且数组元素之间的冒号是隐式的
String c(String s){return s.substring(0,s.length()/2+1);}
}
(因此为57个字节)。
<?=substr($a=$argv[1],0,1+strlen($a)/2);
strlen($a)/2
被强制转换为int,并且输入始终具有奇数长度,+1
足以将其舍入。
任何长度的42个字节:
<?=substr($a=$argv[1],0,(1+strlen($a))/2);
对于未知长度,(1+strlen)/2
将其强制转换为int并四舍五入strlen/2
。
-pl
标志)= perl -ple '$_=substr$_,0,1+y///c/2'
取消高尔夫:
while (<>) { # -p flag
chomp($_) # -l flag
$_ = substr($_, 0, 1 + length($_) / 2);
print($_, "\n") # -pl flag
}
感谢@ardnew。
length()
为y|||c
~:0`!#v_\1+
0:-2,\_@#`
Befunge没有字符串或数组类型,因此所有操作一次只在堆栈上完成一个字符。第一个循环(在第一行)计算读取的字符数(交换堆栈中少于2个元素将产生一个初始0)。第二个(在中间一行)打印字符,同时倒数的速度是原来的两倍。结果,仅打印输入的最后一半,但是打印了LIFO,因此输入顺序正确。
感谢Brian Gradin为第一个循环提供了更好的版本。
-lF
标志)= 对于5.20.0+:
perl -lF -E 'say@F[0..@F/2]'
对于5.10.0+(19字节):
perl -nlaF -E 'say@F[0..@F/2]'
取消高尔夫:
while (<>) { # -n flag (implicitly sets by -F in 5.20.0+)
chomp($_) # -l flag
@F = split('', $_); # -aF flag (implicitly sets by -F in 5.20.0+)
say(@F[0 .. (scalar(@F) / 2)]);
}
感谢@simbabque。
-n
,-a
因为-F
这样做是隐式的。
,
[
[>,]
<[<]
>.,>[>]
<<
]
与在启动主循环之前使用输入的更直接方法相比,这节省了一个字节:
,[>,]
<
[
[<]
>.,>[>]
<,<
]
<zh/lz2
感谢@Steven H,节省了1
不是最短的Pyth答案(一半),但是我正在努力学习该语言,这是我第一次使用它。尽可能多地发表评论和反馈。这也是我真正开始工作的第一个Pyth程序:)
现在我只需要计算@Maltysen的4字节答案是如何工作的:-)
c
输入Q
分成2
几部分,并使用来提取第一部分h
(由于使用了chop的实现,它也将获取中心字母)。至于您的代码,您可以将替换+1
为h
,用于数字递增的内置函数。
h
@Steven H 的提示。有太多内置函数,我想找到它们都需要一些时间:)
由于Cyoce,节省了1个字节。
f(char*c){c[-~strlen(c)/2]=0;}
用法:
main(){
char a[]="hellolleh";
f(a);
printf("%s\n",a);
}
char* c
lambda x:x[:len(x)/2+1]
从@Easterly Irk的答案中借用一个想法1
.5
可以节省1个字节(添加而不是)
感谢@StewieGriffin(不需要的括号)可以减少2个字节
@(x)x(1:end/2+1)