この文字列をdepalindromize!


48

この課題に従って生成されたパリンドロームを考えると、パリンドロームを除去します。

テストケース

abcdedcba -> abcde
johncenanecnhoj -> johncena
ppapapp -> ppap
codegolflogedoc -> codegolf

これは脱パリンドロマイズに関するものなので、コードを回文にすることはできません

これはであるため、バイト数が最も少ないコードが優先されることに注意してください。


23
コードが回文ではないという無意味な制限のために-1。IMOの課題には何も追加されません。ごく少数の言語で問題になります。
Rɪᴋᴇʀ

25
制限については+1。それは、パリオドロームの挑戦を非常に反映しています...そして、それはエソランに挑戦を加えています。私はそれが好きです。入力の長さは常に不均等であるという仮定で正しいですか?
タイタス

42
非パリンドロームの制限は、おそらく以前の課題に基づいた冗談です。誰もがそれに基づいて本当に投票しましたか?
ルイスメンドー

5
シングルバイトソリューションを防ぎます。不要な+1は@diynevala +1。
アダム・

5
文字列がパリンドロームではない場合はどうなりますか?
-Xavon_Wrentaile

回答:




6

Python 2、23バイト

電話でテストすることはできませんが、これは動作するはずです:

lambda s:s[:-~len(s)/2]

2
Androidで実行している場合は、Google PlayストアからQPythonを使用できます。それは私が見つけた最高です:)
Yytsi

termux- apt-get install python2
マット

@Matt Pythonだけが必要な場合、それはやり過ぎです。
mbomb007

@Mattと同様apt-getに、電話で見つけることができる場合、それはおそらく通常の電話ではありません。
合法的なレイジー

@MathManiac termuxは、Google Playからルート化されていないAndroidスマートフォンにインストールされます。それよりもはるかに正常になることはできません。
マット

6

ファジーオクトワカモレ、4バイト

2.^/

私はこの課題が短い言語を探すのにしばらく時間を費やしました。





4

JavaScript(ES6)、32 26 25バイト

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)

1
短くすることができます。s=>s.slice(0,s.length/2+1)長さは常に奇数であるため
Downgoat

@Downgoatのおかげで、もう1バイトs=>s.slice(0,s.length/2+.5)でも同じ長さで動作することがわかりました。
エディ

2
-s.length/2奇数と偶数の両方の長さで機能します。
ニール

4

WinDbg、87 71バイト

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"

3

Haskell、27バイト

take=<<succ.(`div`2).length

のポイントフリー版

\x->take(div(length x)2+1)x

これも27バイトです。


3

MATL7 6バイト

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]

1
うわー、それはスライスの引数として複雑な値を処理する非常にきれいな方法です
マイル

@milesありがとう!はい、便利です。架空の単位はとして機能しend、配列要素間のコロンは暗黙的です
ルイスメンドー





3

Perl、15バイト

+2を含む -lp

STDINに入力文字列を与えます:

depal.pl <<< "HelleH"

depal.pl

#!/usr/bin/perl -lp
s/../chop/reg

-l最終改行なしで回文を入力する場合、これは実際には必要ありませんが、それを使用する他のperlソリューションに公平になるように含めました。



2

TI-Basic、14バイト

標準機能。インデックス1からインデックスまでの文字列を返します(長さ/ 2 + 1/2)。

sub(Ans,1,.5+.5length(Ans


2

PHP、40バイト

<?=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ます。


入力は、この(codegolf.stackexchange.com/questions/98325/…)チャレンジから来るものとして定義されているため、その長さは常に奇数であるため、短いものを使用できます。
user59178

2

ディップ、8バイト

H{C'0ÏEI

説明:

           # Implicit input
 H         # Push length of input
  {        # Add 1
   C       # Divide by 2
    '      # Convert to int
     0Ï    # Get string back
       E   # Push prefixes of string
        I  # Push prefixes[a]
           # Implicit print

これはおそらく大幅に改善される可能性があります。


2

Perl、23 + 2(-plフラグ)= 28 25バイト

perl -ple '$_=substr$_,0,1+y///c/2'

ゴルフをしていない:

while (<>) {             # -p flag
    chomp($_)            # -l flag
    $_ = substr($_, 0, 1 + length($_) / 2);
    print($_, "\n")      # -pl flag
}

@ardnewに感謝します。


1
あなたは置き換えることにより、3つの文字を保存することができlength()y|||c
ardnew

2

Befunge24 22バイト

~:0`!#v_\1+
0:-2,\_@#`

オンラインでお試しください!


Befungeには文字列または配列型がないため、スタック上ですべてが1文字ずつ実行されます。最初のループ(一番上の行)は、読み取られた文字の数をカウントします(スタック内の2つ未満の要素と交換すると、最初の0が生成されます)。2番目(中央の行)は、2倍の速度でカウントダウンしながら文字を印刷します。その結果、入力の最後の半分のみが出力されますが、LIFOは正しい順序で出力されます。

最初のループのより良いバージョンを提供してくれたBrian Gradinに感謝します。


1
あなたは私を30分7バイト倒しました:) befunge.tryitonline.net/…–
ブライアン・

@BrianGradin、いいね。今、私はあなたを9バイト倒しました;)
ライナス

ああ、わかった。私はあなたがしたことを見る。実際に印刷する文字数を計算するのではなく、2カウントダウンすることはありませんでした。よくできました。
ブライアングラディン

2

Perl、14 + 3(-lFフラグ)= 19 17バイト

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に感謝します。


2
あなたは2つのバイトを保存することができ、あなたが設定する必要はありません-n-aためには、-Fとても暗黙的に行います。
シンバク

@simbabqueはい。ただし、5.20.0以降のみ。
デニスイバエフ16年


2

Pyth8 7バイト

<zh/lz2

@Steven Hのおかげで1を保存しました

最短のPyth回答(半分)ではありませんが、私は言語を学ぶ努力をしており、これはそれを使用する最初の投稿です。コメントやフィードバックのために何でも投稿してください。また、私が実際に仕事を始めた最初のPythプログラムでもあります:)

ここで、@ Maltysenからの4バイトの応答がどのように機能するかを調べる必要があります:-)


1
それでもMaltysenの答えがどのように機能するかを知りたい場合はc、入力Q2断片にホップし、最初の断片を使用してh取得します(chopの実装のおかげで、中央の文字も取得します)。あなたのコードについては、あなたは置き換えることができ+1h、内蔵の数字をインクリメントします。
スティーブン

説明とhヒント@Steven Hに感謝します。非常に多くのビルトインがあり、それらすべてを見つけるのに少し時間がかかると思います:)
ElPedro

1
問題ありません!ヘルプが必要な場合は、19番目のバイトでpingを実行してください。
スティーブンH.


2

C、31 30バイト

Cyoceのおかげで1バイト節約できます。

f(char*c){c[-~strlen(c)/2]=0;}

使用法:

main(){
 char a[]="hellolleh";
 f(a);
 printf("%s\n",a);
}

@KevinCruijssen修正
カールナップ

こんにちは、コメントを削除して申し訳ありません。パリンドロームでも機能しないと言ったのは正しかった。しかし、これは他の課題の逆であるため、回文でもテストケースはありません。私から+1。:)
ケビンクルーッセン

2
さて、同じ長さで、偶数+奇数で機能し、ゴルファーに見えます。これでいいです。
カールナップ

これは間違いなくメモリリークです:-)
ShreevatsaR

1
でスペースを削除できると思いますchar* c
チョイス


1

MATLAB /オクターブ、20 19 18 16バイト

Easterly Irkの回答からアイデアを借りる1バイトオフ(の1代わりに追加.5
@StewieGriffinのおかげで2バイトオフ(不要な括弧)

@(x)x(1:end/2+1)

Ideoneでお試しください


@StewieGriffinありがとう!私は私が...考えていたかわからない
ルイス・Mendo

私も:Pそれはあなたが知らなかった「トリック」のようではない...私もそれらのいくつかを持っていた:)
Stewieグリフィン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.