บอกวิธีการล้มเหลว


29

ในฐานะนักวิทยาศาสตร์คอมพิวเตอร์คุณอาจคุ้นเคยกับการทำรายการป๊อปและพุชพื้นฐาน เหล่านี้เป็นการดำเนินการอย่างง่ายที่แก้ไขรายการองค์ประกอบ อย่างไรก็ตามคุณเคยได้ยินเรื่องการปฏิบัติการล้มเหลวบ้างไหม? (เช่นเดียวกับflip- flop )? มันค่อนข้างง่าย รับตัวเลขnให้กลับองค์ประกอบnแรกของรายการ นี่คือตัวอย่าง:

>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> a.flop(4)
[4, 3, 2, 1, 5, 6, 7, 8, 9, 10]

สิ่งดีๆเกี่ยวกับการดำเนินการล้มเหลวคือการที่คุณสามารถใช้มันทำสิ่งบางเย็นในรายการเช่นการเรียงลำดับมัน เราจะทำสิ่งที่คล้ายกับรองเท้าแตะ:

รับรายการจำนวนเต็ม "Neighbor it" กล่าวอีกนัยหนึ่งให้เรียงลำดับเพื่อให้องค์ประกอบที่ซ้ำกันปรากฏขึ้นอย่างต่อเนื่อง

สามารถทำได้ด้วย flops! ตัวอย่างเช่นใช้รายการต่อไปนี้:

>>> a = [3, 2, 1, 4, 3, 3, 2]
>>> a.flop(4)
[4, 1, 2, 3, 3, 3, 2]
>>> a.flop(3)
[2, 1, 4, 3, 3, 3, 2]
>>> a.flop(6)
[3, 3, 3, 4, 1, 2, 2]

สิ่งนี้นำเราไปสู่คำจำกัดความของความท้าทายในปัจจุบัน:

รับรายการจำนวนเต็มส่งออกชุดของไฟล์ใด ๆ ที่จะส่งผลให้รายการอยู่ในรูป

ใช้รายการสุดท้ายเป็นตัวอย่างคุณควรเอาท์พุท:

4
3
6

เพราะ flopping รายการด้วย 4 จากนั้น 3 โดย 6 แล้วจะส่งผลให้รายการเพื่อนบ้าน โปรดทราบว่าคุณไม่จำเป็นต้องพิมพ์รายการย่อที่สั้นที่สุดที่เป็นไปได้ของรายการ หากคุณพิมพ์แล้ว:

4
4
4
3
1
1
6
2
2

แต่นี่จะเป็นผลลัพธ์ที่ถูกต้อง อย่างไรก็ตามคุณอาจไม่ส่งออกจำนวนมากเกินความยาวของรายการ นี่เป็นเพราะสำหรับรายการการa = [1, 2, 3]โทรa.flop(4)เป็นเรื่องไร้สาระ

นี่คือตัวอย่างบางส่วน:

#Input:
[2, 6, 0, 3, 1, 5, 5, 0, 5, 1]

#Output
[3, 7, 8, 6, 9]


#Input
[1, 2]

#Output
<any list of integers under 3, including an empty list>


#Input
[2, 6, 0, 2, 1, 4, 5, 1, 3, 2, 1, 5, 6, 4, 4, 1, 4, 6, 6, 0]

#Output
[3, 19, 17, 7, 2, 4, 11, 15, 2, 7, 13, 4, 14, 2]


#Input
[1, 1, 1, 1, 2, 2, 2, -1, 4]

#Output
[]


#Input
[4, 4, 8, 8, 15, 16, 16, 23, 23, 42, 42, 15]

#Output
[12, 7]

โปรดทราบว่าในแต่ละตัวอย่างเหล่านี้เอาต์พุตที่ให้เป็นเพียงเอาต์พุตที่ถูกต้องที่อาจเกิดขึ้นได้ ที่ผมกล่าวก่อน, ชุดใด ๆ ที่ flops เพื่อนบ้านรายการที่กำหนดเป็นเอาท์พุทที่ถูกต้อง คุณสามารถใช้สคริปต์ python นี้เพื่อตรวจสอบว่ารายการที่กำหนดของ flops นั้นอยู่ใกล้กับรายการอย่างถูกต้องหรือไม่

คุณสามารถนำเข้าและส่งออกในรูปแบบที่เหมาะสม ตัวอย่างเช่นฟังก์ชันอาร์กิวเมนต์ / ค่าส่งคืน STDIN / STDOUT การอ่าน / เขียนไฟล์เป็นต้นล้วน แต่ใช้ได้ทั้งหมด ตามปกตินี่คือดังนั้นสร้างโปรแกรมที่สั้นที่สุดที่คุณสามารถทำได้และขอให้สนุก! :)


3
ฉันได้ยินว่ามันเป็น op (จุด oating) op (eration)
Weijun Zhou

3
@ WeijunZhou นั่นคือการวัดความเร็วในการคำนวณสำหรับการนับการดำเนินการกับฮาร์ดแวร์หนึ่งชิ้น en.wikipedia.org/wiki/FLOPS
iPhoenix

3
การส่งจะต้องถูกกำหนดไว้หรือฉันสามารถหลอกสุ่ม ๆ จนกว่าจะมีการจัดกลุ่มอาร์เรย์หรือไม่?
Dennis

3
Zero flops อนุญาตให้ปรากฏในผลลัพธ์หรือไม่
Laikoni

4
ที่เกี่ยวข้อง NB คำตอบสำหรับคำถามนั้นจะเป็นคำตอบสำหรับคำถามนี้ แต่เนื่องจากการเรียงลำดับเป็นเงื่อนไขที่แข็งแกร่งกว่าการเป็น "เพื่อนบ้าน" จึงอาจเป็นไปได้ที่จะออกไปเล่นกอล์ฟดังนั้นจึงอาจไม่ซ้ำกัน (แม้ว่าข้อเท็จจริงที่ว่า คำตอบจนถึงตอนนี้ก็ยังไม่สนับสนุน)
ปีเตอร์เทย์เลอร์

คำตอบ:


7

Haskell , 98 71 ไบต์

h.r
h(x:s)|(a,b)<-span(/=x)s=l b:l s:h(b++r a)
h e=e
r=reverse
l=length

ลองออนไลน์!

คำอธิบาย

สำหรับรายการความยาวnวิธีนี้จะสร้าง2*nflops มันทำงานได้โดยดูที่องค์ประกอบสุดท้ายของรายการมองหาองค์ประกอบเดียวกันในรายการก่อนหน้าและพลิกไปยังตำแหน่งที่สองถึงตำแหน่งสุดท้าย จากนั้นรายการที่มีองค์ประกอบสุดท้ายที่ถูกลบจะถูกเรียกซ้ำ "เพื่อนบ้าน"

สำหรับรายการ[1,2,3,1,2]อัลกอริทึมทำงานดังนี้:

[1,2,3,1,2]  flip longest prefix that ends in 2: flop 2
[2,1,3,1,2]  bring first element to second to last position: flop n-1 = flop 4
[1,3,1,2,2]  recursively work on n-1 list
[1,3,1,2]    there is no other 2: flop 0
[1,3,1,2]    flop n-1 = flop 3
[1,3,1,2]    recurse
[1,3,1]      flop 1
[1,3,1]      flop 2
[3,1,1]      recurse
[3,1]        flop 0
[3,1]        flop 1
 ...

ทั้งหมดเข้าด้วยกันอัตราผลตอบแทนนี้ flops และรายการ[2,4,0,3,1,2,0,1,0,0] neighboured[3,1,1,2,2]


6

ภาษา Wolfram (Mathematica) , 71 ไบต์

If[(n=Tr[1^#])<1,{},{i=Last@Ordering@#,n,n-1,i-1}~Join~#0[#~Drop~{i}]]&

ลองออนไลน์!

มันทำงานอย่างไร

กำหนดอาร์เรย์ที่มีความยาวnเอาต์พุตลำดับของ4nflops ที่เรียงลำดับอาร์เรย์ในลำดับที่เพิ่มขึ้น: โดยเฉพาะวางองค์ประกอบที่ซ้ำกันถัดจากกัน

แนวคิดคือการเรียงลำดับอาร์เรย์เราย้ายองค์ประกอบที่ใหญ่ที่สุดไปยังจุดสิ้นสุดจากนั้นเรียงลำดับn-1องค์ประกอบแรกของอาร์เรย์ เพื่อหลีกเลี่ยงการใช้งานการดำเนินการฟลอพเราย้ายองค์ประกอบที่ใหญ่ที่สุดไปยังจุดสิ้นสุดด้วยวิธีที่ไม่รบกวนองค์ประกอบอื่น ๆ :

{3, 2, 1, 5, 3, 3, 2}    starting array, with largest element in position 4
{5, 1, 2, 3, 3, 3, 2}    flop 4 to put the largest element at the beginning
{2, 3, 3, 3, 2, 1, 5}    flop 7 to put the largest element at the end
{1, 2, 3, 3, 3, 2, 5}    flop 6 (7-1) to reverse the effect of flop 7 on other elements
{3, 2, 1, 3, 3, 2, 5}    flop 3 (4-1) to reverse the effect of flop 4 on other elements

โดยทั่วไปถ้าองค์ประกอบที่ใหญ่ที่สุดอยู่ในตำแหน่งที่iลำดับของ flops i, n, n-1, i-1ย้ายที่ไปยังจุดสิ้นสุดคือ


i, nคุณสามารถย้ายองค์ประกอบที่ใหญ่ที่สุดในท้ายที่สุดมีเพียง แล้วทำไมn-1, i-1? ไม่จำเป็นต้องมีการเรียงลำดับที่เสถียร
ปีเตอร์เทย์เลอร์

@PeterTaylor ฉันไม่คิดว่าคำตอบนั้นใช้งานได้จริง แต่มันจะลบองค์ประกอบที่ใหญ่ที่สุดในแต่ละครั้งและให้ผลลัพธ์ที่เทียบเท่ากับการดำเนินการนั้นในรูปของ flops
Neil


3

เยลลี่ , 19 17 ไบต์

ỤỤạ‘Ḣ
ỤÇÐƤĖµUż’ṚF

เรียงลำดับรายการ

ลองออนไลน์!


ผมคิดว่าỤŒ¿’Æ!‘ṚĖµUż’ṚFทุกประเภทตั้งแต่กลับเป็นแบบโมดูโลŒ¿ L!
Jonathan Allan

ไม่ว่าจะด้วยเหตุผลใดก็ตามมันไม่ได้ผลสำหรับกรณีทดสอบครั้งสุดท้ายซึ่งอาจหมายความว่ารหัสของฉันจะล้มเหลวสำหรับเคสที่คลุมเครือเช่นกัน ...
Dennis

[4, 3, 2, 1, 3]และมันก็ไม่แน่นอนล้มเหลวสำหรับการป้อนข้อมูล คนเกียจคร้าน
Dennis

โอ้โห นั่นเป็นความอัปยศ
Jonathan Allan

Ụ>Ṫ$ƤSạỤĖµUż’ṚFประหยัด 2 ไบต์โดยแทนที่ลิงค์ตัวช่วย
ระยะทาง

2

ทำความสะอาด , 88 ไบต์

ฉันคิดว่าอาจมีทหารที่สั้นกว่านี้ แต่ฉันยังไม่พบมัน

import StdEnv
$[h:t]#(a,b)=span((<>)h)t
=map length[b,t]++ $(b++r a)
$e=e
r=reverse

$o r

ลองออนไลน์!

เป็นฟังก์ชั่นตัวอักษร ทำงานในลักษณะเดียวกันกับคำตอบของ Haskell ของ Laikoniแต่เล่นกอล์ฟแตกต่างกันเล็กน้อยและแน่นอนในภาษาอื่น


1

JavaScript, 150 ไบต์

(a,f=n=>(a=[...a.slice(0, n).reverse(),...a.slice(n)],n),l=a.length,i=0)=>a.reduce(c=>[...c,f(a.indexOf(Math.max(...a.slice(0, l-i)))+1),f(l-i++)],[])

ลองออนไลน์!

JavaScript, 151 ไบต์

a=>{f=n=>(a=[...a.slice(0,n).reverse(),...a.slice(n)],n),r=[];for(i=a.length+1;--i>0;)r.push(f(a.indexOf(Math.max(...a.slice(0, i)))+1),f(i));return r}

ลองออนไลน์!

โดยทั่วไปแล้วทั้งสองเรียงลำดับอาเรย์โดยพลิกจำนวนสูงสุดไปยังจุดเริ่มต้นแล้วพลิกไปทางด้านหลังทำซ้ำกับอาเรย์ที่เหลือ อันแรกใช้ลด, อันที่สองใช้สำหรับลูป

Ungolfed:

array => {
  let flop = n => {
    array = [...array.slice(0, n).reverse(), ...array.slice(n)]; 
    return n;
  }
  let flops = [];
  for (let i = array.length + 1; --i > 0;) 
  {
    let maxIndex = array.indexOf(Math.max(...array.slice(0, i)));
    flops.push(flop(maxIndex + 1), flop(i));
  }
  return flops;
}

0

Perl 5.10 (หรือสูงกว่า), 66 ไบต์

รวม+3สำหรับที่จะนำภาษาที่ระดับ 5.10 Perl ถือว่าฟรี-nuse 5.10.0

#!/usr/bin/perl -n
use 5.10.0;
$'>=$&or$.=s/(\S+) \G(\S+)/$2 $1/*say"$. 2 $."while$.++,/\S+ /g

รันด้วยอินพุตเป็นหนึ่งบรรทัดบน STDIN:

flop.pl <<< "1 8 3 -5 6"

จัดเรียงรายการโดยค้นหาการกลับรายการซ้ำ ๆ ซ้ำ ๆ ลอยไปที่ด้านหน้าจากนั้นเลื่อนการกลับรายการและเลื่อนทุกอย่างกลับสู่ตำแหน่งเดิม

มันยากที่จะได้รับใน ballpark เดียวกับหลามใน :-)


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