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.

Oliver Ni
sumber
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:

14

Julia, 21 15 byte

x->x[1:end/2+1]

Cobalah online! (kode tambahan untuk mencetak hasil)

Rɪᴋᴇʀ
sumber
2
end/2adalah fitur keren
Downgoat
@Downgoat ya, dennis menunjukkannya kepada saya.
Rɪᴋᴇʀ
12

05AB1E , 3 byte

2ä¬

Menggunakan pengkodean CP-1252 . Cobalah online!

Adnan
sumber
6

Python 2, 23 byte

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

lambda s:s[:-~len(s)/2]
Kade
sumber
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.

Rɪᴋᴇʀ
sumber
5

05AB1E, 5 byte

Dg;î£

Cobalah online!

Penjelasan:

D      Duplicate
 g;î   Divide length by two and round up
    £  First b letters of a
akrolit
sumber
5

Cheddar, 22 18 byte

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

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

Cobalah online

Downgoat
sumber
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)
Hedi
sumber
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"
susu
sumber
3

Haskell, 27 byte

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

Versi pointfree dari

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

yang juga 27 byte.

nimi
sumber
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]
Luis Mendo
sumber
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
Luis Mendo
sumber
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).

Fatalisasi
sumber
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.

Ton Hospel
sumber
3

Java 7, 57 byte

String c(String s){return s.substring(0,s.length()/2+1);}
Numberknot
sumber
Anda melewatkan penutupan }(jadi 57 byte).
Kevin Cruijssen
1
@KevinCruijssen diperbaiki.
Numberknot
2

TI-Basic, 14 byte

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

sub(Ans,1,.5+.5length(Ans
Timtech
sumber
2

Bahasa GameMaker, 59 byte

a=argument0 return string_copy(a,1,ceil(string_length(a)/2)
Timtech
sumber
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.

Titus
sumber
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.

Oliver Ni
sumber
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.

Denis Ibaev
sumber
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.

Linus
sumber
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.

Denis Ibaev
sumber
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:

,[>,]
<
[
  [<]
  >.,>[>]
  <,<
]
Mitch Schwartz
sumber
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 :-)

ElPedro
sumber
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

Sebenarnya , 5 byte

l½KßH

Cobalah online!

-1 byte terima kasih kepada Sherlock9

Penjelasan:

l½K@H
l½K    ceil(len(input)/2)
   ßH  first (len(input)//2 + 1) characters of input
Mego
sumber
6 byte:: ;l½K@HD
Sherlock9
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);
}
Karl Napf
sumber
@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

Python 2, 23 byte

lambda x:x[:len(x)/2+1]
Rɪᴋᴇʀ
sumber
Saya pikir ini membutuhkan Python 2; Anda harus menunjukkan bahwa dalam jawaban Anda
Luis Mendo
@LuisMendo oh, terima kasih!
Rɪᴋᴇʀ
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 .

Luis Mendo
sumber
@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