ลดความน่าเชื่อถือของสตริงนี้!


48

เมื่อสร้าง Palindrome ตามความท้าทายนี้ให้ลดระดับความดัง

กรณีทดสอบ

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

เช่นนี้เป็นเรื่องเกี่ยวกับ depalindromizing, รหัสของคุณไม่สามารถเป็นประโยค

โปรดจำไว้ว่านี่คือดังนั้นโค้ดที่มีจำนวนไบต์น้อยที่สุดจะเป็นผู้ชนะ


23
-1 สำหรับข้อ จำกัด ที่ไม่มีจุดสิ้นสุดในรหัสของคุณไม่ใช่แบบสี มันไม่ได้เป็นการเพิ่มความท้าทายของ IMO ในภาษาเพียงไม่กี่ภาษา
Rɪᴋᴇʀ

25
+1 สำหรับข้อ จำกัด มันสะท้อนให้เห็นถึงความท้าทาย Paliondrome ... และมันเพิ่มความท้าทายให้กับ esolangs ฉันชอบมัน. ฉันถูกต้องในสมมติฐานที่ว่าอินพุตจะมีความยาวไม่สม่ำเสมอหรือไม่?
ติตัส

42
ข้อ จำกัด ที่ไม่ใช่ palindrome อาจเป็นเรื่องตลกตามความท้าทายที่ผ่านมา มีใคร downvote จริง ๆ ตามที่?
Luis Mendo

5
มันจะป้องกันการแก้ปัญหาไบต์เดียว @diynevala +1 สำหรับ +1 ที่ไม่จำเป็น
Adám

5
ถ้าสตริงไม่ใช่ Palindrome เริ่มต้นด้วยล่ะ?
Xavon_Wrentaile

คำตอบ:




6

Python 2, 23 ไบต์

ฉันไม่สามารถทดสอบบนโทรศัพท์ของฉันได้ แต่สิ่งนี้ควรใช้งานได้:

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

2
หากคุณใช้ Android คุณสามารถใช้ QPython จาก google play store มันเป็นสิ่งที่ดีที่สุดที่ฉันได้พบ :)
Yytsi

termux apt-get install python2
Matt

@Matt นั้นเกินความจริงหากคุณต้องการเพียง Python
mbomb007

@ แมทและถ้าคุณสามารถหาapt-getบนโทรศัพท์ของคุณมันอาจจะไม่ใช่โทรศัพท์ธรรมดา
Lazy ถูกกฎหมาย

@MathManiac termux ติดตั้งจาก Google Play ไปยังโทรศัพท์ Android ที่ไม่ได้รูทใด ๆ ไม่สามารถรับมากกว่าปกติมาก
แมตต์

6

Fuzzy Octo Guacamole, 4 ไบต์

2.^/

ฉันใช้เวลาสักครู่เพื่อค้นหาภาษาที่ความท้าทายนี้สั้นและฉันก็รู้ว่าตัวเองโง่และภาษาของฉันก็ทำเช่นนั้น





4

JavaScript (ES6), 32 26 25 ไบต์

บันทึก 1 ไบต์ขอบคุณ Neil:

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


โซลูชันก่อนหน้า
26 ไบต์ด้วย Downgoat:

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

@ ลงมือขอบคุณคุณฉันพบว่าอีกหนึ่งไบต์s=>s.slice(0,s.length/2+.5)จะทำงานได้แม้ในความยาว
Hedi

2
-s.length/2ใช้งานได้ทั้งความยาวคี่และคู่
Neil

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

-16 ไบต์โดยไม่ใส่ NULL แทนผ่านความยาวไป da

$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

MATL , 7 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และทวิภาคระหว่างองค์ประกอบของอาร์เรย์มีความหมายโดยนัย
Luis Mendo



3

Brachylogขนาด 4 ไบต์

@2tr

ลองออนไลน์!

คำอธิบาย

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

หากอินพุตมีความยาวคี่ครึ่งที่สองที่สร้างโดย@2คืออันที่ยาวที่สุดนั่นคืออันที่เราควรกลับมา (หลังจากกลับด้าน)



3

Perl, 15 ไบต์

รวมถึง +2 สำหรับ -lp

ให้สตริงที่ป้อนใน STDIN:

depal.pl <<< "HelleH"

depal.pl:

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

-lไม่จำเป็นจริงๆถ้าคุณป้อน palindrome โดยไม่ต้องขึ้นบรรทัดสุดท้าย แต่ผมรวมไว้เพื่อความเป็นธรรมกับการแก้ Perl อื่น ๆ ที่ใช้มัน



2

TI-Basic, 14 ไบต์

ฟังก์ชั่นมาตรฐาน ส่งคืนสตริงจากดัชนี 1 ถึงดัชนี (length / 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

Dip, 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 bytes

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

Ungolfed:

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

Thanx ถึง @ardnew


1
คุณสามารถบันทึก 3 ตัวอักษรโดยแทนที่length()ด้วยy|||c
ardnew

2

Befunge , 24 22 ไบต์

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

ลองออนไลน์!


Befunge ไม่มีสตริงหรือประเภทอาเรย์ดังนั้นทุกอย่างจะถูกทำบนสแต็กทีละตัวอักษร ลูปแรก (บนบรรทัดบนสุด) นับจำนวนอักขระที่อ่าน (การสลับที่มีอิลิเมนต์น้อยกว่า 2 องค์ประกอบในสแต็กจะสร้าง 0 เริ่มต้น) ที่สอง (บนเส้นกลาง) พิมพ์อักขระขณะที่นับถอยหลังสองครั้งเร็ว ดังนั้นจะพิมพ์เฉพาะครึ่งสุดท้ายของอินพุต แต่ LIFO จึงอยู่ในลำดับที่ถูกต้อง

ขอบคุณBrian Gradinสำหรับวงวนแรกที่ดีกว่า


1
คุณเอาชนะฉันครึ่งชั่วโมงและ 7 ไบต์ :) befunge.tryitonline.net/…
Brian Gradin

@BrianGradin ดี ตอนนี้ฉันเอาชนะคุณได้ 9 bytes;)
Linus

อาโอเค. ฉันเห็นสิ่งที่คุณทำ ฉันไม่ได้นับลงสองตัวแทนที่จะคำนวณจำนวนตัวอักษรที่จะพิมพ์จริง ทำได้ดีมาก
Brian Gradin

2

Perl, 14 + 3 ( -lFตั้งค่าสถานะ) = 19 17 bytes

สำหรับ 5.20.0+:

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

สำหรับ 5.10.0+ (19 ไบต์):

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 ถึง @simbabque


2
คุณสามารถบันทึกสองไบต์คุณไม่จำเป็นต้องตั้งค่า-nและ-aเนื่องจากเป็น-Fเช่นนั้นโดยปริยาย
simbabque

@simbabque ใช่ แต่สำหรับ 5.20.0+ เท่านั้น
Denis Ibaev

2

Brainfuck, 20 ไบต์

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

ลองออนไลน์

วิธีนี้จะช่วยประหยัดไบต์ในการเข้าถึงอินพุตที่ตรงไปตรงมามากขึ้นก่อนที่จะเริ่มวนรอบหลัก:

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

2

Pyth , 8 7 ไบต์

<zh/lz2

บันทึก 1 ด้วยขอบคุณ @Steven H

ไม่ใช่คำตอบ Pyth ที่สั้นที่สุด (ครึ่งหนึ่ง) แต่ฉันพยายามที่จะเรียนรู้ภาษาและนี่เป็นโพสต์แรกที่ฉันใช้ โพสต์มากสำหรับความคิดเห็นและข้อเสนอแนะเป็นอะไร นอกจากนี้ยังเป็นโปรแกรม Pyth แรกที่ฉันต้องทำงานจริง ๆ :)

ตอนนี้ฉันแค่ต้องคิดออกว่าคำตอบ 4 ไบต์จาก @Maltysen ทำงานอย่างไร :-)


1
ถ้าคุณยังต้องการที่จะรู้ว่าคำตอบ Maltysen ทำงานก็cกระโดดป้อนข้อมูลQลงใน2ชิ้นและใช้ชิ้นแรกที่ใช้h(ซึ่งต้องขอบคุณการดำเนินงานของสับจะคว้าตัวอักษรศูนย์เช่นกัน) สำหรับรหัสของคุณคุณสามารถแทนที่+1ด้วยhในตัวสำหรับการเพิ่มจำนวน
Steven H.

ขอบคุณสำหรับคำอธิบายและสำหรับhคำใบ้ @Steven เอชมีจำนวนมากดังนั้นการสร้างอินผมคิดว่ามันก็ต้องใช้เวลาในการหาพวกเขาทั้งหมด :)
ElPedro

1
ไม่มีปัญหา! หากคุณต้องการความช่วยเหลือใด ๆ ลอง pking ฉันในไบต์ที่สิบเก้า
Steven H.


2

C, 31 30 ไบต์

บันทึก 1 ไบต์ขอบคุณ Cyoce

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

การใช้งาน:

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

@KevinCruijssen คงที่
Karl Napf

สวัสดีขอโทษฉันลบความคิดเห็นของฉัน ฉันถูกต้องในการบอกว่ามันจะไม่ทำงานสำหรับแม้แต่ palindromes แต่เนื่องจากนี่เป็นสิ่งที่ตรงกันข้ามกับการท้าทายอื่น ๆ ดังนั้นจึงไม่มีกรณีทดสอบสำหรับแม้แต่ palindromes .. ขออภัยที่คุณสามารถยกเลิกการเปลี่ยนแปลงของคุณได้ +1 จากฉัน :)
Kevin Cruijssen

2
ตอนนี้มันมีความยาวเท่ากันแล้วใช้งานได้กับ + คี่และดูนักกอล์ฟ ฉันไม่เป็นไรกับสิ่งนี้
Karl Napf

นี่คือเนื้อหาที่หน่วยความจำรั่ว :-)
ShreevatsaR

1
ฉันคิดว่าคุณสามารถลบช่องว่างในchar* c
Cyoce


1

MATLAB / Octave, 20 19 18 16 ไบต์

1 ไบต์จากการยืมความคิดจากคำตอบของ Easterly Irk (เพิ่ม1แทน.5)
2 ไบต์ขอบคุณด้วย @StewieGriffin (วงเล็บที่ไม่จำเป็น)

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

ลองมันที่ Ideone


@ StewieGriffin ขอบคุณ! ฉันไม่รู้ว่าฉันกำลังคิดอะไรอยู่ ...
Luis Mendo

ทั้งฉัน: P มันไม่เหมือนว่ามันเป็น "เคล็ดลับ" ที่คุณไม่รู้เกี่ยวกับ ... ฉันมีบางอย่างเช่นกัน :)
Stewie Griffin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.