จำนวนกระโดดขั้นต่ำ


14

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

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

ที่ตำแหน่งใด ๆ คุณสามารถกระโดดได้ที่ max k ย้ายโดยที่ k คือค่าที่เก็บไว้ที่ตำแหน่งนั้น หลังจากถึงจุดสิ้นสุดคุณสามารถใช้เฉพาะตำแหน่งเหล่านั้นสำหรับการกระโดดซึ่งไม่ได้ใช้ก่อนหน้านี้สำหรับการกระโดด

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

การป้อนข้อมูล:

2 4 2 2 3 4 2 2

เอาท์พุท:

6 (3 ถึงจุดสิ้นสุดและ 3 เพื่อกลับมา)

อินพุต

1 0

เอาท์พุต

-1

บันทึก

  • สมมติว่าตัวเลขทั้งหมดในลำดับนั้นไม่เป็นลบ

แก้ไข 1

บรรทัด "ดังนั้นจึงควรมีความชัดเจนว่าสามารถข้ามจากตำแหน่งสุดท้ายได้เสมอ" อาจสับสนดังนั้นฉันลบมันออกจากคำถาม มันจะไม่มีผลกับคำถาม

เกณฑ์การชนะ:

ผู้ชนะจะได้รับรหัสที่สั้นที่สุด


3
Thus, it should be clear that one can always jump from the last position.- ไม่ใช่1 0ตัวอย่างตัวอย่างใช่หรือไม่
Daniel Lubarov

@Daniel No. จำนวนการกระโดดจะเท่ากับค่าที่เก็บในตำแหน่งนั้น ตำแหน่งสุดท้ายคือผู้สมัครที่สามารถกระโดดได้เสมอเนื่องจากตำแหน่งนี้ไม่ได้ใช้สำหรับการกระโดดก่อนหน้านี้
คนเขียนโปรแกรม

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

1
เกณฑ์การชนะคืออะไร? ในขณะที่คุณติดแท็กcode-golfและcode-challengeมันไม่ชัดเจน
โฮเวิร์ด

@ กล่องจดหมายใช่ ฉันเห็นด้วยมันไม่ชัดเจน ฉันจะอัปเดตคำถามในไม่ช้า
คนเขียนโปรแกรม

คำตอบ:


4

APL (Dyalog), 116

f←{{⊃,/{2>|≡⍵:⊂⍵⋄⍵}¨⍵}⍣≡1{(⍴⍵)≤y←⊃⍺:⍵⋄⍵[y]=0:0⋄x←⍵⋄x[y]←0⋄∇∘x¨,∘⍺¨y+⍳y⌷⍵},⍵}
{0≡+/⍵:¯1⋄(⌊/+/0=⍵)-+/0=x}↑⊃,/f¨⌽¨f x←⎕

กรณีทดสอบ

      2 4 2 2 3 4 2 2
6
      1 0
¯1
      1 1 1 1
¯1
      3 1 2 0 4
3
      1
0

เข้าใกล้

วิธีการคือการค้นหากำลังดุร้ายโดยใช้ฟังก์ชันแบบเรียกซ้ำ

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

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

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


4

Mathematica, 197 193 ตัวอักษร

กำลังดุร้าย.

Min[Length/@Select[Join[{1},#,{n},Reverse@#2]&@@@Tuples[Subsets@Range[3,n=Length[i=FromDigits/@StringSplit@InputString[]]]-1,2],{}⋃#==Sort@#∧And@@Thread[i[[#]]≥Abs[#-Rest@#~Append~1]]&]]/.∞->-1 

งานที่น่าประทับใจมาก มันอาจจะดุร้าย แต่มันก็สง่างามมาก
DavidC

3

Mathematica 351

[หมายเหตุ: นี่ยังไม่สมบูรณ์นัก; นอกจากนี้จำเป็นต้องปรับอินพุตให้พอดีกับรูปแบบที่ต้องการ และต้องปฏิบัติตามกฎที่ไม่มีการกระโดดข้ามบนตำแหน่งเดียวกันสองครั้ง นอกจากนี้ยังมีปัญหาการจัดรูปแบบโค้ดบางอย่างที่ต้องใช้ในการจัดการ แต่มันเป็นการเริ่มต้น]

กราฟถูกสร้างขึ้นด้วยโหนดที่สอดคล้องกับแต่ละตำแหน่งคือแต่ละหลักอินพุตที่เป็นตัวแทนของการกระโดด DirectedEdge[node1, node2]หมายความว่าเป็นไปได้ที่จะข้ามจาก node1 ไปที่โหนด 2 พบเส้นทางที่สั้นที่สุดตั้งแต่ต้นจนจบและจากต้นจนจบ

f@j_:=
(d={v=FromCharacterCode/@(Range[Length[j]]+96),j}\[Transpose];
w[n_,o_:"+"]:={d[[n,1]],FromCharacterCode/@(ToCharacterCode[d[[n,1]]][[1]]+Range[d[[n,2]]]  
If[o=="+",1,-1])};

y=Graph[Flatten[Thread[DirectedEdge[#1,#2]]&@@@(Join[w[#]&/@Range[8],w[#,3]&/@Range[8]])]];

(Length[Join[FindShortestPath[y,v[[1]],v[[-1]]],FindShortestPath[y,v[[-1]],v[[1]]]]]-2)
/.{0-> -1})

การใช้

f[{2,4,2,2,3,4,2,2}]
f[{3,4,0,0,6}]
f[{1,0}]

6
3
-1


นี่เป็นบางส่วนผิดเพราะมันไม่ได้บังคับให้ไม่มีการกระโดดบนกฎสองครั้ง แต่เป็นการเริ่มต้นดังนั้นฉันจะลงคะแนนให้ ฉันไม่รู้เลยว่าสิ่งนี้จะเป็นไปได้หรือไม่ :)
Doorknob

คุณถูก. ฉันมองข้ามกฏเลขสองตัวที่ไม่กระโดดร่มพรุ่งนี้ฉันจะพยายามแก้ไขให้ถูกต้อง
DavidC

3

Python 304

ฉันคิดว่าวิธีการใหม่นี้แก้ไขได้ (ฉันหวังว่า!) ทุกปัญหาเกี่ยวกับ [2,0] กรณีและที่คล้ายกัน:

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

## Back and forward version

# Changed: now the possible jumps from a given L[i] position  
# are at most until the end of the sequence 
def AvailableJumps(L,i): return range(1,min(L[i]+1,len(L)-i))

# In this version we add a boolean variable bkw to keep track of the
# direction in which the sequence is being traversed
def Jumps(L,i,n,S,bkw):
    # If we reach the end of the sequence...
    # ...append the new solution if going backwards
    if (bkw & (i == len(L)-1)): 
            S.append(n)
    else:
        # ...or start again from 0 with the reversed sequence if going forward
        if (i == len(L)-1):
            Jumps(L[::-1],0,n,S,True)    
        else:
            Laux = list(L)
            # Now we only have to disable one single position each time
            Laux[i] = 0
            for j in AvailableJumps(L,i):
                Jumps(Laux,i+j,n+1,S,bkw)

def MiniJumpBF(L):
    S = []        
    Jumps(L,0,0,S,False)
    return min(S) if (S) else -1

เหล่านี้เป็นรุ่น golfed:

def J(L,i,n,S,b):
    if (i == len(L)-1):
        S.append(n) if b else J(L[::-1],0,n,S,True)
    else:
        L2 = list(L)
        L2[i] = 0
        for j in range(1,min(L[i]+1,len(L)-i)):
            J(L2,i+j,n+1,S,b)
def MJ(L):
    S = []        
    J(L,0,0,S,False)
    return min(S) if (S) else -1

และตัวอย่างบางส่วน:

MJ( [2, 4, 2, 2, 3, 4, 2, 2] ) -->  6
MJ( [0, 2, 4, 2, 2, 3, 4, 2, 2] ) -->  -1
MJ( [3, 0, 0, 1, 4] ) -->  3
MJ( [2, 0] ) -->  -1
MJ( [1] ) -->  0
MJ( [10, 0, 0, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 10] ) -->  4
MJ( [3, 2, 3, 2, 1] ) -->  5
MJ( [1, 1, 1, 1, 1, 1, 6] ) -->  7
MJ( [7, 1, 1, 1, 1, 1, 1, 7] ) -->  2

มีศักยภาพมากสำหรับการเล่นกอล์ฟต่อไป แต่ไม่มีการจัดการอินพุตและเอาต์พุตซึ่งเป็นส่วนหนึ่งของปัญหานี้
Reinstate Monica

1
คุณมีตันของช่องว่างไม่จำเป็น ...
Doorknob

3

R - 195

x=scan(nl=1)
L=length
n=L(x)
I=1:(2*n-1)
P=n-abs(n-I)
m=0
for(l in I)if(any(combn(I,l,function(i)all(P[i[c(1,k<-L(i))]]==1,n%in%i,L(unique(P[i]))==k-1,diff(i)<=x[P][i[-k]])))){m=l;break}
cat(m-1)

จำลอง:

1: 2 4 2 2 3 4 2 2   # everything after 1: is read from stdin
6                    # output is printed to stdout

1: 1 0               # everything after 1: is read from stdin
-1                   # output is printed to stdout

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

x = scan(nlines = 1)       # reads from stdin
n = length(x)
index    = 1:(2*n-1)       # 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
position = c(1:n, (n-1):1) # 1  2  3  4  5  6  7  8  7  6  5  4  3  2  1
value    = x[position]     # 2  4  2  2  3  4  2  2  2  4  3  2  2  4  2
is_valid_path = function(subindex) {
  k = length(subindex)
  position[subindex[1]] == 1                  & # starts at 1
  position[subindex[k]] == 1                  & # ends at 1
  n %in% subindex                             & # goes through n (end of vector)
  length(unique(position[subindex])) == k - 1 & # visits each index once (except 1)
  all(diff(subindex) <= value[subindex[-k]])
}
min_length = 0
for(len in index) {
  valid_paths = combn(index, len, FUN = is_valid_path)
  if (any(valid_paths)) {
    min_length = len
    break
  }
}
min_jumps = min_length - 1
cat(min_jumps)             # outputs to stout

2

Python 271

นี่คือทางออกของฉัน:

## To simplify the process we unfold the forward-backward sequence
def unfold(L): return L + L[:-1][::-1]

## Possible jumps from a given L[i] position
def AvailableJumps(L,i): return range(1,L[i]+1)

# To disable a used position, in the forward and backward sites
# (the first one is not really necessary)
def Use(L,i):
    L[i] = 0
    L[ len(L) - i - 1] = 0
    return L

def Jumps(L,i,n,S):
    if (i >= len(L)-1): 
        S.append(n)
    else:
        Laux = list(L)
        Use(Laux,i)
        for j in AvailableJumps(L,i):
            Jumps(Laux,i+j,n+1,S)

def MiniJump(L):
    S = []        
    Jumps(unfold(L),0,0,S)
    return min(S) if (S) else -1

ตัวอย่าง:

print MiniJump([2,4,2,2,3,4,2,2])
print MiniJump([0,2,4,2,2,3,4,2,2])

และนี่คือเวอร์ชั่น golfed (บางส่วนตอนนี้):

def J(L,i,n,S):
    if (i >= len(L)-1): S.append(n)
    else:
        La = list(L)
        La[len(La) - i - 1] = 0
        for j in range(1,L[i]+1):
            J(La,i+j,n+1,S)

def MJ(L):
     S = []        
     J(L + L[:-1][::-1],0,0,S)
     return min(S) if (S) else -1

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

print MJ([2,4,2,2,3,4,2,2])
print MJ([0,2,4,2,2,3,4,2,2])
print MJ([3,4,0,0,6])

ไม่ถูกต้อง. ที่อินพุต [1] เอาต์พุตควรเป็น 0 (เอาต์พุตของคุณคือ 1) ที่อินพุต [3,0,0,1,4] เอาต์พุตควรเป็น 3 (เอาต์พุตของคุณคือ -1)
โค้ดการเข้ารหัส

@ คนเขียนโปรแกรม: โอ๊ะโอขอโทษ มีการตรวจสอบการกระโดดแบบ exrtra ถ้า (i> = len (L) -1): S.append (n) ดูเหมือนว่าจะแก้ปัญหา
Triadic

ยังคงให้ผลลัพธ์ที่ผิด ตัวอย่าง: [2,0] ---> 1 (ควรเป็น -1)
รหัสคน

@ คนเขียนโปรแกรม: ฉันคิดว่าวิธีการแก้ปัญหาของฉันขัดแย้งกับ "ดังนั้นมันควรจะชัดเจนว่าใครสามารถกระโดดจากตำแหน่งสุดท้ายได้เสมอ" ตามที่ฉันพิจารณา [2,0] ---> 1 ทางออกที่ถูกต้องเนื่องจาก มันกระโดดข้ามท้าย
Triadic

1
ฉันขอโทษสำหรับความผิดพลาดเหล่านี้ทั้งหมด บรรทัด "ดังนั้นจึงควรมีความชัดเจนว่าสามารถกระโดดจากตำแหน่งสุดท้ายได้เสมอ" ถูกลบแล้ว มันถูกใช้เพื่อหมายถึงว่าตำแหน่งสุดท้ายไม่เคยถูกใช้เมื่อเราก้าวไปข้างหน้าตามลำดับ ดังนั้นมันสามารถใช้สำหรับการกระโดดได้เมื่อเราเคลื่อนที่ไปข้างหลัง แต่ใน [2,0] ค่าที่ตำแหน่งสุดท้ายคือ 0 คุณสามารถกระโดดได้สูงสุด 0 การเคลื่อนไหว ดังนั้นคุณจะไม่สามารถไปถึงตำแหน่งเริ่มต้นได้ คำถามได้รับการปรับปรุง
คนเขียนโปรแกรม

2

ทับทิม - 246

a=gets.split.map &:to_i
L=a.size;r=[];a.collect!{|v|([1,v].min..v).to_a};S=a[0].product *a[1..-1];S.each{|s|i=0;b=L==1&&s[i]!=0 ?0:1;(L*2).times{|c|r<<c if i==L-1&&b==0;break if !s[i]||s[i]==0;if i==L-1;b=i=0;s.reverse!end;i+=s[i]}}
puts r.min||-1

จำลอง:

2, 4, 2, 2, 3, 4, 2, 2
6

0, 2, 4, 2, 2, 3, 4, 2, 2
-1

0
-1

1
0

2

Ruby - ประมาณ 700 golfed ฉันเริ่มเวอร์ชัน golfed ด้วยชื่อตัวอักษรเดียวสำหรับตัวแปรและวิธีการ แต่หลังจากชั่วครู่ฉันก็สนใจอัลกอริธึมมากกว่ากอล์ฟดังนั้นหยุดพยายามปรับความยาวโค้ดให้เหมาะสม ฉันไม่กังวลเกี่ยวกับการรับสายอินพุต ความพยายามของฉันอยู่ด้านล่าง

เพื่อช่วยให้คุณเข้าใจว่ามันทำงานอย่างไรฉันได้รวมความคิดเห็นที่แสดงว่ามีการจัดการสตริงอย่างไร (u = "2 1 4 3 0 3 4 4 3 5 0 3 3") ฉันระบุการรวมของ "หินในกระแส" ที่มีให้เพื่อกระโดดต่อไป สิ่งเหล่านี้ถูกแสดงด้วยสตริงไบนารี ฉันให้ตัวอย่าง 0b0101101010 ในความคิดเห็นและแสดงว่าจะใช้อย่างไร 1 ของสอดคล้องกับตำแหน่งของหินที่มีอยู่สำหรับการเดินทางครั้งแรก; 0 สำหรับการเดินทางกลับ สำหรับการจัดสรรแต่ละครั้งฉันใช้การเขียนโปรแกรมแบบไดนามิกเพื่อกำหนดจำนวนกระโดดน้อยที่สุดที่จำเป็นในแต่ละทิศทาง ฉันยังทำการเพิ่มประสิทธิภาพอย่างง่าย ๆ เพื่อกำจัดชุดค่าผสมบางอย่างก่อน

ฉันใช้มันด้วยสตริงที่ให้ไว้ในคำตอบอื่น ๆ และได้ผลลัพธ์เดียวกัน นี่คือผลลัพธ์อื่น ๆ ที่ฉันได้รับ:

"2 1 4 3 0 3 4 4 3 5 0 3"                             # =>  8
"3 4 3 5 6 4 7 4 3 1 5 6 4 3 1 4"                     # =>  7
"2 3 2 4 5 3 6 3 2 0 4 5 3 2 0 3"                     # => 10
"3 4 3 0 4 3 4 4 5 3 5 3 0 4 3 3 0 3"                 # => 11
"2 3 2 4 5 3 6 3 2 0 4 5 3 2 0 3 4 1 6 3 8 2 0 5 2 3" # => 14

ฉันสนใจที่จะฟังว่าคนอื่น ๆ จะได้ผลลัพธ์เหมือนกันสำหรับสายเหล่านี้หรือไม่ ประสิทธิภาพเหมาะสมดี ตัวอย่างเช่นใช้เวลาน้อยกว่าหนึ่งนาทีในการรับโซลูชันสำหรับสตริงนี้:

"3 4 3 0 4 3 4 4 5 3 5 3 0 4 3 3 0 3 4 5 3 2 0 3 4 1 6 3 2 0 4 5 3 2 0 3 4 1 6 3 0 4 3 4 4 5 0 1 1"

รหัสดังต่อไปนี้

I=99 # infinity - unlikely we'll attempt to solve problems with more than 48 rocks to step on

def leap!(u)
  p = u.split.map(&:to_i) # p = [2,1,4,3,0,3,4,4,3,5,0,3]
  s = p.shift        # s=2, p =   [1,4,3,0,3,4,4,3,5,0,3] # start
  f = p.pop          # f=3, p =   [1,4,3,0,3,4,4,3,5,0]   # finish
  q = p.reverse      #      q =   [0,5,3,4,4,3,0,3,4,1]   # reverse order
  # No path if cannot get to a non-zero rock from s or f
  return -1 if t(p,s) || t(q,f) 
  @n=p.size                  # 10 rocks in the stream
  r = 2**@n                  # 10000000000 - 11 binary digits 
  j = s > @n ? 0 : 2**(@n-s) #   100000000 for s = 2 (cannot leave start if combo number is smaller than j)
  k=r-1                      #  1111111111 - 10 binary digits

  b=I # best number of hops so far (s->f + f->s), initialized to infinity
  (j..k).each do |c|
    # Representative combo: 0b0101101010, convert to array
    c += r                     # 0b10 1 0 1 1 0 1 0 1 0
    c = c.to_s(2).split('').map(&:to_i)
                               # [1,0,1,0,1,1,0,1,0,1,0]
    c.shift                    #   [0,1,0,1,1,0,1,0,1,0] s->f: rock offsets available: 1,3,4,6,8
    d = c.map {|e|1-e}.reverse #   [1,0,1,0,1,0,0,1,0,1] f->s: rock offsets available: 0,2,5,7,9
    c = z(c,p)                 #   [0,4,0,0,3,0,4,0,5,0] s->f: max hops by offset for combo c
    d = z(d,q)                 #   [0,0,3,0,4,0,0,3,0,1] f->s: max hops by offset for combo c
    # Skip combo if cannot get from to a rock from f, or can't
    # get to the end (can always get to a rock from s if s > 0).
    next if [s,f,l(c),l(d)].max < @n && t(d,f)
    # Compute sum of smallest number of hops from s to f and back to s,
    # for combo c, and save it if it is the best solution so far.
    b = [b, m([s]+c) + m([f]+d)].min
  end
  b < I ? b : -1 # return result
end

# t(w,n) returns true if can conclude cannot get from sourch n to destination  
def t(w,n) n==0 || (w[0,n].max==0 && n < @n) end
def l(w) w.map.with_index {|e,i|i+e}.max end
def z(c,p) c.zip(p).map {|x,y| x*y} end

def m(p)
  # for s->f: p = [2,0,4,0,0,3,0,4,0,5,0] - can be on rock offsets 2,5,7,9
  # for f->s: p = [3,0,0,3,0,4,0,0,3,0,1] - can be on rock offsets 3,5,8,10
  a=[{d: 0,i: @n+1}]
  (0..@n).each do |j|
    i=@n-j
    v=p[i] 
    if v > 0
      b=[I]
      a.each{|h| i+v < h[:i] ? break : b << (1 + h[:d])}
      m = b.min
      a.unshift({d: m,i: i}) if m < I
    end
  end
  h = a.shift
  return h[:i]>0 ? I : h[:d]
end

0

Haskell, 173 166 ไบต์, 159 ไบต์ใน GHCi

นี่คือรุ่นปกติ:

นำเข้า Data.List

t=length
j[_]=0
j l=y[t f|f<-fst.span(>0)<$>permutations[0..t l-1],u<-f,u==t l-1,all(\(a,b)->abs(b-a)<=l!!a)$zip(0:f)$f++[0]]
y[]=0-1
y l=minimum l+1

นี่คือคำตอบ GHCi (ใส่ทีละบรรทัด):

t=length
y[]=0-1;y l=minimum l+1
j[_]=0;j l=y[t f|f<-fst.span(>0)<$>Data.List.permutations[0..t l-1],u<-f,u==t l-1,all(\(a,b)->abs(b-a)<=l!!a)$zip(0:f)$f++[0]]

เพียงแค่สัตว์เดียรัจฉาน สร้างคำตอบที่เป็นไปได้ (เช่นการเปลี่ยนแปลงของ [0..n-1] โดยมีค่าศูนย์และองค์ประกอบต่อไปนี้ลดลงจากนั้นตรวจสอบว่าคำตอบนั้นถูกต้องหรือไม่รับความยาวขั้นต่ำและเพิ่มทีละอัน (เนื่องจากเลขศูนย์นำหน้าและต่อท้ายถูกลบ)

วิธีใช้: j[3,4,0,0,6]->3


Data.List.permutationsไม่ทำงานใน GHC แต่เฉพาะใน GHCi ตามคู่มือกฎกอล์ฟของเราใน Haskellคุณควรเพิ่มการนำเข้าหรือทำเครื่องหมายคำตอบของคุณเป็น "Haskell GHCi" ตัวเลือกแรกเป็นที่นิยมของนักกอล์ฟ Haskell ในเว็บไซต์นี้
Laikoni

แทนที่จะa<-permutations[0..t l-1],let f=takeWhile(/=0)aคุณสามารถเขียนอีกครั้งซึ่งสามารถที่จะแข็งแรงเล่นกอล์ฟf<-map(takeWhile(/=0))(permutations[0..t l-1]) f<-fst.span(>0)<$>permutations[0..t l-1]ด้วยวิธีนี้คุณจะกลับไปเป็น 166 ไบต์โดยเพิ่มการนำเข้า: ลองออนไลน์!
Laikoni
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.