Dự đoán chuỗi số


27

Vấn đề:

Nhiệm vụ của bạn là quyết định xem trong một dãy số, mỗi số có ít nhất một trong các chữ số của số trước nó.

Ví dụ: những điều sau đây sẽ trả về sự thật:

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

Sau đây nên trả về falsey:

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

Trình của bạn có thể là một chức năng hoặc chương trình đầy đủ.

Đầu vào:

Đầu vào có thể là bất kỳ loại trình tự hợp lý. Một mảng số, một chuỗi các chuỗi, một chuỗi số được phân tách, v.v.

Tuy nhiên, vấn đề đặt hàng, do đó, bất kỳ cấu trúc nào bạn chọn chấp nhận làm đầu vào rõ ràng đều phải có một thứ tự xác định.

Đầu vào có thể được thực hiện thông qua stdin hoặc như là một đối số.

Bạn có thể giả sử:

  • tất cả các số sẽ là số nguyên không âm

  • đầu vào sẽ luôn chứa ít nhất 2 số

  • số đầu vào sẽ không bắt đầu bằng 0

Đầu ra:

Đầu ra sẽ là một giá trị trung thực hoặc falsey (như được xác định bởi ngôn ngữ của bạn), đại diện cho dù thông số kỹ thuật trên có được đáp ứng hay không.

Giá trị Truthy / falsey không cần nhất quán giữa các thử nghiệm.

Nó có thể là đầu ra cho thiết bị xuất chuẩn hoặc được trả về.

Các trường hợp thử nghiệm:

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)

Đây là mã golf, vì vậy số byte ít nhất sẽ thắng.

Câu trả lời:


7

Thạch , 5 4 byte

f2\Ạ

Đầu vào là một chuỗi các chuỗi.

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

f2\Ạ  Main link. Argument: A (array of strings)

 2\   Pairwise reduce by:
f       Filter, yielding all chars in the left string that appear in the right one.
   Ạ  All; yield 1 if all strings are non-empty, 0 if not.


12

Võng mạc , 25 20 byte

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

^.+$

Hãy thử trực tuyến!

Bất cứ khi nào chúng tôi tìm thấy một chữ số cũng xuất hiện trong số tiếp theo, chúng tôi sẽ xóa dấu phân cách giữa các số đó (cùng với các chữ số trong số cũ, bắt đầu từ số được chia sẻ, nhưng điều đó không liên quan). Đầu vào là hợp lệ, nếu tất cả các dấu phân tách đã bị xóa trong quá trình, chúng tôi kiểm tra bằng cách đảm bảo rằng chuỗi có thể được khớp với một dòng đơn.


11

Brachylog , 9 byte

{⊇ᵐ=∧?t}ˡ

Hãy thử trực tuyến!

Lưu ý rằng điều này không chỉ hoạt động với danh sách các số nguyên mà còn với danh sách các chuỗi hoặc danh sách các danh sách.

Giải trình

{      }ˡ       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
Thật tuyệt. Có vẻ ... khai báo? Đọc giống như bạn chỉ nói ngôn ngữ đặc tả.
Carcigenicate

3
@Carcigenicate Brachylog thực sự là khai báo, nó dựa trên ngôn ngữ lập trình logic khai báo Prolog .
Gây tử vong vào

2
Prologs thực sự nằm trong danh sách dài các ngôn ngữ để học khi tôi đạt được thời gian rảnh không giới hạn. Có quá nhiều ngôn ngữ hay!
Carcigenicate

8

JavaScript (ES6), 47 44 * 43 byte

Đã lưu một byte nhờ @Neil

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

Lấy đầu vào là một danh sách các chuỗi.

Kiểm tra đoạn

* ( gạch bỏ 44 vẫn là 44 thường xuyên )


Không `[${p}]`hoạt động?
Neil

@Neil Không dành cho mục đầu tiên của mỗi mảng.
Sản xuất ETH

Ah, tôi thấy bạn tìm thấy một cách giải quyết. Tôi đã có được như a=>a.reduce((l,r)=>`${l}`.match(`[${r}]`)&&r)(cũng hoạt động cho đầu vào số).
Neil

Có lẽ bạn có thể loại bỏ p&&nếu bạn thiết lập p=1/19?
Neil

@Neil Tôi, ờ ... à ... Đó là thiên tài, cảm ơn :-)
ETHproductions 15/03/2017

6

05AB1E , 10 byte

ü‚vy`Så1åP

Hãy thử trực tuyến! hoặc như một bộ thử nghiệm

Giải trình

ü‚          # 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ü.å- Tôi ước điều này làm việc như tôi nghĩ nó sẽ làm.
Bạch tuộc ma thuật Urn

@carusocomputing: Vâng, điều đó thật tuyệt. Hoặc chỉ ü.åhoặc €Süå.
Emigna

Tại sao cặp đôi không hoạt động với các lệnh dot một lần nữa?
Bạch tuộc ma thuật Urn

1
@carusocomputing: Nó chỉ được thực hiện để lấy byte tiếp theo làm lệnh. Nó không đưa dấu chấm vào tài khoản.
Emigna

6

CJam , 18 15 14 byte

Đã lưu 4 byte nhờ Martin Ender

l~Afb_1>.&:,:*

Hãy thử trực tuyến!

Giải trình

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 byte

-3 byte nhờ @NickHansen! Tôi thực sự cần phải cải thiện với các nhà khai thác đơn nguyên

-4 và -9 byte nhờ vào @Laikoni và @nimi tương ứng!

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

Phiên bản này lấy đầu vào là một chuỗi các chuỗi, loại bỏ nhu cầu show, nhưng theo như tôi có thể thấy nó hoạt động theo cách tương tự như phiên bản cũ hơn:

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

(Tôi khá chắc chắn Tôi được phép gửi một chức năng ẩn danh như thế này, nhưng tôi sẽ sửa nó nếu cần thiết)

Đầu tiên các số được chuyển đổi thành chuỗi. Sau đó, ma thuật đơn nguyên zip=<<tailtạo ra một chức năng nén danh sách với chính nó sẽ ghép từng mục với hàng xóm của nó. Sau đó allánh xạ lambda đến từng cặp để kiểm tra xem một chuỗi có chứa bất kỳ ký tự nào từ chuỗi kia hay không và cuối cùng kiểm tra xem tất cả chúng có xuất hiện hay không True.

Phiên bản cũ hoạt động cơ bản theo cùng một cách:

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

Tôi đã có thể cạo một byte bằng cách sử dụng zip và một số (->) mánh khóe đơn nguyên: f (x, y) = any ('elem'x) y; g = all f. (Zip = << tail) .map hiển thị . chỉnh sửa: elem nên [hy vọng rõ ràng] sẽ ở backticks nhưng điều đó là không thể với trình định dạng nhận xét.
Nick Hansen

44 byte:and.(zipWith(any.flip elem)=<<tail).map show
Laikoni

Nó được phép lấy đầu vào làm danh sách các chuỗi, ví dụ ["1234567890", "19", "95", "5012", "23"], vì vậy bạn có thể loại bỏ đầu vào .map show.
nimi

5

Toán học 62 47 35 byte

Với 12 byte được lưu nhờ MartinE.

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

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

Sai

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

Thật


4

Ruby, 49 48 byte

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

Đầu ra là nilsai và số nguyên "ngẫu nhiên" là đúng.


4

Java 8, 94 90 87 byte

Đầu vào là một chuỗi các chuỗi đại diện cho các số. Bắt đầu với chuỗi thứ hai, nó thực hiện so sánh biểu thức chính quy với từng chuỗi trước đó để xem liệu nó có chứa bất kỳ ký tự nào không : .*[previous string].*.

Chơi gôn

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

Ung dung:

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);
  }

}

Tốt đẹp! a->{for(int i=1;i<a.length;)if(!a[i].matches(".*["+a[i++-1]+"].*"))return 0>1;return 1>0;}
Ngắn

Tôi cũng đã đánh gôn tới 90, nhưng theo một cách khác:a->{int r=1;for(int i=0;++i<a.length;)r*=a[i].matches(".*["+a[i-1]+"].*")?1:0;return r>0;}
Business Cat

1
Nevermind, đã chuyển đến 87:a->{int r=1,i=0;for(;++i<a.length;)r*=a[i].matches(".*["+a[i-1]+"].*")?1:0;return r>0;}
Business Cat

Cám ơn hai bạn. Tôi nghĩ rằng cách duy nhất để cải thiện điều này bằng một lượng có ý nghĩa bây giờ là nhìn vào biểu thức chính quy.

4

Thạch , 6 byte

Dµf"ḊẠ

Hãy thử trực tuyến!

Giải trình

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

Rõ ràng nhất là thử sử dụng 2/ở đây, nhưng nó chạy một hàm unary trên tất cả các lát có kích thước 2. "Ḋchạy một hàm nhị phân trên tất cả các cặp phần tử liền kề, có nghĩa là chúng ta có thể sử dụng ftrực tiếp (thay vì cần phải chuyển đổi nó thành unary chức năng như f/). Điều này cuối cùng không để lại phần tử cuối cùng của đầu vào, nhưng may mắn là ngay cả đầu vào 0 cũng trở thành một danh sách trống khi được chuyển thành thập phân, vì vậy nó không có tác dụng gì với .



3

Thạch , 8 byte

Dœ&L¥2\Ạ

Hãy thử trực tuyến!

Làm sao?

Dœ&L¥2\Ạ - Main link: the list of integers            e.g. [3, 13, 351, 73, 82]
D        - convert all the integers to decimal lists       [[3],[1,3],[3,5,1],[7,3],[8,2]]
     2\  - 2-slice cumulative reduce with:
    ¥    -     last two links as a dyad:
 œ&      -         multiset intersection                   [[3],[1,3],[3],[]]
         -         length                                  [1,2,1,0]
       Ạ - all truthy?                                     0

3

05AB1E , 5 byte

Mã số:

üÃõå_

Sử dụng mã hóa CP-1252 . Hãy thử trực tuyến! hoặc Xác minh tất cả các trường hợp thử nghiệm! .

Giải trình:

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

Người đàn ông nó làm việc! RüÃõå_là những gì tôi đã đưa ra một mình. Tôi rất vinh dự được gần với câu trả lời hay nhất của bạn, xóa câu trả lời của tôi. Tại sao bạn không cần Rmặc dù?
Bạch tuộc ma thuật Urn

1
@carusocomputing Hmmm, Rsau đó là gì? : p
Adnan

2

PowerShell , 87 byte

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

Hãy thử trực tuyến!

Không phải là ngắn nhất theo bất kỳ biện pháp nào, nhưng một cách tiếp cận hơi khác so với các biện pháp khác đang sử dụng, và thể hiện sự tiện lợi |?{} chức năng .

Cái này lấy đầu vào là một chuỗi các chuỗi vào $n, sau đó lặp từ 1lên đến length-1. Chúng tôi sử dụng Where-Object(the |?{...}) để rút ra những chỉ số trung thực cho một điều kiện cụ thể. Bạn có thể nghĩ về điều này giống như một sự kết hợpfor vòng lặp với một ifmệnh đề.

Điều khoản ở đây là [char[]]$n[($i=$_)-1]|?{$n[$i]-like"*$_*"}. Đó là, chúng tôi đang lấy chỉ mục hiện tại $_, đặt nó thành $ivà trừ 1và sử dụng chỉ mục đó để lập chỉ mục $n(nghĩa là chúng tôi có được phần tử trước đó trong mảng đầu vào của chúng tôi). Đó là diễn viênchar -array và được gửi qua một Where-Objectthủ tục khác .

Mệnh đề bên trong $n[$i]-like"*$_*"xác định rằng chuỗi tại chỉ mục hiện tại $i-likeký tự hiện tại $_từ chỉ mục trước đó. Do đó, điều này sẽ xuất ra bất kỳ ký tự chung nào giữa hai thành phần mảng. Do đó, mệnh đề bên ngoài sẽ chỉ là sự thật nếu có một ký tự chung (vì một mảng trống là falsey trong PowerShell), và do đó, chỉ mục sẽ chỉ được chọn nếu có các ký tự chung.

Sau đó, chúng tôi tập hợp tất cả các chỉ số phù hợp với tiêu chí và xác minh rằng chỉ số .countđó có liên quan -eqđến độ dài của mảng đầu vào. Kết quả Boolean đó được để lại trên đường ống và đầu ra là ẩn.



2

APL (Dyalog APL) , 9 byte

∧/×≢¨2∩/⎕

Hãy thử trực tuyến!

∧/ là tất cả những người trong danh sách

× các dấu hiệu

 kiểm đếm

¨ mỗi

2∩/ giao điểm cặp đôi của

 đầu vào?


Tôi không chắc "dấu hiệu" nghĩa là gì, nhưng bạn có thể cho rằng tất cả các số sẽ dương.
Carcigenicate

@Carcigenicate họ cũng có thể bằng không.
Adám

Vâng xin lôi. "Không âm".
Carcigenicate

2

PHP, 65 68

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

Lặp lại tất cả các số và loại bỏ tất cả các chữ số xuất hiện trong trước đó. Đếm tần suất nó bằng chính số đó (không xóa chữ số). Nếu ít nhất một bằng nhau, chúng tôi đã không có một trận đấu trong một trong các cặp.


Đã sửa lỗi sử dụng triminsted of strtr. Cảm ơn @ JörgHülsermann


Xin lỗi lớn. cho các thử nghiệm nhất định giải pháp của bạn hoạt động. ["filename",1,11,414]hoạt động không.
Jörg Hülsermann

@ JörgHülsermann chắc chắn trimchỉ hoạt động cho các ký tự hàng đầu và dấu. Đã sửa nó.
Christoph

Đối với PHP <7.1, bạn có thể sử dụng a&thay vì null!==(-5 byte).
Tít

... nhưng điều này sẽ chỉ hoạt động cho chữ số đầu tiên $argv[$i], bởi vì "Nếu từ và để có độ dài khác nhau, các ký tự phụ trong phần dài hơn của hai chữ số sẽ bị bỏ qua." (từ sách hướng dẫn)
Titus

2

PHP, 75 byte

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

lấy số từ các đối số dòng lệnh; thoát ra 1cho giả, với 0sự thật.
Chạy với -rhoặc kiểm tra nó trực tuyến .

  • bắt đầu bằng $b= một số chứa tất cả các chữ số
  • lặp xuống thông qua các đối số
    • xóa tất cả các chữ số của $bđối số
    • sao chép đối số vào $b
    • nếu không có chữ số nào bị xóa, hãy thoát bằng 1
  • ẩn: thoát với 0

1

PHP, 77 byte

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

1
Thay thế : foreach($argv as$k=>$v)$t=$k--?$t*preg_match("#[{$argv[$k]}]#",$v)):1;echo$t;, 77 byte (chưa được kiểm tra).
Ismael Miguel

1
@IsmaelMiguel nặng thay thế Trước tiên, bạn phải thay đổi $k--để --$kthả một) sau đó cách tiếp cận của bạn nên làm việc và bạn phải thêm một @ cho cảnh báo
Jörg Hülsermann

Ồ, vâng, đã không nhận thấy các dấu ngoặc đơn vô dụng gây ra lỗi cú pháp. Và tôi không đồng ý về $k--. Tôi đặc biệt sử dụng nó để $ k vẫn là 0 trong lần chạy đầu tiên. Và cảnh báo là không thể biết được. Điều đó có nghĩa là mã bây giờ là 76 byte, nhưng vẫn chưa được kiểm tra.
Ismael Miguel

Sau khi chỉnh sửa, tôi có thể xác nhận rằng nó foreach($argv as$k=>$v)$t=$k--?$t*preg_match("#[{$argv[$k]}]#",$v):1;echo$t;đang hoạt động như bình thường. Thử nghiệm với $argv = array(1, 12, 123, 3, 34, 45, 5, 5);màn hình 1và thử nghiệm với $argv = array(1, 12, 123, 3, 34, 45, 5, 6);màn hình 0, như mong đợi.
Ismael Miguel

@IsmaelMiguel Bạn quên rằng tham số đầu tiên trong tên là tên tệp.
Jörg Hülsermann

1

MATL , 14 byte

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

Hãy thử trực tuyến!

Cảm ơn @LuisMendo vì đã lưu một byte. Giải trình:

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

Bạn có thể lưu một byte thay thế 1)VGbằng 1&)(và điều này tránh lặp lại số đầu tiên)
Luis Mendo

@LuisMendo Tất nhiên rồi! Tôi mơ hồ nhớ rằng MATL có chức năng này, nhưng việc tìm kiếm "pop" (như trong hàng đợi hoặc ngăn xếp) trong thông số kỹ thuật không mang lại bất kỳ kết quả nào, vì vậy tôi nghĩ rằng tôi đã nhầm.
Chiếm

Vâng, thực sự đó là một trường hợp cụ thể của việc lập chỉ mục tham khảo. Với hai đầu ra, một hoạt động lập chỉ mục tham chiếu như )đưa ra các giá trị được chọn làm đầu ra đầu tiên và sau đó là các giá trị còn lại làm đầu ra thứ hai
Luis Mendo

@LuisMendo Thông minh. Họ nên thuê các bạn MATL của bạn để cải thiện MATLAB ...
Sanchise

Haha. Đôi khi tôi bỏ lỡ một số tính năng này trong MATLAB
Luis Mendo

1

Clojure, 71 byte

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

Một hàm ẩn danh chấp nhận một chuỗi các số. Trả về true/ false.

Tôi thích cách nó đọc. Chắc chắn có một vài lĩnh vực có thể được cải thiện ở đây. Hàm của tôi được chuyển đến mapkhông thể dễ dàng thay đổi để nó không yêu cầu macro hàm, điều đó có nghĩa là toàn bộ hàm không thể sử dụng macro, có khả năng thêm một số byte. Cũng thật tốt nếu tôi có thể tìm ra cách tốt hơn để giải nén các giá trị trong every?vị ngữ.

(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 byte

Wow, đây là một buổi tập luyện!

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

Điều này "đơn giản" tạo ra một biểu thức chính bằng cách sử dụng phần tử cũ, hiển thị 1dưới dạng giá trị trung thực hoặc không có gì khác.


Ung dung:

{@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 byte

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

Chấp nhận đầu vào dưới dạng một chuỗi các số được phân tách bằng dòng mới. Dựa trên câu trả lời Retina tuyệt vời của @ MartinEnder ♦, nhưng thực hiện toàn bộ bài kiểm tra theo một biểu thức chính quy vì nó ngắn hơn theo cách đó.


1

Pip , 12 10 byte

$&B@X^_MPg

Đưa đầu vào như một chuỗi các đối số dòng lệnh. Đầu ra là một danh sách không trống cho sự thật và một danh sách trống cho falsey. Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

         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 byte

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

Hãy thử trực tuyến!

Điều này tương tự như giải pháp Perl 5, là một cổng của giải pháp Retina của Martin Ender. -10 byte nhờ @Neil.

Đây là một giải pháp khác nhau ( 73 72 byte):

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

Đây là một hàm ẩn danh kéo các chuỗi từ luồng và kiểm tra xem các chuỗi liên tiếp có chứa các ký tự giống nhau không. Giải trình:

{
    [_/""]|    /* 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 */
}

Nó có thể có thể được đánh gôn nhiều hơn ...


Nó sẽ giúp để có một regrec duy nhất mà toàn bộ bài kiểm tra trong một lần? Một cái gì đó như ^(\S*(\S)\S* (?=\S*\2))+\S+$.
Neil

@Neil Điều đó dường như làm việc. Cảm ơn!
fergusq

1

Tiện ích Bash + Unix, 71 69 byte

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

Hãy thử trực tuyến!

Đầu vào là trên stdin, một số trên mỗi dòng.

Đầu ra nằm trong mã thoát: 0 cho sự thật, 1 cho falsey.

Điều này có thể có thể được chơi golf nhiều hơn.

Để mã ở trên hoạt động, không thể có bất kỳ tệp nào trong thư mục hiện tại có tên là một chữ số. Nếu điều này không được chấp nhận, hãy thay thế [\1]trong chương trình bằng '[\1]'(với chi phí là 2 byte bổ sung).

Chạy mẫu (trường hợp thử nghiệm cuối cùng được cung cấp trong thử thách):

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

(1 ở đây là chim ưng.)


Làm thế nào nó hoạt động:

Tôi sẽ chứng minh trên mẫu chạy ở trên.

Lệnh sed chuyển đổi đầu vào thành:

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

Lệnh tr sau đó chuyển đổi chuỗi này thành chuỗi:

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

Chuỗi này là một lệnh shell để thực hiện thao tác mong muốn, vì vậy tôi chuyển nó thành sh và tôi đã hoàn thành.


Hạn chế tập tin là tốt, mặc dù đó chắc chắn là một hạn chế kỳ lạ.
Carcigenicate

1

Q, 57 byte

{r::();({r,::any(last x)in y;x,enlist y}\)($)0,x;all 1_r}
  1. Khởi tạo toàn cầu r.
  2. Chuyển đổi đầu vào thành mảng chuỗi.
  3. Quét mảng kiểm tra xem một số ký tự trong chuỗi cuối cùng có trong chuỗi hiện tại không.
  4. Nối từng kết quả vào r.
  5. Trả về 1 nếu tất cả các chuỗi thỏa mãn bước 3 khác trả về 0.

Lưu ý: 0 được thêm vào để bắt đầu mảng đầu vào trong hàm. Điều này đã được thực hiện để việc so sánh các yếu tố đầu tiên sẽ được thực hiện. Mặt khác, ký tự cuối cùng của phần tử đầu tiên được lấy để so sánh. Có thể thực hiện kiểm tra loại tuy nhiên có thêm 7 byte so với số hiện tại.


Điều này trông giống như một cách tiếp cận tương tự với câu trả lời Clojure của tôi. Ngôn ngữ tìm kiếm gọn gàng.
Carcigenicate
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.