ดริฟท์อาร์เรย์


25

Driftsort เป็นวิธีง่ายๆในการ "เรียงลำดับ" อาเรย์ มันทำงานโดย "การเลื่อน" หรือ "การหมุน" องค์ประกอบที่อยู่ในอาร์เรย์จนกว่าอาร์เรย์จะถูกจัดเรียงหรือจนกว่าอาร์เรย์จะล้มเหลวในการเรียงลำดับ

ลองมาดูสองตัวอย่าง [10, 2, 3, 4, 7]ก่อนพิจารณาอาร์เรย์ เนื่องจากอาร์เรย์ไม่ได้เรียงเราจึงหมุนหนึ่งครั้ง (สิ่งนี้สามารถเกิดขึ้นได้ในทั้งสองทิศทางตราบใดที่ยังคงอยู่ในทิศทางเดียวกัน) จากนั้นอาร์เรย์จะกลายเป็น:

[7, 10, 2, 3, 4]

นี่ไม่ใช่การเรียงลำดับดังนั้นเราจึงหมุนอีกครั้ง

[4, 7, 10, 2, 3]

และอีกครั้ง:

[3, 4, 7, 10, 2]

และเป็นครั้งสุดท้าย:

[2, 3, 4, 7, 10]

และมันก็จัดเรียง! ดังนั้นอาร์เรย์[10, 2, 3, 4, 7]จึงลอยได้ นี่คือการหมุนทั้งหมดของอาเรย์เพื่อความชัดเจน:

[10, 2, 3, 4, 7]
[7, 10, 2, 3, 4]
[4, 7, 10, 2, 3]
[3, 4, 7, 10, 2]
[2, 3, 4, 7, 10]

[5, 3, 9, 2, 6, 7]พิจารณาในขณะนี้อาร์เรย์ ดูการหมุน:

[5, 3, 9, 2, 6, 7]
[7, 5, 3, 9, 2, 6]
[6, 7, 5, 3, 9, 2]
[2, 6, 7, 5, 3, 9]
[9, 2, 6, 7, 5, 3]
[3, 9, 2, 6, 7, 5]

ไม่มีอาร์เรย์ใดที่เรียงลำดับดังนั้นอาร์เรย์[5, 3, 9, 2, 6, 7]จึงไม่สามารถดริฟท์ได้


วัตถุประสงค์กำหนดอาเรย์ / รายการของจำนวนเต็มแบบ nonempty เป็นอินพุทให้กับโปรแกรม / ฟังก์ชั่นใช้การดริฟท์บนอินพุตและเอาท์พุตหรือส่งออกค่าเท็จ ( หรืออาเรย์ / รายการว่าง) จำนวนเต็มถูกผูกไว้กับภาษาของคุณสูงสุด / นาที แต่ต้องมีอย่างน้อย 255 สำหรับสูงสุดและ 0 สำหรับนาที

คุณอาจใช้วิธีการเรียงลำดับแบบบิวท์อิน แต่ไม่ใช่แบบบิวด์อินที่แก้ปัญหาได้

นี่คือดังนั้นโปรแกรมที่สั้นที่สุดในหน่วยไบต์

กรณีทดสอบ

input => output
[1] => [1]
[5, 0, 5] => [0, 5, 5]
[3, 2, 1] => false
[0, 9, 3] => false
[1, 2, 3, 4] => [1, 2, 3, 4]
[4, 1, 2, 3] => [1, 2, 3, 4]
[0, 2, 0, 2] => false
[5, 3, 9, 2, 6, 7] => false
[0, 0, 0, 0, 0, 0, 0] => [0, 0, 0, 0, 0, 0, 0]
[75, 230, 30, 42, 50] => [30, 42, 50, 75, 230]
[255, 255, 200, 200, 203] => [200, 200, 203, 255, 255]

5
วิธีง่ายๆในการตรวจสอบว่ารายการเป็น driftsortable คือถ้าเป็นรายการย่อยที่ต่อเนื่องกันของsorted(l) l+l
xnor

เพื่อชี้แจง: หากภาษาของเรารองรับจำนวนเต็มลบก็สามารถเกิดขึ้นได้ในอินพุตใช่หรือไม่
เดนนิส

@Dennis ที่ถูกต้อง
Conor O'Brien

สิ่งนี้ไม่ควรถูกเรียกshiftsort?
Filip Haglund

@FilipHaglund ฉันคิดเกี่ยวกับการเรียกมันว่า แต่มันอาจทำให้เกิดความสับสนกับการshiftดำเนินการที่จะลบองค์ประกอบแรกของอาร์เรย์
Conor O'Brien

คำตอบ:


9

เยลลี่ 6 ไบต์

ṙỤċṢȧṢ

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

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

ṙỤċṢȧṢ  Main link. Argument: A (list)

 Ụ      Grade up; return the indices of A, sorted by their corresponding values.
ṛ       Rotate A by each index, yielding the list of all rotations.
   Ṣ    Yield A, sorted.
  ċ     Count the number of times sorted(A) appears in the rotations.
        This gives 0 if the list isn't driftsortable.
    ȧṢ  Logical AND with sorted(A); replaces a positive count with the sorted list.

1
Ahem, 19 ไบต์ของ UTF8
rsaxvc

11
เยลลี่มีหน้ารหัสที่กำหนดเองที่เข้ารหัสอักขระ 256 ตัวแต่ละตัวที่มันเข้าใจเป็นไบต์เดียว (มันมีขนาด 16 ไบต์พร้อม UTF-8 btw.)
Dennis

3
@Dennis: คุณควรคัดลอก / วางในการส่งเยลลี่ทั้งหมดของคุณเพื่อป้องกันไม่ให้เรา (กล่าวคือคนที่ไม่เคยรู้มาก่อน) ในการแสดงความคิดเห็นแบบเดียวกัน? ;)
Olivier Dulac

18

ทับทิม, 33

->a{a.any?{a.sort==a.rotate!}&&a}

a.any?ยิงขึ้นหนึ่งครั้งสำหรับแต่ละองค์ประกอบในอาร์เรย์ยกเว้นจะหยุด (และคืนค่าจริง) ทันทีที่อาร์เรย์ได้กลายพันธุ์เป็นสถานะที่เรียงลำดับแล้ว หากสิ่งนี้เกิดขึ้นเราจะส่งกลับอาร์เรย์ที่กลายพันธุ์ มิฉะนั้นเราจะส่งคืนค่าเท็จที่any?ส่งคืน


1
นี่คือซุปเปอร์ฉลาดโดยเฉพาะอย่างยิ่งการหมุนในสถานที่ เยี่ยมมาก!
Alex A.

อนิจจาคำตอบ Ruby ของฉันได้รับการแก้ไขแล้ว +1
หมึกมูลค่า

3
อาใช่เก่า "เรียงมันจนกว่าคุณจะสามารถบอกได้ว่ามันสามารถเรียงลำดับ" เทคนิค
corsiKa

14

Python 2, 51 ไบต์

lambda l:sorted(l)*(map(cmp,l[-1:]+l,l).count(1)<3)

ไม่รบกวนการหมุน แต่ให้เรียงลำดับรายการจากนั้นดูว่าต้นฉบับสามารถคัดแยกได้โดยการตรวจสอบว่ามีการลดลงอย่างน้อยหนึ่งรายการในองค์ประกอบที่ต่อเนื่องกันของรายการที่ได้รับอนุมัติ การนับเป็น<3เพราะmapแผ่นรายการที่สั้นกว่าด้วยNoneในตอนท้ายเพิ่มการลดปลอม


2
[1, 3, 2, 4]มีการลดลงเพียงหนึ่งครั้งในองค์ประกอบที่อยู่ติดกัน แต่ไม่สามารถคัดแยกได้
Neil

1
@ นีลโอ้ยิง
xnor

@ ไม่มีฉันคิดว่านี่แก้ไขได้ คุณช่วยดูหน่อยได้ไหม?
xnor

10
อือเรา<3ด้วย
Funds Monica's Lawsuit

ฉันไม่สามารถพูดได้ว่าฉันเป็นผู้เชี่ยวชาญที่ Python แต่ดูเหมือนว่าสมเหตุสมผลถ้า<3จะหลีกเลี่ยงการหมุนรายการอย่างแม่นยำ
Neil

10

Pyth, 9 ไบต์

*SQ}SQ.:+

คำอธิบาย:

           - Q = eval(input())
         + -    Q+Q
       .:  -   sublists(^)
   }       -  V in ^
    SQ     -   sorted(Q)
*SQ        - ^ * sorted(Q) (return sorted(Q) if ^ True)

ลองที่นี่!

หรือใช้ชุดทดสอบ!


1
ฉันคิดว่าคุณสตริงเฉลี่ย (รายการย่อย) .:สำหรับ ชุดค่าผสมจะรวมองค์ประกอบที่ไม่ต่อเนื่องกัน
xnor

6

Matlab, 61 47 41 ไบต์

ขอบคุณ @Suever สำหรับ -6 ไบต์!

@(a)sort(a)+0*min(strfind([a,a],sort(a)))

หากstrfind([a,a],sort(a))พยายามค้นหาเวกเตอร์อินพุตที่เรียงลำดับแล้วเป็น 'สตริงย่อย' ของที่ไม่เรียงลำดับนั่นจะถูกผนวกเข้ากับตัวเอง ถ้าเป็นจริงอินพุตจะลอยได้และเราได้เวกเตอร์ที่มีความยาว 2 ถ้าไม่ใช่เราจะได้เวกเตอร์เปล่า minเพียงแปลงค่านี้เป็นเวกเตอร์ตัวเลข / ที่ว่างเปล่า การเพิ่มเวกเตอร์ที่เรียงลำดับเป็น 0 จะแสดงขึ้นการเพิ่มเวกเตอร์ที่ว่างเปล่าจะทำให้เกิดข้อผิดพลาด


การตรวจสอบสตริงย่อยจัดการ[2, 3]ไม่ได้เป็นรายการย่อย[12, 34]หรือไม่?
xnor

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

@flawr การตีความของฉันคือการstrfindทำงานกับตัวเลขโดยตรงไม่เพียง แต่กับตัวอักษร (แม้ว่าจะไม่ใช่เอกสาร) หากตัวเลขถูกตีความว่าเป็นตัวอักษรพวกเขาจะถูก จำกัด ให้65535(ลองตัวอย่าง+char(1e5))
Luis Mendo

@ LuisMendo คุณพูดถูกมันใช้ได้กับเลขทศนิยม โปรดทราบว่าจำนวนเหนือ 65535 จะปรากฏเป็นช่องว่างเมื่อพิจารณาเป็นส่วนหนึ่งของสตริง
ข้อบกพร่อง

5

Julia, 71 66 52 ไบต์

x->(y=sort(x))∈[circshift(x,i)for i=1:endof(x)]&&y

นี่คือฟังก์ชั่นนิรนามที่ยอมรับอาร์เรย์และส่งกลับอาร์เรย์หรือบูลีน หากต้องการเรียกใช้กำหนดค่าให้กับตัวแปร

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

บันทึก 19 ไบต์ขอบคุณเดนนิส!


4

Pip , 15 + 1 = 17 16 ไบต์

เอ่อภาษาอื่นของสนามกอล์ฟกำลังพัดออกมาจากน้ำ อย่างไรก็ตามเนื่องจากฉันได้เขียนไปแล้ว ...

L#gI$<gPBPOgYgy

รับอินพุตเป็นอาร์กิวเมนต์บรรทัดรับคำสั่งที่คั่นด้วยช่องว่าง ต้องการ-pหรือแฟล็กการจัดรูปแบบอาเรย์อื่นเพื่อแสดงผลลัพธ์ที่ชัดเจนกว่าการต่อข้อมูล กรณีเท็จส่งออกสตริงว่างซึ่งสามารถมองเห็นได้โดยอาศัยการขึ้นบรรทัดใหม่

                 Implicit: g is array of cmdline args; y is empty string
L#g              Loop len(g) times:
         POg       Pop the first item from g
      gPB          Push it onto the back of g
    $<             Fold on < (true if g is now sorted)
   I        Yg     If true, yank g into y
              y  Autoprint y

4

JavaScript (ES6), 72 70 65 ไบต์

a=>a.map(y=>{c+=x>y;x=y},x=a.slice(c=-1))|c<1&&a.sort((a,b)=>a-b)

ส่งคืน0เมื่อเกิดความล้มเหลว ก่อนหน้า85 83รุ่น 80 ไบต์หลีกเลี่ยงการโทรsort:

a=>a.map((y,i)=>{x>y&&(c++,j=i);x=y},x=a.slice(c=-1))|c<1&&a.splice(j).concat(a)

แก้ไข: บันทึกไว้ 2 ไบต์โดย initialising cไปแทน-1 0บันทึก 5 ไบต์โดยเปลี่ยนจากreduceเป็นmapถอนหายใจ ...


ดูการแก้ไข;)
Conor O'Brien

การโทรเพื่อเรียงลำดับหมายเลขไม่ถูกต้อง [10, 2, 3, 4, 7]ตรวจสอบตัวอย่าง
Qwertiy

รหัสนี้ยัง failes 3 การทดสอบ: [1], และ[0, 0, 0, 0, 0, 0, 0] [75, 230, 30, 42, 50]
Qwertiy

@Qwertiy ขออภัยเกี่ยวกับการsortดูแลซึ่งทำให้การทดสอบที่สามล้มเหลว ความล้มเหลวในการทดสอบอีกสองข้อนั้นเกิดจากฉันเล่นกอล์ฟมากเกินไป ฉันเปลี่ยนกลับเป็นเวอร์ชันก่อนหน้า
Neil


3

Snowman 1.0.2 , 27 bytes

((}#AsO|##aC,as|aLNdE`aR*))

นี่คือรูทีนย่อยที่รับอินพุตจากและส่งออกไปยัง permavar ปัจจุบัน

ลองออนไลน์!

((                       ))  subroutine
  }                          set our active variables b, e, and g:
                              .[a] *[b] .[c]
                              .[d]      *[e]    (* represents an active variable)
                              .[f] *[g] .[h]
   #                         store the input in variable b
    AsO                      sort in-place
       |                     swap b with g; now sorted input is in g
        ##                   store the input again in b and e
          aC                 concat; now the input doubled is in b and e is empty
            ,                swap e/g; now b has 2*input and e has sorted input
             as              split 2*input on sort(input) and store result in g
               |             bring the result up to b (we no longer care about g)
                aLNdE        take length and decrement; now we have 0 in b if the
                               array is not driftsortable and 1 if it is
                     `aR     repeat e (the sorted array) b times:
                               if b is 0 (nondriftsortable), returns [] (falsy)
                               otherwise (b=1), returns sorted array unchanged
                        *    put this back into the permavar

3

MATL, 13 12 10 9 ไบต์

SGthyXfa*

แนวคิดเดียวกันกับคำตอบของ @ flawr โดยที่เราจี้strfind( Xf) เพื่อค้นหาเวอร์ชันที่เรียงลำดับของอินพุตภายในการต่อข้อมูลสองชุดเข้าด้วยกัน

ลองออนไลน์!

คำอธิบาย

        % Implicitly get input
S       % Sort the input
Gth     % Explicitly grab the input again and concatenate with itself
y       % Copy the sorted version from the bottom of the stack
Xf      % Look for the sorted version as a subset
a       % Gives a 1 if there were matches and 0 otherwise
*       % Multiply by the sorted array. Yields all zeros for no match and the
        % sorted array when a match was found
        % Implicitly display the stack contents

1
คุณลบgไม่ได้ใช่ไหม หรือแทนที่ngโดยa
Luis Mendo

@LuisMendo ไม่สามารถแทนที่ด้วยnเพราะnอาจเป็น> 1. ทำงานได้a อย่างแน่นอน ฉันคิดว่ามีวิธีที่ดีกว่า ขอบคุณ!
Suever

3

Julia, 33 ไบต์

x->sum(diff([x;x]).<0)<3&&sort(x)

ลองออนไลน์!

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

นี้ concatenates อาร์เรย์xกับตัวเองและนับจำนวนคู่ที่มีการออกคำสั่งเช่นจำนวน subarrays ติดกัน[a, b]ที่ข - ค่า <0 หากเป็นจำนวนคู่เรียงลำดับของxตัวเองและTคือ1ถ้าx 's องค์ประกอบสุดท้ายมีขนาดใหญ่กว่าครั้งแรกsumจะกลับ2C + T

อาเรย์xเป็นแบบลอยได้ iff (c, t) = (1, 0) ( xจะต้องหมุนไปที่ค่าที่น้อยกว่าของคู่ที่ไม่เรียงลำดับเท่านั้น), (c, t) = (0, 1) ( xถูกเรียงลำดับ) หรือ(C, T) = (0, 0) ( xเรียงและทุกองค์ประกอบของมีค่าเท่ากัน) ซึ่งเป็น IFF จริง2C + T <3


3

Javascript ES6, 48 45 43 ตัวอักษร

x=>~(x+[,x]).indexOf(x.sort((a,b)=>a-b))&&x

ทดสอบ:

f=x=>~(x+[,x]).indexOf(x.sort((a,b)=>a-b))&&x
;`[1] => [1]
[5, 0, 5] => [0, 5, 5]
[3, 2, 1] => false
[0, 9, 3] => false
[1, 2, 3, 4] => [1, 2, 3, 4]
[4, 1, 2, 3] => [1, 2, 3, 4]
[0, 2, 0, 2] => false
[5, 3, 9, 2, 6, 7] => false
[0, 0, 0, 0, 0, 0, 0] => [0, 0, 0, 0, 0, 0, 0]
[75, 230, 30, 42, 50] => [30, 42, 50, 75, 230]
[255, 255, 200, 200, 203] => [200, 200, 203, 255, 255]`
.split`
`.map(t => t.replace(/^(.*) => (.*)$/, "f($1)+'' == $2")).every(eval)

ฉันคิดว่าคุณสามารถบันทึกสองไบต์โดยใช้(x+[,x])และอีกหนึ่งไบต์โดยใช้~แทน1+ในเงื่อนไขของคุณ
Neil

@ user6188402 อ๋อขอบคุณ
Qwertiy

2

Brachylogขนาด 39 ไบต์

l:0re:?{[0:L],!L.|rh$(L,?h-1=:L:1&.}.o.

ฉันต้องการเพิ่มอาร์กิวเมนต์ที่เป็นตัวเลือกเพื่อ$( - circular permute leftเพิ่มจำนวนมากกว่าหนึ่งครั้ง ... นี่จะเป็น 13 ไบต์ สิ่งนี้จะรอหลังจากใช้งานเครื่องส่งสัญญาณใหม่ที่เสถียรใน Prolog

คำอธิบาย

l:0re                                     I = a number between 0 and the length of Input
     :?{[0:L],!L.|rh$(L,?h-1=:L:1&.}      All this mess is simply circular permutating the
                                          input I times
                                    .o.   Unify the Output with that circular permutation
                                          if it is sorted, else try another value of I


2

CJam, 17 13 ไบต์

ขอบคุณเดนนิสสำหรับการบันทึก 4 ไบต์

{_$\_+1$#)g*}

บล็อก (ฟังก์ชัน) ที่ไม่มีชื่อซึ่งรับและส่งคืนรายการ

ชุดทดสอบ

คำอธิบาย

สิ่งนี้ใช้การสังเกตของ xnor เป็นอย่างมากว่ารายการที่เรียงลำดับนั้นจะปรากฏเป็นสองเท่าของรายการต้นฉบับหากสามารถจัดเรียงแบบดริฟท์ได้:

_$   e# Duplicate input and sort.
\_+  e# Get other copy and append to itself.
1$   e# Copy sorted list.
#    e# Find first position of sorted list in twice the original,
     e# of -1 if it's not found.
)g   e# Increment and take signum to map to 0 or 1.
*    e# Repeat sorted array that many times to turn it into an empty
     e# array if the input was not drift sortable.

@ เดนนิสโอ้ดูเหมือนว่าเราจะสร้างมันขึ้นมาด้วยตัวเอง ขอบคุณ :)
Martin Ender

2

C ++ 14, 242 ตัวอักษร

#include<iostream>
#include<vector>
#include<algorithm>
#define b v.begin()
using namespace std;int main(){vector<int>v;int x,n=0;for(;cin>>x;++n)v.push_back(x);for(x=n;x--;rotate(b,b+1,b+n))if(is_sorted(b,b+n)){for(x:v)cout<<x<<' ';return 0;}}

ถ้าฉันไม่สามารถออกจากการส่งออกที่ว่างเปล่า 252 ตัวอักษรhttp://ideone.com/HAzJ5V

#include<iostream>
#include<vector>
#include<algorithm>
#define b v.begin()
using namespace std;int main(){vector<int>v;int x,n=0;for(;cin>>x;++n)v.push_back(x);for(x=n;x--;rotate(b,b+1,b+n))if(is_sorted(b,b+n)){for(x:v)cout<<x<<' ';return 0;}cout<<'-';}

Ungolfed รุ่นhttp://ideone.com/Dsbs8W

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

#define b v.begin()

int main()
{
  vector <int> v;
  int x, n=0;

  for(;cin>>x;++n)
    v.push_back(x);

  for(x=n;x--;rotate(b,b+1,b+n))
    if(is_sorted(b,b+n))
    {
      for(x:v) cout<<x<<' ';
      return 0;
    }

  cout << '-';
}

PS: ขึ้นอยู่กับ @ MichelfrancisBustillos ของความคิด


2

Java 7, 207 ไบต์

int[]D(int[]i){int x,z;z=x=-1;int[]d=new int[i.length];while(++x<i.length)if(i[x]>i[(x+1)%i.length])if(z<0)z=(x+1)%i.length;else return null;if(z<0)z=0;x=-1;while(++x<d.length)d[x]=i[z++%i.length];return d;}

รายละเอียด ลองที่นี่

// driftsort in ascending-order
int[] D(int[]i)
{
    int x = -1,z = -1;
    int[] d = new int[i.length];

    while ((++x) < i.length)
    {
        if (i[x] > i[(x+1)%i.length])
        {
            if(z < 0) z = (x+1)%i.length;
            else return null; // not driftsortable
        }
    }

    if(z < 0) z = 0;
    x = -1;
    while ((++x) < d.length)
    {
        d[x] = i[(z++)%i.length];
    }

    return d;
}

2

Java 175

พิมพ์เอาต์พุตเป็นค่าที่คั่นด้วยช่องว่างหรือพิมพ์fค่า falsey

void d(int[]a){String s;for(int v,w,x=-1,y,z=a.length;++x<z;){v=a[x];s=""+v;for(y=0;++y<z;v=w){w=a[(x+y)%z];if(v>w){s="f";break;}s+=" "+w;}if(y==z)break;}System.out.print(s);}

ผ่านการรวมกันทั้งหมดของอาร์เรย์ของจำนวนเต็มจนกระทั่งพบลำดับที่ถูกต้องหรือหมดการรวมกัน อาเรย์ไม่ได้ถูกแก้ไข แต่จะถูกเก็บไว้ในลำดับที่ลอยตามลำดับเป็นสตริง

อ่านง่ายขึ้นอีกเล็กน้อย:

void driftsort(int[]array){
    String str;
    for(int previous,current,x=-1,y,len=array.length;++x<len;){
        previous=array[x];
        s=""+previous;
        for(y=0;++y<len;previous=current){
            current=array[(y+x)%len];
            if(previous>current){
                str="false";
                break;
            }
            str+=" "+current;
        }
        if(y==len)break;
    }
    System.out.print(str);
}

ลองออนไลน์


2

C, 105 ไบต์

i,s;main(c,v)char**v;{c--;while(i++<c)if(atoi(v[i])>atoi(v[i%c+1]))c*=!s,s=i;while(--i)puts(v[s++%c+1]);}

สิ่งนี้ยอมรับจำนวนเต็มอินพุตเป็นอาร์กิวเมนต์บรรทัดคำสั่งแยกต่างหากและพิมพ์รายการเอาต์พุตเป็นจำนวนเต็มหนึ่งตัวต่อบรรทัด

หากรายการนั้นไม่สามารถดริฟท์ได้โปรแกรมจะออกก่อนกำหนดเนื่องจากข้อยกเว้นจุดลอยตัวดังนั้นเอาต์พุตที่ว่างจะแสดงรายการที่ว่างเปล่า

การตรวจสอบ

$ gcc -o driftsort driftsort.c 2>&-
$ ./driftsort 1 | cat
1
$ ./driftsort 5 0 5 | cat
0
5
5
$ ./driftsort 3 2 1 | cat
$ ./driftsort 0 9 3 | cat
$ ./driftsort 1 2 3 4 | cat
1
2
3
4
$ ./driftsort 4 1 2 3 | cat
1
2
3
4
$ ./driftsort 0 2 0 2 | cat
$ ./driftsort 5 3 9 2 6 7 | cat
$ ./driftsort 0 0 0 0 0 0 0 | cat
0
0
0
0
0
0
0
$ ./driftsort 75 230 30 42 50 | cat
30
42
50
75
230
$ ./driftsort 255 255 200 200 203 | cat
200
200
203
255
255

2

ทับทิม, 28

->a{(a*2*?,)[a.sort!*?,]&&a}

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


2

Python ขนาด 53 ไบต์

s,N=sorted,lambda x:s(x)*(str(s(x))[1:-1]in str(x+x))

หากคุณต้องการทดสอบส่วนหัวนี้ไปที่https://www.repl.it/languages/python3และคัดลอกวางสิ่งนี้:

s,N=sorted,lambda x:s(x)*(str(s(x))[1:-1]in str(x+x))
print(N([1,2,3,4,5,0]))

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

  • sเป็นตัวแปรที่จัดเก็บsortedฟังก์ชัน python ซึ่งเรียงลำดับรายการ
  • N เป็นหน้าที่หลัก
  • รายการอินพุตที่เรียงลำดับ: s(x)ถูกคูณด้วยว่ารายการนั้นลอยอยู่หรือไม่str(s(x))[1:-1]in str(x+x)(ขอบคุณ @xnor)
    • สิ่งนี้ใช้ได้[1,2,3,4]*falseผลในรายการว่าง[]
    • และ[1,2,3,4]*trueผลลัพธ์ใน[1,2,3,4]

1
ใน Python 2 คุณสามารถย่อให้เหลือlambda x,s=sorted:(`s(x)`[1:-1]in`x+x`)*s(x)44 ไบต์
Dennis

1

Python ขนาด 83 ไบต์

def f(l):g=sorted(l);return g if any(l[x:]+l[:x]==g for x in range(len(l)))else 1>2

เรื่องนี้ทำให้ฉันรู้สึกอับอายด้วยคำตอบของไพ ธ อนอื่น ๆ แต่ฉันก็อาจโพสต์ไว้ได้ ฉันไม่ชอบ

range(len(l)))

ส่วนหนึ่ง มีวิธีที่เร็วกว่าในการวนซ้ำในรายการหรือไม่


1
มันไม่มากนัก แต่l.append(l.pop(0))or g==l for _ in lช่วยประหยัดไบต์ด้วยวิธี range-len การใช้ a lambdaจะประหยัด 14 ไบต์เพิ่มเติม
Dennis

1

MATLAB / Octave, 118 ไบต์

function r(a)
i=0
while (~issorted(a) && i<length(a))
    a=a([2:end 1]),i=i+1
end
if issorted(a)
    a
else
    0
end

2
input('')ผมคิดว่าคุณสามารถบันทึกไบต์บางโดยการเขียนทุกอย่างในหนึ่งบรรทัดและการใช้ ยังหลีกเลี่ยงช่องว่างและวงเล็บที่ไม่จำเป็น! f=@issortedและคุณอีกครั้งสามารถหลั่งไบต์บางส่วนโดยการกำหนดเป็นครั้งแรก
ข้อบกพร่อง

1

PowerShell v2 +, 87 80 ไบต์

param($a)0..($a.length-1)|%{if($a[$_-1]-gt$a[$_]){$c--}};(0,($a|sort))[++$c-ge0]

ทำตามขั้นตอนในรายการอินพุต$aตรวจสอบแต่ละองค์ประกอบของ pairwise (รวมถึง Last และ First) เพื่อดูว่ามีคู่ลดลงมากกว่าหนึ่งคู่หรือไม่ $cหากคู่โดยเฉพาะอย่างยิ่งจะลดลงเราพร่อง เอาต์พุตทั้งรายการที่เรียงลำดับหรือองค์ประกอบเดียว0โดยยึดตามค่าของ$cตอนท้าย หากมีมากกว่าหนึ่งคู่ที่ "ไม่ดี" ++$cจะยังคงเป็นค่าลบมิฉะนั้นจะเป็นอย่างน้อย0ดังนั้นองค์ประกอบที่สองของ pseudo-ternary จึงถูกเลือก ( $a|sort)

ฉันเห็นว่า xnor ทำสิ่งที่คล้ายกันแต่ฉันคิดขึ้นมาเอง


1

ตัวคูณ 47 ไบต์

[ dup dup append [ natural-sort ] dip subseq? ]

เข้าร่วมลำดับกับตัวเองแล้วตรวจสอบว่าการแปลเรียงลำดับของต้นฉบับที่เป็นลำดับ


1
ดูเหมือนว่าไฮกุปรัชญา: dup dup append \\ natural sort \\ dip subseq?เหมาะกับรูปแบบ 4-4-3 :)
Akiiino

@ Akiiino: D ภาษาที่ไม่มีจุดเป็นกวีที่ยอดเยี่ยม
แมว

1

C ++, 313 359 370ไบต์

ตะโกนอย่างมากที่ @Qwertiy สำหรับการทำงานนี้และสอนวิธีการเล่นกอล์ฟที่ยอดเยี่ยมให้ฉัน!

แข็งแรงเล่นกอล์ฟ:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(){vector<int> v;int x,c=0,s=0,y;while(cin>>x)v.push_back(x);do if(rotate(v.begin(),v.begin()+1,v.end()),c++,is_sorted(v.begin(),v.end()))s=1;while(!s&c<=v.size());if(s)for(y=0;y<v.size();y++)cout<<v[y]<<" ";else cout<<"False";}

Ungolfed:

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int main(){
  vector <int> v;
  int x, c=0, s=0, y;

  while(cin>>x)
    v.push_back(x);

  do 
    if (
      rotate(v.begin(),v.begin()+1,v.end()),
      c++,
      is_sorted(v.begin(),v.end())
    ) s = 1;
  while(!s & c <= v.size());

  if (s)
    for(y=0; y<v.size(); y++)
      cout<<v[y]<<" ";
  else
    cout<<"False";
}

1
การเล่นกอล์ฟไม่ได้เป็นการลบช่องว่างออก using namespace std;20 ตัวอักษรคือเมื่อstd::6 คูณ 30 bool s = False;- ทำไม=0ล่ะ return 0;คุณสามารถวาง ทำไมวงเล็บถึงอยู่ที่นี่!s&&(c<=v.size())? การจัดฟันรูปและไม่มีเครื่องหมายจุลภาค ...
Qwertiy

ว้าวขอบคุณ! สิ่งต่างๆมากมาย (เช่นstd::และreturn 0;) กลายเป็นนิสัยจากชั้นเรียนการเขียนโปรแกรม ฉันต้องเริ่มตรวจสอบโปรแกรมของฉันให้ดีขึ้น
Michelfrancis Bustillos

1
นอกจากนี้ยังมีชุดของข้อบกพร่อง ทำไมคุณอ่านจนเป็นศูนย์และใส่ศูนย์นั้นลงในข้อมูล? ทำไมคุณถึงส่งออกไปยังขนาดรวม? ทำไมTrueและFalseแทนและtrue ideone.com/kVTI25 - รุ่นของคุณideone.com/y8s44A - แก้ไขและเตรียมพร้อมสำหรับรุ่นสนามกอล์ฟ false
Qwertiy

ขอขอบคุณอีกครั้ง! Caping TrueและFalseมาจาก Python ฉันไม่รู้ด้วยซ้ำว่าคุณจะเขียนifมันได้!
Michelfrancis Bustillos

1
และย่อให้สั้นลงอีกมากมาย: ideone.com/Dsbs8Wและgolfed ideone.com/HAzJ5V (<s> 255 </s> 252 ตัวอักษร) ใช้ C ++ 14 สำหรับ foreach loop
Qwertiy

1

Mathcad, TBD

ป้อนคำอธิบายรูปภาพที่นี่

ใน Mathcad, 0 (เซนต์คิตส์และเนวิส) == false

(เทียบเท่า) นับไบต์เป็น TBD จนกว่าวิธีการนับได้ตกลงกัน ประมาณ 52 bytes โดยใช้ byte = operator / สัญลักษณ์เทียบเท่าแป้นพิมพ์


1

Mathematica 55 50 61 58 ไบต์

ด้วย 3 ไบต์ที่บันทึกไว้ต้องขอบคุณ Martin Büttner

ความพยายามก่อนหน้าของฉันไม่ผ่านการทดสอบทั้งหมด ฉันต้องการเพิ่มUnionเพื่อหลีกเลี่ยงการทำซ้ำในรายการที่มีการป้อนข้อมูลตามลำดับ

Join@Union@Cases[NestList[RotateRight,#,Length@#],Sort@#]&

การทดสอบ

Join@Union@Cases[NestList[RotateRight,#,Length@#],Sort@#]&/@
{{1},{5,0,5},{3,2,1},{0,9,3},{1,2,3,4},{4,1,2,3},{0,2,0,2},{5,3,9,2,6,7},
{0,0,0,0,0,0,0},{75,230,30,42,50},{255,255,200,200,203}}

{{1}, {0, 5, 5}, {}, {}, {1, 2, 3, 4}, {1, 2, 3, 4}, {}, {}, {0, 0, 0, 0, 0, 0, 0}, {30, 42, 50, 75, 230}, {200, 200, 203, 255, 255}}


คำอธิบาย

หมุนขวารายการอินพุตจาก 1 ถึงnครั้งโดยที่nความยาวของรายการอินพุต หากรายการอินพุตที่เรียงลำดับอยู่ในรายการที่หมุนแล้วให้ส่งคืน มิฉะนั้นคืนรายการที่ว่างเปล่า


@ MartinBüttnerข้อเสนอแนะของคุณล้มเหลวในบางกรณีทดสอบโดยเฉพาะ #s 3,4,7,8
DavidC

@DavidC อ่าคุณถูกต้องฉันผสมพฤติกรรมของ@@และ/@ในรายการว่าง Join@@ควรจะสั้นกว่าFlatten@นี้
Martin Ender

1

PHP, 98 ไบต์

ส่งออก a 1ถ้าดริฟท์เปลี่ยนได้ไม่มีอะไรอื่น

$a=$argv[1];$b=$a;sort($a);foreach($a as $v){echo($a===$b?1:'');array_unshift($b, array_pop($b));}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.