この課題に従って生成されたパリンドロームを考えると、パリンドロームを除去します。
テストケース
abcdedcba -> abcde
johncenanecnhoj -> johncena
ppapapp -> ppap
codegolflogedoc -> codegolf
これは脱パリンドロマイズに関するものなので、コードを回文にすることはできません。
これはcode-golfであるため、バイト数が最も少ないコードが優先されることに注意してください。
この課題に従って生成されたパリンドロームを考えると、パリンドロームを除去します。
abcdedcba -> abcde
johncenanecnhoj -> johncena
ppapapp -> ppap
codegolflogedoc -> codegolf
これは脱パリンドロマイズに関するものなので、コードを回文にすることはできません。
これはcode-golfであるため、バイト数が最も少ないコードが優先されることに注意してください。
回答:
電話でテストすることはできませんが、これは動作するはずです:
lambda s:s[:-~len(s)/2]
apt-get
に、電話で見つけることができる場合、それはおそらく通常の電話ではありません。
Dg;î£
説明:
D Duplicate
g;î Divide length by two and round up
£ First b letters of a
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
、配列要素間のコロンは暗黙的です
œs2Ḣ
œs2 Split input into 2 chunks of similar lengths. For odd-length input,
the first chunk is the longest
Ḣ Keep the first chunk
@2tr
@2 Split in half
t Take the second half
r Reverse it
入力の長さが奇数の場合、によって生成される後半@2
は、最も長いもの、つまり(逆にした後)返す必要があるものです。
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
ます。
~:0`!#v_\1+
0:-2,\_@#`
Befungeには文字列または配列型がないため、スタック上ですべてが1文字ずつ実行されます。最初のループ(一番上の行)は、読み取られた文字の数をカウントします(スタック内の2つ未満の要素と交換すると、最初の0が生成されます)。2番目(中央の行)は、2倍の速度でカウントダウンしながら文字を印刷します。その結果、入力の最後の半分のみが出力されますが、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
とても暗黙的に行います。
,
[
[>,]
<[<]
>.,>[>]
<<
]
これにより、メインループを開始する前に入力を消費するより単純なアプローチに比べて1バイト節約できます。
,[>,]
<
[
[<]
>.,>[>]
<,<
]
<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
Easterly Irkの回答からアイデアを借りる1バイトオフ(の1
代わりに追加.5
)
@StewieGriffinのおかげで2バイトオフ(不要な括弧)
@(x)x(1:end/2+1)