Depalindromize string ini!


48

Mengingat palindrom dihasilkan sesuai dengan tantangan ini , depalindromize itu.

Uji kasus

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

Karena ini tentang depalindromizing, kode Anda tidak dapat berupa palindrom .

Ingat, ini adalah , jadi kode dengan byte paling sedikit menang.


23
-1 untuk batasan tidak berguna pada kode Anda yang tidak menjadi palindrom. Itu tidak menambah tantangan IMO, dalam sedikit bahasa akan penting.
R

25
+1 untuk batasan. Ini sangat mencerminkan tantangan paliondrome ... dan itu menambah tantangan bagi esolang. Saya suka itu. Apakah saya benar dengan asumsi bahwa input akan selalu memiliki panjang yang tidak rata?
Titus

42
Pembatasan non-palindrome mungkin adalah lelucon berdasarkan tantangan sebelumnya. Apakah ada yang benar-benar downvote berdasarkan itu?
Luis Mendo

5
Itu mencegah solusi byte tunggal. @diynevala +1 untuk +1 yang tidak perlu.
Adám

5
Bagaimana jika string tersebut bukan palindrome?
Xavon_Wrentaile

Jawaban:




6

Python 2, 23 byte

Saya tidak dapat menguji pada ponsel saya, tetapi ini harus bekerja:

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

2
Jika Anda menjalankan Android, Anda dapat menggunakan QPython dari google play store. Itu yang terbaik yang saya temukan :)
Yytsi

termux apt-get install python2
Matt

@ Matt Itu berlebihan jika yang Anda inginkan adalah Python.
mbomb007

@ Mat juga jika Anda dapat menemukannya apt-getdi ponsel Anda, itu mungkin bukan ponsel biasa.
Lawful Lazy

@MathManiac termux diinstal dari Google Play ke ponsel Android yang tidak di-root. Tidak bisa lebih normal dari itu.
Matt

6

Fuzzy Octo Guacamole, 4 byte

2.^/

Saya menghabiskan waktu mencari bahasa yang tantangannya singkat, dan menyadari bahwa saya bodoh dan bahasa saya sendiri yang melakukannya.



5

Cheddar, 22 18 byte

@.head($0.len/2+1)

Sederhananya saya pikir tidak perlu penjelasan tapi saya akan menambahkannya jika mau.

Cobalah online



4

JavaScript (ES6), 32 26 25 byte

1 byte disimpan berkat Neil:

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


Solusi sebelumnya
26 byte berkat Downgoat:

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

32 byte:

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

1
Anda dapat menyingkat menjadi hanya s=>s.slice(0,s.length/2+1)Karena panjang akan selalu aneh
Downgoat

@Downgoat terima kasih kepada Anda, saya menemukan bahwa untuk satu byte lagi s=>s.slice(0,s.length/2+.5)akan bekerja bahkan lebih lama.
Hedi

2
-s.length/2bekerja untuk panjang ganjil dan genap.
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 dengan tidak memasukkan NULL, sebagai ganti panjangnya da

Input diteruskan melalui alamat di psuedo-register $t0. Sebagai contoh:

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.

Ia bekerja dengan mengganti hak tengah char (atau kanan tengah jika string memiliki panjang genap) dengan nol dan kemudian mencetak string dari alamat memori awal yang asli.

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

Keluaran:

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

Versi pointfree dari

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

yang juga 27 byte.


3

MATL , 7 6 byte

9LQ2/)

Cobalah online!

Penjelasan

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, itu adalah cara yang sangat rapi untuk menangani nilai kompleks sebagai argumen untuk mengiris
mil

@miles, terima kasih! Ya itu berguna. Unit imajiner berfungsi sebagai end, dan titik dua antara elemen array adalah implisit
Luis Mendo

3

Jelly , 4 byte

œs2Ḣ

Cobalah online!

Penjelasan

œs2      Split input into 2 chunks of similar lengths. For odd-length input,
         the first chunk is the longest
   Ḣ     Keep the first chunk


3

Brachylog , 4 byte

@2tr

Cobalah online!

Penjelasan

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

Jika input memiliki panjang ganjil, babak kedua yang dihasilkan oleh @2adalah yang paling panjang, yang harus kita kembalikan (setelah membalikkannya).



3

Perl, 15 byte

Termasuk +2 untuk -lp

Berikan string input pada STDIN:

depal.pl <<< "HelleH"

depal.pl:

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

Ini -ltidak benar-benar diperlukan jika Anda memasukkan palindrome tanpa baris baru, tetapi saya memasukkannya agar adil dengan solusi perl lainnya yang menggunakannya.



2

TI-Basic, 14 byte

Fungsi standar. Mengembalikan string dari indeks 1 ke indeks (panjang / 2 + 1/2).

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

2

Bahasa 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)/2di-cast ke int, dengan input selalu memiliki panjang ganjil, +1cukup untuk dibulatkan.

42 byte untuk panjang apa pun:

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

untuk panjang tidak diketahui, (1+strlen)/2mendapat dilemparkan ke int, pembulatan ke atas strlen/2.


Karena input didefinisikan berasal dari tantangan ini ( codegolf.stackexchange.com/questions/98325/… ), panjangnya akan selalu aneh, jadi Anda bisa memilih yang lebih pendek.
user59178

2

Dip, 8 byte

H{C'0ÏEI

Penjelasan:

           # 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

Ini mungkin bisa lebih ditingkatkan.


2

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

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

Tidak Disatukan:

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

Terima kasih kepada @ardnew.


1
Anda dapat menyimpan 3 karakter dengan mengganti length()dengany|||c
ardnew

2

Befunge , 24 22 byte

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

Cobalah online!


Befunge tidak memiliki tipe string atau array sehingga semuanya dilakukan pada stack satu karakter sekaligus. Loop pertama (pada baris atas) menghitung jumlah karakter yang dibaca (bertukar dengan kurang dari 2 elemen dalam tumpukan menghasilkan awal 0). Yang kedua (di garis tengah) mencetak karakter sambil menghitung mundur dua kali lebih cepat. Akibatnya hanya setengah dari input yang dicetak, tetapi LIFO jadi dalam urutan yang benar.

Terima kasih kepada Brian Gradin untuk versi yang lebih baik dari loop pertama.


1
Anda mengalahkan saya setengah jam dan 7 byte :) befunge.tryitonline.net/...
Brian Gradin

@BrianGradin, bagus. sekarang saya telah mengalahkan mengalahkan Anda dengan 9 byte;)
Linus

Ah, baiklah. Saya melihat apa yang Anda lakukan. Tidak terpikir oleh saya untuk menghitung mundur dua daripada menghitung jumlah karakter yang sebenarnya untuk dicetak. Bagus sekali.
Brian Gradin

2

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

Untuk 5.20.0+:

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

Untuk 5.10.0+ (19 byte):

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

Tidak Disatukan:

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

Terima kasih kepada @simbabque.


2
Anda dapat menyimpan dua byte, Anda tidak perlu mengatur -ndan -akarena -Fmelakukannya secara implisit.
simbabque

@sababque Ya. Tetapi hanya untuk 5.20.0+.
Denis Ibaev

2

Brainfuck, 20 byte

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

Cobalah online.

Ini menghemat satu byte dari pendekatan yang lebih mudah dalam mengonsumsi input sebelum memulai loop utama:

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

2

Pyth , 8 7 byte

<zh/lz2

Disimpan 1 dengan berkat @Steven H

Bukan jawaban Pyth terpendek (setengah) tapi saya berusaha untuk mempelajari bahasa dan ini adalah posting pertama saya menggunakannya. Diposting sebanyak-banyaknya untuk komentar dan umpan balik seperti apa pun. Ini juga program Pyth pertama yang benar-benar harus saya kerjakan :)

Sekarang saya hanya perlu mencari tahu bagaimana jawaban 4 byte dari @Maltysen bekerja :-)


1
Jika Anda masih ingin tahu cara kerja jawaban Maltysen, ia cakan memasukkan input Qmenjadi beberapa 2bagian dan menggunakan bagian pertama h(yang, berkat penerapan chop, akan mengambil huruf tengah juga). Adapun kode Anda, Anda bisa mengganti +1dengan h, built-in untuk angka yang bertambah.
Steven H.

Terima kasih atas penjelasannya dan untuk hpetunjuknya @ Sebelas H. Ada begitu banyak built-in, saya kira hanya perlu beberapa waktu untuk menemukan semuanya :)
ElPedro

1
Tidak masalah! Jika Anda membutuhkan bantuan, coba ping saya di byte kesembilan belas.
Steven H.


2

C, 31 30 byte

Menyimpan 1 byte berkat Cyoce.

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

Pemakaian:

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

@KevinCruijssen diperbaiki
Karl Napf

Hai, maaf saya menghapus komentar saya. Saya benar mengatakan itu tidak akan berhasil bahkan untuk palindrom. Tapi, karena ini adalah kebalikan dari tantangan lain itu, tidak akan ada kasus uji untuk palindrom bahkan .. Maaf tentang itu, Anda dapat membatalkan perubahan Anda. +1 dari saya. :)
Kevin Cruijssen

2
Yah, ia memiliki panjang yang sama sekarang, bekerja untuk genap + aneh dan terlihat lebih golf. Saya baik-baik saja dengan ini.
Karl Napf

Ini bisa dibilang kebocoran memori :-)
ShreevatsaR

1
Saya pikir Anda dapat menghapus ruang dichar* c
Cyoce


1

MATLAB / Oktaf, 20 19 18 16 byte

1 byte off meminjam ide dari jawaban Easterly Irk (tambahkan 1bukannya .5)
2 byte off berkat @StewieGriffin (tanda kurung yang tidak perlu)

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

Cobalah di Ideone .


@StewieGriffin Terima kasih! Saya tidak tahu apa yang saya pikirkan ...
Luis Mendo

Aku juga: P Ini bukan "tipuan" yang tidak kau ketahui ... Aku juga punya beberapa :) :)
Stewie Griffin
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.