อัลกอริธึมการนับถอยหลัง


14

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

ตัวอย่างเช่นพวกเขาอาจพูดว่า:

1,2,3,4,7,8,9,10

บางครั้งเด็ก ๆ จะรู้ว่าพวกเขาข้ามตัวเลขบางส่วนแล้วย้อนกลับไปที่:

1,2,3,4,7,8,5,6,7,8,9,10

นี่เป็นรูปแบบที่ชัดเจนอย่างชัดเจน เราจำเป็นต้องระบุพวกเขา

ในการระบุรายการเหล่านี้:

  1. เราระบุขั้นต่ำMและสูงสุดNของรายการ

  2. เราก้าวผ่านรายการ หากหมายเลขปัจจุบันมากกว่าหรือเท่ากับสมาชิกใด ๆ ของรายการทางด้านขวาเราจะลบหมายเลขปัจจุบัน

  3. Iff รายการที่เหลือประกอบด้วยตัวเลขทั้งหมดตั้งแต่MถึงถึงNจากนั้นเราจะคืนค่าความจริง

คุณสามารถสันนิษฐานว่ารายการอินพุตของคุณจะมีองค์ประกอบอย่างน้อย 1 องค์ประกอบ คุณสามารถสันนิษฐานได้ว่าจำนวนเต็มทั้งหมดจะไม่เป็นลบ

กรณีทดสอบ:

Truthy:

0
10
0 0 0 
1 0 1
0 1 2 3 4 5 6 7 8 9 10
0 1 2 3 0 1 2 3
0 1 2 3 4 5 5
0 1 1 2 2 3
0 3 6 1 4 7 2 5 8 3 4 5 6 7 8
1 3 5 7 2 3 4 5 6 7
5 6 0 1 2 3 6 7 4 5 6 7
5 6 7 8
5 5 6 7 8
4 6 7 8 3 4 5 6 7 8

Falsy:

1 0
4 3 2 1
1 2 3 7 8 9
0 1 2 3 1 3
0 1 2 3 1 3 4
0 1 2 3 1 3 2 4
0 1 2 3 1 3 2 4 3
1 3 5 7 2 4 6 8
0 1 2 1 3 4 5 6
4 5 6 3 4 5

นี่คือดังนั้นจงตอบให้สั้นที่สุด!


ไม่ชัดเจน: ควรพิจารณา [0,1,2,3,4,5,4,3,2,1] จริงหรือเท็จ?
GB

1
@GB False เมื่อคุณอยู่ในองค์ประกอบที่สองคุณจะลบมันในขั้นตอนที่ 2 (เพราะมีอีกหนึ่ง1บรรทัดในภายหลัง) นอกจากนี้คุณยังต้องลบองค์ประกอบอื่น ๆ ทั้งหมด (ยกเว้นในช่วง 1 ล่าสุด) ดังนั้นคุณจะจบลงด้วย0 1ซึ่งไม่ใช่0 1 2 3 4 5
Nathan Merrill

คำตอบ:


6

05AB1E , 5 ไบต์

ฉันไม่แน่ใจ 100% ว่าใช้งานได้ แต่ผ่านทุกกรณีทดสอบและฉันไม่สามารถพบสถานการณ์ใด ๆ ที่มันล้มเหลว

Ú¥1QP

ลองออนไลน์!

Ú¥1QP   Main link. Argument a
Ú       Reverse uniquify a, keeps only last occurence of each element
 ¥      Get all deltas - all 1 if ascending list
  1Q    Compare all deltas to 1
    P   Product of all results

ในความเป็นจริง 7 ไบต์
วาลพูดว่า Reinstate Monica

2
@val No, 05AB1E ใช้การเข้ารหัสแบบกำหนดเอง 05AB1E
Erik the Outgolfer

2

เยลลี่ , 10 9 ไบต์

ṀrṂɓṚ«\Q⁼

ลองออนไลน์!

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

ṀrṂɓṚ«\Q⁼  Main link. Argument: A (array)

Ṁ          Yield the maximum of A.
  Ṃ        Yield the minimum of A.
 r         Yield R := [max(A), ... min(A).
   ɓ       Begin a new chain. Left argument: A. Right argument: R
    Ṛ      Reverse A.
     «\    Take the cumulative minimum.
       Q   Unique; deduplicate the results.
        ⁼  Compare the result with R.

ที่น่าสนใจคือɓคุณสมบัติที่ค่อนข้างใหม่
ETHproductions

ใช่มันมาจากคำขอดึงโดย Jonathan Allan
เดนนิส

อ๊ะ 13 วันที่แล้ว ยังไม่เคยเห็นมันใช้มาก่อน (บางทีคุณหรือโจนาธานมีและฉันเพิ่งพลาด)
ETHproductions

ส่วนที่น่าสนใจจริง ๆ ที่นี่อยู่«\ในความคิดของฉัน
Erik the Outgolfer



1

PHP , 148 130 ไบต์

-18 ไบต์ขอบคุณ @Christoph

$a=explode(' ',$argn);$b=range(min($a),max($a));foreach($a as$i=>&$k)for(;++$i<count($a);)$k<$a[$i]?:$k=-1;echo!array_diff($b,$a);

ลองออนไลน์!


ตกลงมากที่จะแสดงความคิดเห็นที่นี่: $argnอยู่เสมอสตริงforeachไม่ทำงานบนมัน คุณสามารถใช้$argvเพื่อรับอาร์เรย์เป็นอินพุต แต่ระวังว่ามันจะมีชื่อไฟล์เป็นองค์ประกอบแรกเสมอ คุณสามารถใช้$mและ$nเพียงครั้งเดียวเพื่อให้คุณสามารถบันทึกจำนวนมากของไบต์สร้างก่อนหน้านี้:$b $b=range(min($a),max($a));การโยน(bool)นั้นไม่จำเป็นอย่างสมบูรณ์ ไปยังif($k>=$a[$s])$a[$i]=null; $k<$a[$s]?:$a[$i]=-1;โดยใช้การอ้างอิงที่เราสามารถทำเช่นนี้: foreach($a as$i=>&$k)(1 ไบต์) และ$a[$i]จะ$k(-4 ไบต์) ยิ่งไปกว่านั้นนั่นทำให้เราลดลง$s=$iเพราะเราสามารถทำซ้ำ$iได้โดยตรงในตอนนี้
Christoph

ผลลัพธ์มีลักษณะเช่นนี้$a=$argn;$b=range(min($a),max($a));foreach($a as$i=>&$k)for(;++$i<count($a);)$k<$a[$i]?:$k=-1;echo!array_diff($b,$a);(117 ไบต์) แต่ก็ยังคงใช้$argnในทางที่ผิด$a=explode(' ',$argn);จะแก้ไขปัญหานี้อีก 13 ไบต์
Christoph

1
ไม่มีปัญหา ! ดีใจที่ได้พบนักกอล์ฟ PHP คนใหม่ฉันหวังว่าจะได้เห็นคุณมากขึ้น :) ทั้ง Titus, Jörgหรือฉันอยู่ที่นั่นเสมอเพื่อช่วย!
Christoph

1
@Christoph ทำไมไม่ใช้$_GETเป็น Input Input? ในกรณีนี้ไม่จำเป็นต้องใช้explodeadditonal -6 Bytes สำหรับการใช้$bตัวแปรไม่ใช่
JörgHülsermann

1
@Christoph โอเคในกรณีนี้เราต้องมีเวอร์ชันต่ำกว่า 7.1 และเราใช้´a & `แทนที่จะ~ ลองออนไลน์!
JörgHülsermann

1

Java 8, 264 262 ไบต์

import java.util.*;l->{int m=Collections.max(l),n=Collections.min(l),i=0,q;for(;i<(q=l.size());i++)if(l.subList(i+1,q).size()>0&&l.get(i)>=Collections.min(l.subList(i+1,q)))l.remove(i--);for(i=0;n<=m;)if(i<l.size()&&l.get(i++)==n)n++;else return 0>1;return 1>0;}

คำอธิบาย:

ลองที่นี่

import java.util.*;                 // Import for Collections

l->{                                // Method with integer-ArrayList parameter and boolean return-type
  int m=Collections.max(l),         //  Max of the list
      n=Collections.min(l),         //  Min of the list
      i=0,q;                        //  Two temp integers
  for(;i<(q=l.size());i++)          //  Loop (1) over the list
    if(l.subList(i+1,q).size()>0    //   If the sublist right of the current item is not empty
    &&l.get(i)>=Collections.min(l.subList(i+1,q))) 
                                    //   and if the current item is larger or equal to the lowest value of this sublist
      l.remove(i--);                //    Remove the current item from the main list
                                    //  End of loop (1) (implicit / single-line body)
  for(i=0;n<=m;)                    //  Loop (2) from min to max
    if(i<l.size()                   //   If the current item doesn't exceed the list's size
    &&l.get(i++)==n)                //   and the items are in order so far
      n++;                          //    Go to the next item
    else                            //   Else:
      return 0>1;//false            //    Return false
                                    //  End of loop (2) (implicit / single-line body)
  return 1>0;//true                 //  Return true
}                                   // End of method

1

R, 88 85 ไบต์

y=NULL;for(i in x<-scan())if(all(i<x[-(1:(F<-F+1))]))y=c(y,i);all(min(x):max(x)%in%y)

สิ่งนี้อาจจะสามารถเล่นกอล์ฟต่อไปได้ วนรอบองค์ประกอบของxตรวจสอบว่าค่าที่จะเกิดขึ้นทั้งหมดนั้นใหญ่กว่าหรือไม่จากนั้นจะเก็บองค์ประกอบนั้นไว้ หลังจากวนรอบมันจะสร้างลำดับจากmin(x)ถึงmax(x)และตรวจสอบ%in%ว่าค่าทั้งหมดรวมอยู่ในเวอร์ชันที่ตัดxแล้วหรือไม่


ด้วยการตอบคำตอบของเดนนิสเราสามารถลดขนาดได้ถึง 53 ไบต์ function(n)all(unique(cummin(rev(n)))==max(n):min(n))
Giuseppe

1

JavaScript (ES6), 60 ไบต์

s=>(o={},s.reverse().every((n,i)=>!i|o[n+1]|o[n]&&(o[n]=1)))

Ungolfed:

s=>(
  o={},
  s.reverse().every((n,i)=>
    !i|o[n+1]|o[n]&&(o[n]=1)
  )
)

นี่เป็นอัลกอริทึมที่ง่ายกว่า:

วนซ้ำอาร์เรย์และตรวจสอบให้แน่ใจว่าตัวเลขแต่ละตัว (ยกเว้นตัวแรก) เป็นจำนวนที่น้อยกว่าหรือเท่ากับจำนวนที่เห็นอยู่แล้ว

ตัวอย่างข้อมูล:


1

Haskell, 62 ไบต์

g(a:b)=[a|all(a<)b]++g b
g a=a
f x=g x==[minimum x..maximum x]

ลองออนไลน์!

การนำไปปฏิบัติโดยตรงของคำจำกัดความที่gเอาองค์ประกอบถ้าพวกเขา> = กว่าองค์ประกอบทางด้านขวา


1

C #, 69 ไบต์

s=>s.Where((e,i)=>s.Skip(i+1).All(r=>e<r)).Count()==s.Max()-s.Min()+1

ในระยะสั้น:
s = input (s) equence
นำมาจากองค์ประกอบ s ที่รายการทั้งหมดหลังจากนี้ (ข้าม (I) ndex + 1 รายการ) ค่าปัจจุบันจะ
นับที่สูงขึ้นเหล่านี้และดูว่าจำนวนที่เหลือจะเท่ากับจำนวนที่คาดหวัง ((สูงสุด) ค่า imum ลบ (min) imum) จำนวนของตัวเลข

ลองออนไลน์!


@MDXF คุณต้องการที่จะต้อนรับเขาหรือไม่?
Stan Strum

@StanStrum ฉันเข้าใจผิดกฎหรือไม่ ภาษาอังกฤษของฉันยุ่งเกินไปหรือไม่ ฉันกำลังโพสต์เป็นครั้งแรก ...
Barodus

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

ดูเหมือนว่าสิทธิพิเศษนั้นสำหรับคุณทั้งคู่ ขอบคุณผู้คน ^^
Barodus

นี่เป็นคำตอบแรกที่ดีหวังว่าคุณจะสนุกในอนาคตของ PPCG!
Stan Strum

0

JavaScript (ES6), 82 73 72 70 ไบต์

ส่งคืนบูลีน

a=>a.filter((x,i)=>k-=a.every(y=>~i--<0|y>x,m=x>m?x:m),m=k=0)[0]+~m==k

อย่างไร?

เราวนซ้ำแต่ละองค์ประกอบxของอินพุตอาร์เรย์a , ติดตามค่าสูงสุดที่พบmและตัวเลข-kของค่าที่ไม่มากกว่าหรือเท่ากับสมาชิกใด ๆ ทางด้านขวา ตามคำจำกัดความค่าที่ถูกต้องจะปรากฏขึ้นตามลำดับจากน้อยไปหามาก

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

สุดท้ายเราทดสอบว่าminimum - (maximum + 1) == -number_of_valid_elements:

a.filter(...)[0] + ~m == k

กรณีทดสอบ

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