Depalindromize chuỗi này!


48

Đưa ra một palindrom được tạo ra theo thách thức này , làm mất giá trị của nó.

Các trường hợp thử nghiệm

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

Vì đây là về việc khử màu, mã của bạn không thể là một bảng màu .

Hãy nhớ rằng, đây là , vì vậy mã có ít byte nhất sẽ thắng.


23
-1 cho các hạn chế vô nghĩa đối với mã của bạn không phải là một bảng màu. Nó không thêm gì vào thách thức IMO, trong rất ít ngôn ngữ sẽ có vấn đề.
Rɪᴋᴇʀ

25
+1 cho hạn chế. Nó rất hay phản ánh thách thức paliondrom ... và nó đã thêm thách thức cho esolang. Tôi thích nó. Tôi có đúng trong giả định rằng đầu vào sẽ luôn có độ dài không đều?
Tít

42
Hạn chế không palindrom có ​​lẽ là một trò đùa dựa trên thử thách trước đó. Có ai thực sự downvote dựa trên điều đó?
Luis Mendo

5
Nó không ngăn chặn các giải pháp byte đơn. @diynevala +1 cho +1 không cần thiết.
Adám

5
Điều gì xảy ra nếu chuỗi không phải là một palindrom để bắt đầu?
Xavon_Wrentaile

Câu trả lời:




6

Python 2, 23 byte

Tôi không thể kiểm tra trên điện thoại của mình, nhưng điều này sẽ hoạt động:

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

2
Nếu bạn đang chạy trên Android, bạn có thể sử dụng QPython từ cửa hàng google play. Đó là thứ tốt nhất tôi tìm thấy :)
Yytsi

termux apt-get install python2
Matt

@Matt Đó là quá mức cần thiết nếu tất cả những gì bạn muốn là Python.
mbomb007

@Matt cũng như nếu bạn có thể tìm thấy apt-gettrên điện thoại của mình thì có lẽ đó không phải là một chiếc điện thoại bình thường.
Lười biếng hợp pháp

Termux @MathManiac được cài đặt từ Google Play trên bất kỳ điện thoại Android chưa root nào. Không thể nhận được nhiều hơn bình thường hơn thế.
Matt

6

Fuzzy Octo Guacamole, 4 byte

2.^/

Tôi đã dành một lúc để tìm kiếm một ngôn ngữ trong đó thử thách này ngắn và nhận ra tôi thật ngu ngốc và chính ngôn ngữ của tôi đã làm điều đó.





4

JavaScript (ES6), 32 26 25 byte

Lưu 1 byte nhờ Neil:

s=>s.slice(0,-s.length/2)


Các giải pháp trước đó
26 byte nhờ vào Downgoat:

s=>s.slice(0,s.length/2+1)

32 byte:

s=>s.slice(0,(l=s.length/2)+l%2)

1
Bạn có thể rút ngắn xuống chỉ vì s=>s.slice(0,s.length/2+1)chiều dài sẽ luôn là số lẻ
Downgoat

@Downgoat nhờ có bạn Tôi thấy rằng thêm một byte s=>s.slice(0,s.length/2+.5)cũng sẽ hoạt động với độ dài đồng đều.
Hedi

2
-s.length/2hoạt động cho cả chiều dài lẻ và chẵn.
Neil

4

WinDbg, 87 71 byte

db$t0 L1;.for(r$t1=@$t0;@$p;r$t1=@$t1+1){db$t1 L1};da$t0 L(@$t1-@$t0)/2

-16 byte bằng cách không chèn NULL, thay vào đó chuyển chiều dài cho da

Đầu vào được truyền qua một địa chỉ trong thanh ghi psuedo $t0. Ví dụ:

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.

Nó hoạt động bằng cách thay thế bên phải của char giữa (hoặc giữa bên phải nếu chuỗi có độ dài chẵn) bằng null và sau đó in chuỗi từ địa chỉ bộ nhớ bắt đầu ban đầu.

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

Đầu ra:

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 byte

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

Phiên bản miễn phí của

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

đó cũng là 27 byte.


3

MATL , 7 6 byte

9LQ2/)

Hãy thử trực tuyến!

Giải trình

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
Wow, đó là một cách rất gọn gàng để xử lý các giá trị phức tạp như các đối số cho cắt
dặm

@miles Cảm ơn! Vâng, nó rất tiện dụng. Đơn vị tưởng tượng hoạt động như endvà dấu hai chấm giữa các phần tử mảng được ẩn
Luis Mendo



3

Brachylog , 4 byte

@2tr

Hãy thử trực tuyến!

Giải trình

@2        Split in half
  t       Take the second half
   r      Reverse it

Nếu đầu vào có độ dài lẻ, nửa thứ hai được tạo bởi @2là đầu dài nhất, đó là đầu vào chúng ta nên trả về (sau khi đảo ngược nó).



3

Perl, 15 byte

Bao gồm +2 cho -lp

Đưa ra chuỗi đầu vào trên STDIN:

depal.pl <<< "HelleH"

depal.pl:

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

Điều -lnày không thực sự cần thiết nếu bạn nhập vào bảng màu mà không có dòng mới cuối cùng, nhưng tôi đã đưa nó vào để công bằng với các giải pháp perl khác sử dụng nó.


3

Java 7, 57 byte

String c(String s){return s.substring(0,s.length()/2+1);}

Bạn đang thiếu một đóng }(vì vậy nó là 57 byte).
Kevin Cruijssen

1
@KevinCruijssen cố định.
Numberjack

2

TI-Basic, 14 byte

Chức năng tiêu chuẩn. Trả về chuỗi từ chỉ mục 1 đến chỉ mục (chiều dài / 2 + 1/2).

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

2

Ngôn ngữ GameMaker, 59 byte

a=argument0 return string_copy(a,1,ceil(string_length(a)/2)

2

PHP, 40 byte

<?=substr($a=$argv[1],0,1+strlen($a)/2);

strlen($a)/2được truyền tới int, với đầu vào luôn có độ dài lẻ, +1đủ để làm tròn.

42 byte cho bất kỳ độ dài nào:

<?=substr($a=$argv[1],0,(1+strlen($a))/2);

cho chiều dài không xác định, (1+strlen)/2được cast đến int, làm tròn lên strlen/2.


Vì đầu vào được định nghĩa là đến từ điều này ( codegolf.stackexchange.com/questions/98325/ mẹo ) nên độ dài của nó sẽ luôn là số lẻ, vì vậy bạn chỉ cần đi với cái ngắn hơn của mình.
dùng59178

2

Nhúng, 8 byte

H{C'0ÏEI

Giải trình:

           # 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

Điều này có lẽ có thể được cải thiện nhiều.


2

Perl, 23 + 2 ( -plcờ) = 28 25 byte

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

Ung dung:

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

Thanx đến @ardnew.


1
bạn có thể lưu 3 ký tự bằng cách thay thế length()bằngy|||c
ardew

2

Befunge , 24 22 byte

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

Hãy thử trực tuyến!


Befunge không có kiểu chuỗi hoặc mảng nên mọi thứ được thực hiện trên stack một ký tự một lần. Vòng lặp đầu tiên (trên dòng trên cùng) đếm số lượng ký tự đã đọc (hoán đổi với ít hơn 2 phần tử trong ngăn xếp tạo ra 0 ban đầu). Cái thứ hai (trên dòng giữa) in các ký tự trong khi đếm ngược nhanh gấp đôi. Kết quả là chỉ có một nửa đầu vào cuối cùng được in, nhưng LIFO vì vậy nó theo đúng thứ tự.

Cảm ơn Brian Gradin cho phiên bản tốt hơn của vòng lặp đầu tiên.


1
Bạn đánh bại tôi nửa giờ và 7 byte :) befunge.tryitonline.net/ Kẻ
Brian Gradin

@BrianGradin, tốt đẹp. bây giờ tôi đã đánh bại bạn 9 byte;)
Linus

À, được rồi Tôi thấy những gì bạn đã làm. Tôi đã không đếm ngược đến hai lần thay vì tính số lượng ký tự thực tế để in. Hoàn thành tốt
Brian Gradin

2

Perl, 14 + 3 ( -lFcờ) = 19 17 byte

Đối với 5.20.0+:

perl -lF -E 'say@F[0..@F/2]'

Đối với 5.10.0+ (19 byte):

perl -nlaF -E 'say@F[0..@F/2]'

Ung dung:

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)]);
}

Thanx đến @simbabque.


2
Bạn có thể lưu hai byte, bạn không cần phải đặt -n-a-Fnó hoàn toàn như vậy.
simbabque

@simbabque Có. Nhưng chỉ dành cho 5.20.0+.
Denis Ibaev

2

Brainfuck, 20 byte

,
[
  [>,]
  <[<]
  >.,>[>]
  <<
]

Hãy thử trực tuyến.

Điều này tiết kiệm một byte theo cách tiếp cận đơn giản hơn là tiêu thụ đầu vào trước khi bắt đầu vòng lặp chính:

,[>,]
<
[
  [<]
  >.,>[>]
  <,<
]

2

Bình thường , 8 7 byte

<zh/lz2

Đã lưu 1 với lời cảm ơn @Steven H

Không phải là câu trả lời ngắn nhất của Pyth (một nửa) nhưng tôi đang nỗ lực để học ngôn ngữ và đây là bài viết đầu tiên của tôi sử dụng nó. Đăng càng nhiều cho ý kiến ​​và phản hồi như bất cứ điều gì. Đây cũng là chương trình Pyth đầu tiên mà tôi thực sự phải làm việc :)

Bây giờ tôi chỉ cần tìm ra cách trả lời 4 byte từ @Maltysen :-)


1
Nếu bạn vẫn muốn biết câu trả lời của Maltysen hoạt động như thế nào, nó sẽ cắt cđầu Qvào thành 2từng mảnh và lấy phần đầu tiên bằng cách sử dụng h(điều này, nhờ vào việc thực hiện Chop, cũng sẽ lấy chữ cái trung tâm). Đối với mã của bạn, bạn có thể thay thế +1bằng h, số tích hợp để tăng số.
Steven H.

Cảm ơn lời giải thích và cho hgợi ý @Steven H. Có rất nhiều công cụ tích hợp Tôi đoán rằng chỉ cần một chút thời gian để tìm thấy tất cả :)
ElPedro

1
Không vấn đề gì! Nếu bạn cần bất kỳ sự giúp đỡ nào, hãy thử đưa tôi vào byte thứ mười chín.
Steven H.


2

C, 31 30 byte

Tiết kiệm 1 byte nhờ Cyoce.

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

Sử dụng:

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

@KevinCruijssen đã sửa
Karl Napf

Xin chào, xin lỗi tôi đã xóa bình luận của tôi. Tôi đã đúng khi nói rằng nó sẽ không hoạt động cho cả palindromes. Nhưng, vì đây là mặt trái của thách thức khác đó, nên sẽ không có trường hợp thử nghiệm nào cho cả palindromes .. Xin lỗi về điều đó, bạn có thể hoàn tác thay đổi của mình. +1 từ tôi. :)
Kevin Cruijssen

2
Chà, bây giờ nó có cùng chiều dài, hoạt động cho chẵn + lẻ và trông golf hơn. Tôi ổn với điều này.
Karl Napf

Đây được cho là rò rỉ bộ nhớ :-)
ShreevatsaR

1
Tôi nghĩ bạn có thể xóa khoảng trống trongchar* c
Cyoce

1

Python 2, 23 byte

lambda x:x[:len(x)/2+1]

Tôi nghĩ rằng điều này đòi hỏi Python 2; bạn nên chỉ ra rằng trong câu trả lời của bạn
Luis Mendo

@LuisMendo oh, cảm ơn!
Rɪᴋᴇʀ

1

MATLAB / Octave, 20 19 18 16 byte

1.5Giảm 1 byte khi mượn ý tưởng từ câu trả lời của Easterly Irk (thêm thay vì )
2 byte nhờ @StewieGriffin (dấu ngoặc đơn không cần thiết)

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

Hãy thử nó tại Ideone .


@StewieGriffin Cảm ơn! Tôi không biết mình đang nghĩ gì ...
Luis Mendo

Tôi cũng không: P Không giống như đó là một "mánh khóe" mà bạn không biết ... Tôi cũng có một vài trong số đó :)
Stewie Griffin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.