Depalindromize bu dize!


48

Bu zorluğa göre oluşturulan bir palindrom verildiğinde , onu depalindromize edin.

Test durumları

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

Bu, depalindromizing hakkında olduğu için, kodunuz bir palindrome olamaz .

Unutmayın, bu , bu yüzden en az bayt olan kod kazanır.


23
Kodunuzdaki anlamsız kısıtlama için -1, bir palindrom olmamalıdır. IMO’nun mücadelesine hiçbir şey katmıyor, çok az dilde bunun önemi var.
Kasım’da

25
Kısıtlama için +1. Paliondrome meydan okumasını yansıtıyor ... ve esolanjanslara meydan okuyor. Bunu sevdim. Girişin daima eşit olmayan bir uzunluğa sahip olacağı varsayımında doğru muyum?
Titus

42
Palindrom olmayan kısıtlama muhtemelen önceki mücadeleye dayanan bir şakadır. Gerçekten buna dayanan kimse yok mu?
Luis Mendo,

5
Tek baytlık çözümleri önler. Gereksiz + 1 için @diynevala +1.
Adám

5
Dize başlamak için bir palindrome değilse ne olur?
Xavon_Wrentaile

Yanıtlar:




6

Python 2, 23 bayt

Telefonumda test edemiyorum, ancak bu çalışmalı:

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

2
Eğer android üzerinde çalışıyorsanız, google play store'dan QPython'u kullanabilirsiniz. Bulduğum en iyisi :)
Yytsi

termux apt-get install python2
Matt

@Matt Tek istediğin Python ise, bu çok üzücü.
mbomb007

@Matt hem de apt-gettelefonunuzda bulabiliyorsanız , muhtemelen normal bir telefon değildir.
Lawy Lazy

@MathManiac termux, Google Play'den köklü olmayan herhangi bir Android telefona yüklenir. Bundan daha normal olamaz.
Matt

6

Bulanık Octo Guacamole, 4 bayt

2.^/

Bir süre boyunca bu zorluğun kısa olduğu bir dili aradım ve aptal olduğumu fark ettim ve kendi dilimi yaptım.





4

JavaScript (ES6), 32 26 25 bayt

Neil sayesinde 1 bayt kurtarıldı:

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


Önceki çözümler
Downgoat sayesinde 26 bayt:

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

32 bayt:

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

1
Sadece kısaltabilirsiniz, s=>s.slice(0,s.length/2+1)çünkü uzunluk her zaman tuhaf olacaktır
Downgoat

@Downgoat senin sayende bir bayt s=>s.slice(0,s.length/2+.5)için daha uzun süre çalışacağını öğrendim .
Hedi

2
-s.length/2tek ve hatta uzunlukları için çalışır.
Neil

4

WinDbg, 87 71 bayt

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

-16 bayt NULL takmadan, bunun yerine uzunluğu geçerek da

Giriş, psuedo-register'da bir adres aracılığıyla iletilir $t0. Örneğin:

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.

Orta karakterin sağını (veya dizenin uzunluğu eşitse sağ orta) boş bırakarak çalışır ve ardından dizeyi özgün başlangıç ​​bellek adresinden yazdırır.

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

Çıktı:

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 bayt

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

Noktasız versiyonu

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

bu da 27 bayttır.


3

MATL , 7 6 bayt

9LQ2/)

Çevrimiçi deneyin!

açıklama

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
Vay canına, bu karmaşık değerleri dilimleme argümanları olarak ele almanın çok zarif bir yoludur
mil

@miles Teşekkürler! Evet, kullanışlı. Hayali birim gibi çalışır endve dizi elemanları arasındaki
Luis Mendo



3

Brachylog , 4 bayt

@2tr

Çevrimiçi deneyin!

açıklama

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

Girdinin tek uzunluğu varsa, oluşturulan ikinci yarı @2en uzun olandır, geri döndürmemiz gerekir (tersine çevirdikten sonra).



3

Perl, 15 bayt

İçin +2 içerir -lp

STDIN'de giriş dizesini verin:

depal.pl <<< "HelleH"

depal.pl:

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

-lEğer giriş nihai yeni satır olmadan palindrom, ancak bunu kullanan diğer perl çözümlerine adil olmak eklediyse gerçekten gerekli değildir.



2

TI-Basic, 14 bayt

Standart işlev Dizeyi dizin 1'den dizine döndürür (uzunluk / 2 + 1/2).

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

2

GameMaker Dili, 59 bayt

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

2

PHP, 40 bayt

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

strlen($a)/2int atar, giriş her zaman tek uzunlukta olur, +1yuvarlama yeterlidir.

Herhangi bir uzunluk için 42 bayt :

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

bilinmeyen uzunluk (1+strlen)/2için, yuvarlama, int attı strlen/2.


Girdi, bundan geldiği gibi tanımlandığı için ( codegolf.stackexchange.com/questions/98325/… ) mücadelesinin uzunluğu her zaman tuhaf olacaktır, bu nedenle kısa olanınızla devam edebilirsiniz.
user59178

2

Dip, 8 bayt

H{C'0ÏEI

Açıklama:

           # 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

Bu muhtemelen çok daha iyi olabilirdi.


2

Perl, 23 + 2 ( -plbayrak) = 28 25 bayt

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

Ungolfed:

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

@Ardnew için teşekkürler.


1
length()ile değiştirerek 3 karakter y|||c
kazanabilirsiniz

2

Befunge , 24 22 bayt

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

Çevrimiçi deneyin!


Befunge'nin dize ya da dizi türü yoktur, böylece her şey bir seferde bir karakterde yapılır. İlk döngü (en üst satırda) okunan karakter sayısını sayar (yığında 2'den az eleman ile yer değiştirerek ilk 0 üretilir). İkincisi (orta satırda) iki kat daha hızlı geri sayırken karakterleri yazdırır. Sonuç olarak, girişin sadece son yarısı yazdırılır, ancak LIFO bu nedenle doğru sıradadır.

İlk döngünün daha iyi bir sürümü için Brian Gradin'e teşekkürler .


1
Beni yarım saat ve 7 byte ile yendin
Brian Gradin

@ BrianGradin, güzel. şimdi seni 9 byte
Linus

Ah tamam. Ne yaptığını anladım. Yazdırılacak gerçek karakter sayısını hesaplamak yerine, iki ile geri saymak benim başıma gelmedi. Güzel bitti.
Brian Gradin

2

Perl, 14 + 3 ( -lFbayrak) = 19 17 bayt

5.20.0+ için:

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

5.10.0+ (19 bayt) için:

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

Ungolfed:

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'tan @simbabque'a.


2
İki bayt kaydedebilir, sette gerekmez -nve -açünkü -Fböylece örtülü olarak yapar.
simbabque,

@simbabque Evet. Ancak sadece 5.20.0+ için.
Denis İbaev

2

Brainfuck, 20 bayt

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

Çevrimiçi deneyin.

Bu, ana döngüye başlamadan önce girdiyi tüketmenin daha basit yaklaşımı üzerinden bir bayt kazandırır:

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

2

Pyth , 8 7 bayt

<zh/lz2

@Steven H sayesinde 1 kişi kaydedildi

En kısa Pyth cevabı değil (yarı yarıya) ancak dili öğrenmek için çaba harcıyorum ve bu onu kullanan ilk görevim. Yorumlarınız ve her şey için geribildirim için çok gönderildi. Aynı zamanda çalışmam gereken ilk Pyth programı :)

Şimdi, @Maltysen'den gelen 4 baytlık cevabın nasıl çalıştığını bulmam gerekiyor.


1
Hala Maltysen cevabı nasıl çalıştığını bilmek istiyorsanız, bu cgirdi atlamaları Qiçine 2parçaları ve kullanan ilk parçayı alır h(pirzola uygulanmasında, hem de merkez mektubu çekecek, teşekkürler). Kodunuzdaki gelince, yerini alabilir +1ile h, dahili numaralar artırma için.
Steven H.

Açıklama ve hipucu için @ Steven H için teşekkürler. Çok fazla yerleşik var sanırım hepsini bulmak biraz zaman alır :)
ElPedro

1
Sorun değil! Yardıma ihtiyacın olursa, beni On dokuzuncu bayta bölmeyi dene.
Steven H.


2

Cı, 31 , 30 bayt

Cyoce sayesinde 1 byte tasarrufu.

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

Kullanımı:

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

@KevinCruijssen sabit
Karl Napf

Merhaba üzgünüm yorumumu sildim. Palindromlar için bile işe yaramayacağını söylerken haklıydım. Ancak, bu diğer zorluğun tersi olduğundan, palindromlar için bile herhangi bir test vakası olmayacak. Üzgünüm, değişikliklerinizi geri alabilirsiniz. Benden +1. :)
Kevin Cruijssen

2
Eh, şimdi aynı uzunluğa sahip, hatta + tek için çalışır ve golfçü görünüyor. Bununla ilgili sorunum yok.
Karl Napf

Bu tartışmasız bir bellek sızıntısıdır :-)
ShreevatsaR

1
char* c
İçindeki


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.