จำนวนการเชื่อมโยงกริยา


27

ปัญหา:

งานของคุณคือการตัดสินใจว่าในลำดับของตัวเลขทุกหมายเลขมีอย่างน้อยหนึ่งในตัวเลขของตัวเลขที่นำหน้ามัน

ตัวอย่างเช่นสิ่งต่อไปนี้ควรกลับมาจริง

[1, 12, 203, 0, 30]
             ^   ^ Contains a 0
        ^ Contains a 2
    ^ Contains a 1

ต่อไปนี้ควรกลับสู่ความผิดพลาด:

[1, 32, 23, 34]
    ^ Doesn't contain a 1, therefore false

การส่งของคุณอาจเป็นฟังก์ชั่นหรือโปรแกรมเต็มรูปแบบ

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

อินพุตสามารถเรียงลำดับได้ตามสมควร อาร์เรย์ของตัวเลขอาร์เรย์ของสตริงสตริงที่คั่นด้วยตัวเลข ฯลฯ

อย่างไรก็ตามการสั่งซื้อมีความสำคัญดังนั้นโครงสร้างใดก็ตามที่คุณเลือกที่จะยอมรับเนื่องจากการป้อนข้อมูลจะต้องมีลำดับที่ชัดเจน

สามารถป้อนข้อมูลผ่าน stdin หรือเป็นอาร์กิวเมนต์

คุณสามารถสันนิษฐานได้ว่า:

  • ตัวเลขทั้งหมดจะเป็นจำนวนเต็มไม่เป็นลบ

  • ข้อมูลที่ป้อนจะมีตัวเลขอย่างน้อย 2 ตัวเสมอ

  • หมายเลขอินพุตจะไม่ขึ้นต้นด้วย 0

เอาท์พุท:

ผลลัพธ์จะเป็นค่าจริงหรือเท็จ (ตามที่กำหนดโดยภาษาของคุณ) แสดงว่าเป็นไปตามข้อกำหนดข้างต้นหรือไม่

ความจริง / ค่าเท็จไม่จำเป็นต้องสอดคล้องกันระหว่างการทดสอบ

สามารถส่งเอาต์พุตไปยัง stdout หรือส่งคืนได้

กรณีทดสอบ:

True cases:
[1, 1, 1, 11, 111, 11, 1]
[12, 23, 34, 45, 56]
[65, 54, 43, 32, 21]
[123, 29, 9, 59, 55, 52, 2017, 2]
[1234567890, 19, 95, 5012, 23]

False cases:
[1, 2, 3, 4, 5, 1, 11] (2 doesn't contain a 1)
[12, 23, 33, 45] (45 doesn't contain a 3)
[98, 87, 76, 11, 12, 23] (11 doesn't contain a 7 or 6)

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

คำตอบ:




12

เรติน่า25 25ไบต์

(.).*¶(?=.*\1)

^.+$

ลองออนไลน์!

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


11

Brachylogขนาด 9 ไบต์

{⊇ᵐ=∧?t}ˡ

ลองออนไลน์!

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

คำอธิบาย

{      }ˡ       Left fold on the input:
 ⊇ᵐ=              It is possible to find a number which is a subset of both input numbers
    ∧             (and)
     ?t           The output is the second number (to continue the fold)

2
มันเท่ห์มาก ดูเหมือนว่า ... ประกาศ? อ่านเหมือนว่าคุณเพิ่งบอกภาษาสเปค
Carcigenicate

3
@Carcigenicate Brachylog จะเปิดเผยจริงมันอยู่บนพื้นฐานที่เปิดเผยโปรแกรมตรรกะภาษาเปิดฉาก
ทำให้เสียชีวิต

2
พิสูจน์จริง ๆ แล้วในรายการภาษาที่ยาวขึ้นเรื่อย ๆ ของฉันเพื่อเรียนรู้เมื่อฉันมีเวลาว่างไม่ จำกัด มีภาษาที่ยอดเยี่ยมมากเกินไป!
Carcigenicate

8

JavaScript (ES6), 47 44 * 43 ไบต์

บันทึกเป็นไบต์ด้วย @Neil

x=>x.every(y=>y.match(`[${p}]`,p=y),p=1/19)

รับอินพุตเป็นรายการของสตริง

ตัวอย่างการทดสอบ

* ( ขีดฆ่า 44 ยังคงเป็นปกติ 44 )


ใช้งานไม่`[${p}]`ได้?
Neil

@Neil ไม่ใช่รายการแรกของแต่ละอาร์เรย์
ETHproductions

อาฉันเห็นคุณพบวิธีแก้ปัญหา ฉันได้เท่าที่a=>a.reduce((l,r)=>`${l}`.match(`[${r}]`)&&r)(ซึ่งยังใช้งานได้สำหรับการป้อนข้อมูลที่เป็นตัวเลข)
Neil

บางทีคุณสามารถลบp&&หากคุณตั้งค่าp=1/19?
Neil

@ Neil I, เอ่อ ... เอ่อ ... นั่นคืออัจฉริยะขอบคุณ :-)
ETHproductions

6

05AB1E , 10 ไบต์

ü‚vy`Så1åP

ลองออนไลน์! หรือเป็นชุดทดสอบ

คำอธิบาย

ü‚          # map pairing over each pair in input
  v         # for each pair
   y`       # push as 2 separate elements on stack
     Så     # check each digit in 2nd number for membership in first
       1å   # check if any 1 exists in the resulting list
         P  # product of stack

€Sü.å- ฉันหวังว่ามันจะทำงานเหมือนที่ฉันคิด
Magic Octopus Urn

@carusocomputing: ใช่นั่นคงจะดีมาก หรือเพียงแค่หรือü.å €Süå
Emigna

เหตุใดจึงไม่ทำงานร่วมกับคำสั่ง dot อีกครั้ง
Magic Octopus Urn

1
@carusocomputing: มันถูกใช้เพื่อรับไบต์ต่อไปเป็นคำสั่ง ไม่คำนึงถึงจุด
Emigna

6

CJam , 18 15 14 ไบต์

บันทึกแล้ว 4 ไบต์ขอบคุณ Martin Ender

l~Afb_1>.&:,:*

ลองออนไลน์!

คำอธิบาย

l~              e# Read and eval the input
  Afb           e# Convert each number to a list of digits
     _          e# Duplicate the array
      1>        e# Slice it after the first element
        .&      e# Vectorized set intersection; take the set intersection of corresponding 
                e#  elements of the two arrays
          :,    e# Get the length of each intersection
            :*  e# Take the product of the whole array. 
                e#  Will be 0 if any intersection was empty.

6

Haskell, 51 48 35 Bytes

-3 ไบต์ขอบคุณ @NickHansen! ฉันต้องดีขึ้นจริง ๆ กับผู้ประกอบการ monad

-4 และ -9 ไบต์ขอบคุณ @Laikoni และ @nimi ตามลำดับ!

and.(zipWith(any.flip elem)=<<tail)

รุ่นนี้ใช้อินพุตเป็นอาร์เรย์ของสตริงขจัดความต้องการshowแต่เท่าที่ฉันเห็นมันทำงานในลักษณะเดียวกับเวอร์ชั่นเก่า:

all(\(x,y)->any(`elem`x)y).(zip=<<tail).map show

(ฉันค่อนข้างแน่ใจว่าฉันได้รับอนุญาตให้ส่งฟังก์ชันที่ไม่ระบุชื่อเช่นนี้ แต่ฉันจะแก้ไขถ้าจำเป็น)

ก่อนอื่นตัวเลขจะถูกแปลงเป็นสตริง จากนั้นเวทมนตร์ monad zip=<<tailจะสร้างฟังก์ชั่นที่บีบอัดรายการด้วยตัวเองซึ่งจับคู่แต่ละรายการกับเพื่อนบ้าน จากนั้นallแมปแลมบ์ดากับแต่ละคู่ที่ตรวจสอบว่าสตริงหนึ่งมีตัวอักษรใด ๆ จากอีกชุดหนึ่งหรือไม่และตรวจสอบว่าพวกเขาทั้งหมดออกมาในTrueที่สุด

เวอร์ชั่นเก่าที่ใช้งานได้ในลักษณะเดียวกัน:

f a=and$zipWith(\b->any(`elem`show b).show)a$tail a

ฉันสามารถโกนไบต์ด้วยการใช้ zip และบางส่วน (->) monad trickery: f (x, y) = any ('elem'x) y; g = all f. (zip = << tail) .map show . แก้ไข: elem ควร [หวังอย่างชัดเจน] อยู่ใน backticks แต่นั่นเป็นไปไม่ได้ด้วยตัวจัดรูปแบบความคิดเห็น
Nick Hansen

44 ไบต์:and.(zipWith(any.flip elem)=<<tail).map show
Laikoni

มันได้รับอนุญาตให้ใช้การป้อนข้อมูลที่เป็นรายการของสตริงเช่นเพื่อให้คุณสามารถวาง["1234567890", "19", "95", "5012", "23"] .map show
nimi

5

Mathematica 62 47 35 bytes

ด้วยขนาด 12 ไบต์ที่บันทึกไว้ต้องขอบคุณ MartinE

FreeQ[#⋂#2&@@@Partition[#,2,1],{}]&

FreeQ[#⋂#2&@@@Partition[#,2,1],{}]&[{{1},{1,2},{2,0,3},{0},{3,1}}]

เท็จ

FreeQ[#⋂#2&@@@Partition[#,2,1],{}]&[{{1},{1,2},{2,0,3},{0},{3,0}}]

จริง


4

Ruby, 49 48 ไบต์

->x{x.each_cons(2){|z|x&&=z*' '=~/(.).* .*\1/};x}

เอาท์พุทเป็นnilเท็จและจำนวนเต็ม "สุ่ม" เป็นจริง


4

Java 8, 94 90 87 ไบต์

อินพุตคืออาร์เรย์ของสตริงที่แทนตัวเลข เริ่มต้นด้วยสตริงที่สองมันทำการเปรียบเทียบนิพจน์ปกติกับสตริงก่อนหน้านี้เพื่อดูว่ามีอักขระใด ๆ หรือไม่:.*[previous string].*ของมัน

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

a->{int r=1,i=0;while(++i<a.length)r*=a[i].matches(".*["+a[i-1]+"].*")?1:0;return r>0;}

Ungolfed:

public class NumberChainingPredicate {

  public static void main(String[] args) {
    System.out.println("Expect true:");
    for (String[] input : new String[][] { { "1", "1", "1", "11", "111", "11", "1" }, { "12", "23", "34", "45", "56" },
        { "65", "54", "43", "32", "21" }, { "123", "29", "9", "59", "55", "52", "2017", "2" },
        { "1234567890", "19", "95", "5012", "23" } }) {
      System.out.println(java.util.Arrays.toString(input) + " = " + exec(f(), input));
    }

    System.out.println();
    System.out.println("Expect false:");
    for (String[] input : new String[][] { { "1", "2", "3", "4", "5", "1", "11" }, { "12", "23", "33", "45" },
        { "98", "87", "76", "11", "12", "23" } }) {
      System.out.println(java.util.Arrays.toString(input) + " = " + exec(f(), input));
    }
  }

  private static java.util.function.Function<String[], Boolean> f() {
    return a -> {
      int r = 1, i = 0;
      while (++i < a.length) {
        r *= a[i].matches(".*[" + a[i - 1] + "].*") ? 1 : 0;
      }
      return r > 0;
    };
  }

  private static boolean exec(java.util.function.Function<String[], Boolean> function, String[] input) {
    return function.apply(input);
  }

}

ดี! สั้นกว่าที่ฉันจะโพสต์ .. อย่างไรก็ตามคุณสามารถตีกอล์ฟได้อีก: a->{for(int i=1;i<a.length;)if(!a[i].matches(".*["+a[i++-1]+"].*"))return 0>1;return 1>0;}( 90 ไบต์ )
Kevin Cruijssen

ฉันเล่นกอล์ฟถึง 90 แต่ในทางที่ต่างออกไป:a->{int r=1;for(int i=0;++i<a.length;)r*=a[i].matches(".*["+a[i-1]+"].*")?1:0;return r>0;}
ธุรกิจ Cat

1
ไม่เป็นไรไปถึง 87:a->{int r=1,i=0;for(;++i<a.length;)r*=a[i].matches(".*["+a[i-1]+"].*")?1:0;return r>0;}
แมวธุรกิจ

ขอบคุณทั้งคู่ ฉันคิดว่าวิธีเดียวที่จะปรับปรุงสิ่งนี้ด้วยจำนวนที่มีความหมายในขณะนี้คือการดูที่ regex

4

เยลลี่ 6 ไบต์

Dµf"ḊẠ

ลองออนไลน์!

คำอธิบาย

Dµf"ḊẠ
Dµ        Treat the first (i.e. only) input as a list of decimal digits
   "      For each pair of corresponding elements in {the input digits} and
    Ḋ     {the input digits} with the first element removed
  f       take all elements common to both sides
     Ạ    then return true if the result has no empty lists, false otherwise

เห็นได้ชัดที่สุดคือพยายามใช้2/ที่นี่ แต่ที่เรียกใช้ฟังก์ชั่นยูนารีในทุกส่วนของขนาด 2 ได้"Ḋอย่างมีประสิทธิภาพเรียกใช้ฟังก์ชั่นไบนารีในทุกองค์ประกอบที่อยู่ติดกันคู่ซึ่งหมายความว่าเราสามารถใช้fโดยตรง (แทนที่จะต้องการแปลง ฟังก์ชั่นตามf/) นี้จะจบลงด้วยการออกจากองค์ประกอบสุดท้ายของการป้อนข้อมูลในสถานที่ แต่โชคดีที่ไม่ได้ใส่ 0 กลายเป็นรายการที่ว่างเปล่าเมื่อแปลงเป็นทศนิยมดังนั้นจึงไม่มีผลกระทบต่อ




3

05AB1E , 5 ไบต์

รหัส:

üÃõå_

ใช้การเข้ารหัสCP-1252 ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด! .

คำอธิบาย:

üà         # Intersection on each pair
  õå       # Check if the empty string exists
    _      # Boolean negate

โอ้มันใช้ได้ผล! RüÃõå_เป็นสิ่งที่ฉันคิดขึ้นมาเอง ฉันรู้สึกเป็นเกียรติที่ได้ใกล้เคียงกับคำตอบที่ดีที่สุดของคุณโดยการลบของฉัน ทำไมคุณถึงไม่ต้องการRมัน
Magic Octopus Urn

1
@carusocomputing อืมแล้วมันเป็นRอะไรไป : p
Adnan

2

PowerShell , 87 ไบต์

param($n)(1..($a=$n.length-1)|?{[char[]]$n[($i=$_)-1]|?{$n[$i]-like"*$_*"}}).count-eq$a

ลองออนไลน์!

ไม่ได้เป็นที่สั้นที่สุดโดยมาตรการใด ๆ แต่วิธีการที่แตกต่างกันเล็กน้อยกว่าคนอื่น ๆ กำลังใช้และการแสดงปิดดี|?{}การทำงาน

สิ่งนี้ใช้อินพุตเป็นอาร์เรย์ของสตริงลงใน$nจากนั้นวนซ้ำจาก1ไปจนถึง length-1เราใช้Where-Object(the |?{...}) เพื่อดึงดัชนีที่เป็นจริงสำหรับเงื่อนไขเฉพาะออกมา คุณสามารถคิดเช่นนี้เช่นเดียวกับการforวนซ้ำifประโยค

[char[]]$n[($i=$_)-1]|?{$n[$i]-like"*$_*"}ประโยคที่นี่คือ นั่นคือเรากำลังนำดัชนีปัจจุบัน$_ตั้งค่าไปที่$iและลบ1และใช้ดัชนีนั้น$n(เช่นเพื่อให้เราได้รับองค์ประกอบก่อนหน้าในอาร์เรย์อินพุตของเรา) นั่นคือการส่งเป็นcharอาเรย์และส่งผ่านWhere-Objectขั้นตอนอื่น

ประโยคด้านใน$n[$i]-like"*$_*"ระบุว่าสตริงที่ดัชนีปัจจุบัน$iคือ-likeอักขระปัจจุบัน$_จากดัชนีก่อนหน้า สิ่งนี้จะออกอักขระใด ๆ ที่เหมือนกันระหว่างองค์ประกอบอาร์เรย์สองตัว ดังนั้นประโยคด้านนอกจะเป็นจริงถ้ามีอักขระที่เหมือนกัน (เนื่องจากอาร์เรย์ที่ว่างเปล่าเป็นเท็จใน PowerShell) และดัชนีจะถูกเลือกก็ต่อเมื่อมีอักขระร่วมกันเท่านั้น

จากนั้นเรารวบรวมดัชนีทั้งหมดที่ตรงกับเกณฑ์และตรวจสอบว่าดัชนี.countดังกล่าวมี-eqความยาวตามความยาวของอาร์เรย์อาร์เรย์ ผลลัพธ์บูลีนนั้นถูกทิ้งไว้บนไพพ์ไลน์และเอาต์พุตนั้นเป็นนัย



2

APL (Dyalog APL)ขนาด 9 ไบต์

∧/×≢¨2∩/⎕

ลองออนไลน์!

∧/ ทุกคนในรายการ

× สัญญาณ

 ของการนับของ

¨ แต่ละ

2∩/ จุดตัดคู่ที่ชาญฉลาดของ

 อินพุตหรือไม่


ฉันไม่แน่ใจว่า "สัญญาณ" หมายถึงอะไร แต่คุณสามารถสันนิษฐานได้ว่าตัวเลขทั้งหมดจะเป็นค่าบวก
Carcigenicate

@Carcigenicate สามารถเป็นศูนย์ได้เช่นกัน
อดัม

ใช่ขอโทษ. "ไม่เชิงลบ"
Carcigenicate

2

PHP, 65 68

for(;null!==$a=$argv[++$i+1];)$r+=$a==strtr($a,$argv[$i],_);echo!$r;

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


คงผิดพลาดใช้triminsted strtrของ ขอบคุณ @ JörgHülsermann


ขอโทษที่ยิ่งใหญ่ สำหรับผลตอบรับที่ได้จากโซลูชันของคุณ ["filename",1,11,414]ใช้งานไม่ได้
JörgHülsermann

@ JörgHülsermannแน่ใจว่าtrimใช้ได้เฉพาะกับตัวอักษรนำหน้าและต่อท้ายเท่านั้น ซ่อมมัน.
Christoph

สำหรับ PHP <7.1 คุณสามารถใช้a&แทนnull!==(-5 ไบต์)
ติตัส

... แต่สิ่งนี้จะใช้ได้กับหลักแรก$argv[$i]เท่านั้นเนื่องจาก "หากจากและมีความยาวต่างกันอักขระพิเศษที่อยู่ในความยาวของทั้งสองจะถูกละเว้น" (จากคู่มือ)
Titus

2

PHP, 75 ไบต์

for($b=3**39;--$argc;)preg_replace("#[$b]#","",$b=$argv[$argc])<$b?:die(1);

ใช้ตัวเลขจากอาร์กิวเมนต์บรรทัดคำสั่ง ออกด้วย1เพื่อความเท็จด้วยความ0จริง
ทำงานด้วย-rหรือทดสอบออนไลน์

  • เริ่มต้นด้วย$b= ตัวเลขที่มีตัวเลขทั้งหมด
  • วนรอบผ่านอาร์กิวเมนต์
    • ลบตัวเลขทั้งหมดออก$bจากอาร์กิวเมนต์
    • คัดลอกอาร์กิวเมนต์ไปที่ $b
    • หากไม่มีการลบตัวเลขออกให้ออกด้วย 1
  • นัย: ออกด้วย 0

1

PHP, 77 ไบต์

for($i=$t=1;++$i<$argc;)$t*=preg_match("#[{$argv[$i-1]}]#",$argv[$i]);echo$t;

1
ทางเลือก: foreach($argv as$k=>$v)$t=$k--?$t*preg_match("#[{$argv[$k]}]#",$v)):1;echo$t;, 77 ไบต์ (ไม่ได้ทดสอบ)
Ismael Miguel

1
@IsmaelMiguel หนักทางเลือกแรกที่คุณต้องเปลี่ยน$k--ไป--$kและวางหนึ่ง) หลังจากนั้นวิธีการของคุณควรจะทำงานและคุณต้องเพิ่ม @ สำหรับคำเตือน
JörgHülsermann

โอ้ใช่ไม่ได้สังเกตเห็นวงเล็บที่ไร้ประโยชน์ซึ่งทำให้เกิดข้อผิดพลาดทางไวยากรณ์ $k--และผมไม่เห็นด้วยเกี่ยวกับ ฉันใช้มันโดยเฉพาะเพื่อให้ $ k ยังคงเป็น 0 ในการเรียกใช้ครั้งแรก และการตักเตือนนั้นไม่น่าสนใจ นั่นหมายความว่าตอนนี้รหัสคือ 76 ไบต์ แต่ก็ยังไม่ได้ทดสอบ
Ismael Miguel

หลังจากการแก้ไขฉันสามารถยืนยันได้ว่าforeach($argv as$k=>$v)$t=$k--?$t*preg_match("#[{$argv[$k]}]#",$v):1;echo$t;ทำงานได้ตามปกติ การทดสอบกับ$argv = array(1, 12, 123, 3, 34, 45, 5, 5);จอแสดงผล 1และการทดสอบกับ$argv = array(1, 12, 123, 3, 34, 45, 5, 6);จอแสดงผล0ตามที่คาดไว้
Ismael Miguel

@IsmaelMiguel คุณลืมว่าพารามิเตอร์แรกในชื่อไฟล์คือ
JörgHülsermann

1

MATL , 14 ไบต์

1&)"V@VX&nv@]x

ลองออนไลน์!

ขอบคุณ @LuisMendo สำหรับการบันทึกไบต์ คำอธิบาย:

1&)            % 'Pop' the first item from the input and push it on the stack.
   "       ]   % Main 'for' loop, to loop over the rest of the input.
    V            % Stringify previous (or first) iten from the input.
     @V          % Push current number, convert to string
       X&        % Intersect with stringified number already on the stack.
         nv      % Count the size of the intersection, and add it to the existing list of sizes.
           @     % Push the current number again for the intersection in the next loop. 
             x % Remove the number pushed by the last loop.
               % Else the program would end with the result on the second instead of the first position in the stack

คุณสามารถบันทึกการแทนที่ไบต์1)VGด้วย1&)(และหลีกเลี่ยงการทำซ้ำหมายเลขแรก)
Luis Mendo

@ LuisMendo แน่นอน! ฉันจำได้ไม่ชัดว่า MATL มีฟังก์ชั่นนี้ แต่การค้นหา "ป๊อป" (เช่นในคิวหรือสแต็ค) ในสเป็คไม่ได้ให้ผลลัพธ์ใด ๆ ดังนั้นฉันคิดว่าฉันเข้าใจผิด
Sanchises

ใช่จริง ๆ แล้วมันเป็นกรณีของการจัดทำดัชนีอ้างอิง ด้วยสองเอาต์พุตการดำเนินการทำดัชนีอ้างอิงเช่น)ให้ค่าที่เลือกเป็นเอาต์พุตแรกจากนั้นค่าที่เหลือเป็นเอาต์พุตที่สอง
Luis Mendo

@LuisMendo Clever พวกเขาควรจ้างพวกคุณ MATL เพื่อพัฒนา MATLAB ...
Sanchises

ฮ่าฮ่า ฉันคิดถึงคุณสมบัติบางอย่างใน MATLAB บางครั้ง
Luis Mendo

1

Clojure, 71 ไบต์

(fn[n](every?(fn[[q w]](some q w))(partition 2 1(map #(set(str %))n))))

ฟังก์ชั่นไม่ระบุชื่อที่ยอมรับลำดับของตัวเลข ผลตอบแทน/truefalse

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

(defn number-chain? [nums]
  (let [; Turn each number into a set of characters
        set-nums (map #(set (str %)) nums)

        ; Partition the sets into lists of neighbors
        ; [1 2 3 4] -> [[1 2] [2 3] [3 4]]
        partitioned (partition 2 1 set-nums)]

    ; Does every second neighbor contain some element of the first?
    (every?
      (fn [[l1 l2]]
        (some l1 l2))
      partitioned)))

1

SimpleTemplate ขนาด 124 ไบต์

ว้าวนี่เป็นการออกกำลังกาย!

{@eachargv asA keyK}{@ifK}{@setR"/[",O,"]/"}{@calljoin intoR"",R}{@ifA is notmatchesR}{@return}{@/}{@/}{@setO A}{@/}{@echo1}

"เรียบง่าย" นี้ทำให้ regex ใช้องค์ประกอบเก่าโดยแสดง1เป็นค่าจริงหรือไม่มีอะไรอย่างอื่น


Ungolfed:

{@each argv as number key K}
    {@if K}
        {@set regex "/[", old, "]/"}
        {@call join into regex "", regex}
        {@if number is not matches regex}
            {@return false}
        {@/}
    {@/}
    {@set old number}
{@/}
{@echo 1}

1

JavaScript (ES6), 37 ไบต์

s=>/^(.*(.).*\n(?=.*\2))+.+$/.test(s)

ยอมรับอินพุตเป็นสตริงของตัวเลขที่คั่นด้วยบรรทัดใหม่ จากคำตอบของ Retina @ MartinEnder ♦ที่ยอดเยี่ยม แต่ทำแบบทดสอบทั้งหมดใน regexp เดียวเพราะมันสั้นกว่าใน JavaScript อย่างนั้น


1

Pip , 12 10 ไบต์

$&B@X^_MPg

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

คำอธิบาย

         g  List of all cmdline args
       MP   Map this function to consecutive pairs of items from that list:
     ^_      Split 1st item of pair into list of characters
    X        Convert to regex that matches any of those characters
  B@         Find all matches in 2nd item of pair
$&          Fold on logical AND--truthy if all items are truthy, falsey if one is falsey
            Print (implicit)

1

Röda , 45 35 bytes

{[_=~`(\S*(\S)\S* (?=\S*\2))+\S+`]}

ลองออนไลน์!

คล้ายกับโซลูชัน Perl 5 ซึ่งเป็นพอร์ตของโซลูชัน Retina โดย Martin Ender -10 ไบต์ขอบคุณ @Neil

ต่อไปนี้เป็นโซลูชันอื่น ( 73 72 ไบต์):

{[_/""]|{|x|{x|[0]()unless[not(_ in y)]else[1]}if tryPeek y}_|sum|[_=0]}

มันเป็นฟังก์ชั่นที่ไม่ระบุชื่อที่ดึงสตริงจากสตรีมและตรวจสอบว่าสตริงที่ต่อเนื่องกันมีอักขระเดียวกัน คำอธิบาย:

{
    [_/""]|    /* split strings -> creates arrays of characters */
    {|x|       /* begin for loop over character arrays */
        {      /* begin if tryPeek(y) -> peeks the second item from the stream */
               /* x and y are now two consecutive character arrays */
            x| /* push characters in x to the stream */
            [0]()unless[not(_ in y)]else[1] /* pushes 0 to the stream */
                                            /* if y contains the character */
                                            /* in the stream, otherwise 1 */
        }if tryPeek y
    }_|        /* end for loop */
    sum|       /* sum all numbers in the stream */
    [_=0]      /* return true if the sum is zero */
}

มันอาจจะเป็นกอล์ฟเพิ่มเติม ...


มันจะช่วยให้มี regexp เดียวที่การทดสอบทั้งหมดในครั้งเดียว? ^(\S*(\S)\S* (?=\S*\2))+\S+$สิ่งที่ชอบ
Neil

@ นีลดูเหมือนว่าจะทำงาน ขอบคุณ!
fergusq

1

ยูทิลิตีBash + Unix ขนาด71 69 ไบต์

sed "s/\(.*\)/<<<\1 \&\&grepx[\1]/;1s/.*g/g/;\$s/ .*//"|tr 'x
' \ |sh

ลองออนไลน์!

อินพุตอยู่บน stdin หนึ่งหมายเลขต่อบรรทัด

เอาต์พุตอยู่ในโค้ดออก: 0 สำหรับความจริง 1 สำหรับความเท็จ

นี่อาจเป็นเรื่องของกอล์ฟมากกว่า

เพื่อให้โค้ดข้างต้นทำงานไม่สามารถมีไฟล์ใด ๆ ในไดเรกทอรีปัจจุบันที่มีชื่อเป็นตัวเลขหลักเดียว หากไม่เป็นที่ยอมรับให้เปลี่ยน[\1]โปรแกรมด้วย'[\1]' (ในราคา 2 ไบต์เพิ่มเติม)

ตัวอย่างการรัน (กรณีทดสอบสุดท้ายที่ให้ไว้ในการท้าทาย):

$ echo '98
> 87
> 76
> 11
> 12
> 23' | ./digittest > /dev/null; echo $?
1

(1 นี่คือเท็จ)


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

ฉันจะสาธิตเกี่ยวกับการวิ่งตัวอย่างข้างต้น

คำสั่ง sed แปลงอินพุตเป็น:

grepx[98]
<<<87 &&grepx[87]
<<<76 &&grepx[76]
<<<11 &&grepx[11]
<<<12 &&grepx[12]
<<<23

คำสั่ง tr จะแปลงค่านี้เป็นสตริง:

grep [98] <<<87 &&grep [87] <<<76 &&grep [76] <<<11 &&grep [11] <<<12 &&grep [12] <<<23

สายนี้เป็นคำสั่งเชลล์สำหรับการดำเนินการที่ต้องการดังนั้นฉันไปป์ที่เป็น sh และฉันเสร็จ


การ จำกัด ไฟล์ทำได้ดีแม้ว่าจะเป็นข้อ จำกัด อย่างแน่นอน
Carcigenicate

1

Q, 57 ไบต์

{r::();({r,::any(last x)in y;x,enlist y}\)($)0,x;all 1_r}
  1. เริ่มต้นระดับโลก
  2. แปลงอินพุตเป็นอาร์เรย์ของสตริง
  3. สแกนอาร์เรย์เพื่อตรวจสอบว่าอักขระบางตัวในสตริงสุดท้ายอยู่ในสตริงปัจจุบัน
  4. ต่อท้ายผลลัพธ์แต่ละรายการเพื่อ r
  5. ส่งคืน 1 หากสตริงทั้งหมดเป็นไปตามขั้นตอนที่ 3 และส่งคืนค่า 0

หมายเหตุ: 0 ต่อท้ายเพื่อเริ่มอาร์เรย์อินพุตภายในฟังก์ชั่น สิ่งนี้ทำเพื่อให้การเปรียบเทียบองค์ประกอบแรกจะถูกเกณฑ์ มิฉะนั้นตัวละครตัวสุดท้ายขององค์ประกอบแรกจะถูกจับเพื่อเปรียบเทียบ ไม่สามารถทำการตรวจสอบประเภทอย่างไรก็ตามที่เพิ่ม 7 ไบต์มากกว่าจำนวนปัจจุบัน


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