Có thật không? Hỏi Jelly!


32

Lý lịch

Lấy cảm hứng từ sự giải thích rất thuận tiện của Octave (và, bằng cách mở rộng, MATL) về các ma trận trung thực / giả mạo, Jelly có nguyên tử Ȧ (kiểu Octave tất cả ).

Lấy một mảng làm đầu vào và trả về 1 nếu mảng không trống và không chứa số 0 (số nguyên, số float hoặc số phức) ở bất cứ đâu trong cấu trúc cây ; mặt khác, nó trả về 0 .

Ví dụ: mảng [[]] là trung thực vì nó không trống và không chứa số 0, nhưng [[0]] là sai vì nó chứa 0 ở mức trong cùng.

Bài tập

Trong ngôn ngữ lập trình bạn chọn, hãy viết một chương trình đầy đủ hoặc một hàm có một dãy số nguyên có thể trống, có thể bị lởm chởm làm đầu vào và in hoặc trả về giá trị trung thực hoặc sai lệch cho biết Ȧ sẽ trả về 1 hoặc 0 , tương ứng.

Trình của bạn phải tuân thủ các quy tắc sau đây.

  • Các giá trị trung thực và sai lệch phải nhất quán cho tất cả các đầu vào , nghĩa là, tất cả các mảng mà Ȧ trả về 1 phải ánh xạ tới cùng một giá trị trung thực và tất cả các mảng mà Ȧ trả về 0 phải ánh xạ tới cùng một giá trị giả.

  • Vì các chương trình đầy đủ chỉ có thể lấy các biểu diễn chuỗi của mảng làm đầu vào, nên điều này được cho phép. Tuy nhiên, bạn phải sử dụng đại diện canocical của ngôn ngữ của bạn, như được trả lại bởi reprhoặc tương tự.

    Cụ thể, bạn không thể cho rằng phần tử đầu tiên của mảng sẽ được bắt đầu bằng khoảng trắng.

  • Nếu (và chỉ nếu) ngôn ngữ của bạn không thể biểu diễn các mảng bị lởm chởm, bạn có thể lấy một chuỗi đại diện của đầu vào, sử dụng cú pháp chính tắc của bất kỳ ngôn ngữ lập trình nào trước đó.

  • Nếu ngôn ngữ của bạn có một số cách biểu diễn các mảng lởm chởm (ví dụ: danh sách và bộ dữ liệu), bạn chỉ phải hỗ trợ một trong số chúng.

  • Nếu ngôn ngữ của bạn có tích hợp sẵn, bản thân nó là một bài nộp hợp lệ cho thử thách này, bạn không được sử dụng nó trong câu trả lời của mình . Tất cả các tích hợp khác được cho phép.

  • Bạn được khuyến khích đăng câu trả lời bằng cách sử dụng cả thao tác mảng và chuỗi, ngay cả khi cái này ngắn hơn đáng kể so với cái kia.

  • Tất cả các quy tắc tiêu chuẩn được áp dụng.

Có thể mã ngắn nhất trong byte giành chiến thắng!

Trường hợp thử nghiệm thật

[1]
[10]
[[]]
[[[[1]]]]
[[], [1], [1, 2]]
[[1], [1, [2]], [1, [2, [3]]]]
[[8], [8, [9]], [8, [9, [10]]]]

Trường hợp thử nghiệm giả

[]
[0]
[0, -1]
[-1, 0]
[[[[0]]]]
[[0], [1, 2], [3, 4, 5]]
[[8], [8, [9]], [8, [9, [1, 0]]]]
[-1, 0, 0, 0]

Dựa trên các trường hợp thử nghiệm, bạn có nghĩa là "chứa số 0" có nghĩa là bất cứ nơi nào trong cấu trúc cây? Đó không phải là những gì tôi đã đoán nó có nghĩa.
xnor

Vâng, bất cứ nơi nào. Tôi sẽ cố gắng làm rõ điều đó.
Dennis

Chính xác thì ý bạn là gì "bạn không thể cho rằng biểu diễn chuỗi sẽ có định dạng cụ thể"?
Dada

2
Đây không phải là mảng răng cưa - mảng răng cưa sẽ có tất cả các số ở cùng độ sâu, bởi vì chỉ có kích thước khác nhau, không phải loại phần tử.
Ørjan Johansen

2
@Qwertiy Đúng, "hầu hết" các ngôn ngữ trong đó "mọi thứ" là Object... yêu thích của tôi là Haskell, nơi không có ngôn ngữ . Cũng không phải trong C, ít nhất là không phải theo cách cho phép bạn trộn các mảng và int một cách an toàn. Cả hai ngôn ngữ này đều có khả năng hoàn hảo với các mảng lởm chởm, nhưng vẫn không thể sử dụng chúng cho vấn đề này.
Ørjan Johansen

Câu trả lời:


38

Thạch, 3 byte

ṭFẠ

F làm phẳng danh sách đầu vào.

xử lý danh sách đầu vào ban đầu dưới dạng một phần tử, đó là sai lệch khi và chỉ khi nó trống.

sau đó kiểm tra xem có phần tử nào trong danh sách dẹt hay chính danh sách gốc đó là sai không.


(Câu trả lời gốc)

FẠ^Ṇ

Cảm ơn Dennis vì đã khuyến khích tìm ra giải pháp phù hợp với mình.

FẠcho 0 nếu đầu vào chứa giá trị giả ở bất kỳ độ sâu nào khác, 1. Đây là những gì Ȧlàm được, ngoại trừ danh sách trống.

cho 1 nếu đầu vào là giá trị giả, khác 0. Danh sách giả chỉ là danh sách trống.

XOR-ing cả hai đưa ra câu trả lời.


F;WẠ

Điều này rất giống với tinh thần của Dennis F;LẠ, nhưng thay vì sử dụng Lđể đưa số 0 vào danh sách khi danh sách trống, nó sử dụng Wđể đưa danh sách trống vào chính nó (tạo ra [[]]), khiến nó chứa yếu tố giả.


30
Vượt lên trong thử thách của chính tôi và ngôn ngữ của riêng tôi ... Tốt lắm!
Dennis

15

Võng mạc , 10 byte

A`\b0
^...

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

Đầu tiên chúng ta loại bỏ đầu vào nếu nó chứa số không. Chúng tôi cố gắng khớp ít nhất ba ký tự từ đầu chuỗi (để đảm bảo rằng đầu vào chưa bị loại bỏ trong giai đoạn trước hoặc chỉ []bắt đầu bằng).


12

Ruby, 25 24 23 18 16 byte

p$_!~/\D0|^..$/

Yêu cầu -ncờ trên dòng lệnh (+1 byte, -e-> -ne).

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

Đây là một chương trình đầy đủ lấy đầu vào ở định dạng mảng chính tắc của Ruby trên STDIN và đầu ra truehoặc falsetrên STDOUT.

 $_              # line of input that was read automatically (-n)
   !~/        /  # does not match the regex...
      \D0        #   a non-digit followed by a 0
         |       #   or...
          ^..$   #   a 2-length string (which must be [], the empty array)
p                # output the result

Phiên bản hàm 23 byte :

->a{"#{a}"!~/\D0|^..$/}

Đây là một Proc lấy một đối số, mảng cần kiểm tra.

Cảm ơn Martin Ender cho một byte và Ventero cho hai byte!


Bạn có thể lưu thêm hai byte bằng cách sử dụng p$_!~/\D0|^..$/(hoặc p ! ~/\D0|^..$/, yay khoảng trắng đáng kể) cùng với -ncờ.
Ventero

8

Thạch , 4 byte

FẠ_Ṇ

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

Ȧmang lại 0nếu đầu vào trống hoặc chứa a 0, nếu không nó là 1.

FẠmang lại 0nếu đầu vào dẹt chứa a 0, chỉ để lại trường hợp cạnh của một mảng trống (vì đầu vào được đảm bảo là một mảng).

là một logic phi vectorising không đơn nguyên, và do đó lợi nhuận 0cho bất kỳ danh sách không có sản phẩm nào và 1để xem danh sách sản phẩm nào. Như vậy, điều này chỉ đơn giản là có thể được trừ khỏi kết quả của FẠviệc sử dụng _.


Một xuống, ít nhất một nữa để đi.
Dennis

@Dennis Không phải FẠạṆ, phải không?
Erik the Outgolfer 19/03/2017

@EriktheOutgolfer Không, không phải vậy. Câu trả lời tôi có trong đầu xử lý khác nhau với trường hợp cạnh của một mảng trống và sẽ tạo ra một kết quả khác cho các mảng không.
Dennis

@Dennis Thích trả về A cho True, B cho false, C cho trống và D cho không mảng? Đó sẽ là không cạnh tranh. Những gì tôi đã làm là sử dụng sự khác biệt tuyệt đối thay vì sự khác biệt bởi vì không có booleans tiêu cực.
Erik các Outgolfer

@EriktheOutgolfer B phải bằng C để tuân thủ thông số thử thách, nhưng D có thể là bất cứ điều gì vì đầu vào được đảm bảo là một mảng.
Dennis

8

05AB1E , 9 8 byte

-1 byte nhờ Emigna

)Q¹˜0å~_

Giải trình:

)Q        Is the length of the input 0?
  ~    _  ... NOR ... (just for you, Dennis) 
   ¹˜     Input deep flattened
     0å   Contains 0

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


Có vẻ thất bại cho [[]].
Dennis

0 thực sự đúng trong 05AB1E?
Dennis

tất cả các mảng mà Ȧ trả 1 phải ánh xạ với cùng truthy giá trị, và tất cả các mảng mà Ȧ trả về 0 phải ánh xạ với cùng falsy giá trị (tôi nhấn mạnh)
Dennis

1
@Dennis Alright, cười thầm trong một byte phủ định logic ở đó.
Okx 18/03/2017

1
Aw, chỉ cho tôi : P
Dennis

7

Toán học, 17 byte

#!={}&&#~FreeQ~0&

FreeQkiểm tra đối 0với chúng tôi, nhưng tất nhiên nó sẽ trả về Trueđầu vào {}, vì vậy chúng tôi cần kiểm tra riêng trường hợp đó.


7

APL (Dyalog), 21 12 7 byte

Chơi gôn 5 byte nhờ Adám bằng cách sử dụng dĩa

⍬∘≡⍱0∊∊

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

Đây là lần thử đầu tiên của tôi tại Dyalog. Lời khuyên chơi golf được chào đón!

Giải trình

⍬∘≡                   Fork; Is the argument a null set
   ⍱                  Nor
    0∊∊               0 belongs to the enlisted form of the argument
                      For example, (1 (2 (3 (0)))) would become
                      1 2 3 0 using the ∊ monad
                      Then we check if zero belongs to this vector

+1 Lưu ý rằng bạn đang kết hợp kết quả của hai bài kiểm tra. Điều này là hoàn hảo cho một ngã ba. ⍬∘≡là bài kiểm tra bên trái (tập rỗng liên kết với đồng nhất) và 0∊∊là bài kiểm tra bên phải (bản thân nó là một ngã ba; không có thành viên nào ở dạng nhập ngũ). Đặt nó lại với nhau : ⍬∘≡⍱0∊∊. Hãy thử trực tuyến!
Adám

Ngoài ra, bạn có thể muốn sử dụng tên "APL (Dyalog)" để mọi người có thể tìm thấy những gì bạn đang sử dụng.
Adám

@ Adám Cảm ơn lời khuyên!
Kritixi Lithos

6

Hoạt động ngôn ngữ kịch bản Flashpoint , 199 188 byte

A={f={private["_i","_r"];_r=1;_i=0;while{_i<count _this}do{o=_this select _i;if(o in [o])then{if(o==0)then{_r=0}}else{_r=o call f};_i=_i+1};_r};if(count _this==0)then{0}else{_this call f}}

Gọi với:

[3,6,4,[4,6],[3,6,[],[2,4,[0],3]]] call A

Hoặc với:

hint format["%1", [3,6,4,[4,6],[3,6,[],[2,4,[0],3]]] call A]

Giải trình:

Trong ngôn ngữ kịch bản của trò chơi, bất kỳ chuỗi chứa mã nào cũng có thể được gọi. Các dấu ngoặc nhọn {}biểu thị sự bắt đầu và kết thúc của một chuỗi. (Dấu ngoặc kép cũng hoạt động, nhưng nó trở nên lộn xộn khi chúng được lồng vào nhau.) Vì vậy, A={...}gán một chuỗi cho biến Avà sau đó biến có thể được gọi như một hàm với:<argument> call A . Về cơ bản, bất kỳ chuỗi nào cũng có thể được coi là một khối mã.

Sau đó, bên trong "hàm" A, chúng ta định nghĩa một hàm khác f. privatekhai báo hai biến _i_rcục bộ để hoạt động f. Tên của một biến cục bộ phải bắt đầu bằng dấu gạch dưới.

while {} do {}là một vòng lặp, trong đó chuỗi đầu tiên (ký hiệu là {}) chứa mã cho điều kiện vòng lặp và chuỗi thứ hai cho thân vòng lặp.

_thislà đối số đã được thông qua với callhàm._thiscó thể là bất kỳ loại nào, nhưng ở đây chúng tôi giả sử nó là một mảng.

Trong vòng lặp, o=_this select _itruy cập phần tử _i: th của mảng và gán nó cho biến o. if (o in [o])là một mẹo để xác định xem đó có phải olà mảng khác hay không. Nếu olà một số (hoặc bất cứ thứ gì khác ngoài một mảng), o in [o]sẽ đánh giá true, bởi vì inhàm tìm thấy một giá trị khớp otừ mảng [o]. Nếu olà một mảng, biểu thức mang lại false, bởi vì intừ chối so sánh các mảng.

Nếu okhông phải là một mảng, chúng tôi kiểm tra xem nó có bằng không không và nếu có, chúng tôi sẽ đặt biến _r, chúng tôi sẽ sử dụng làm giá trị trả về, bằng không. Mặt khác, nếu olà một mảng, chúng ta gán cho _rgiá trị trả về của lệnh gọi đệ quy fvới mảng mới olàm đối số.

Sau vòng lặp, ở cuối hàm f, chúng ta đánh giá biểu thức _r, giá trị này mang lại giá trị _rvà vì đây là biểu thức cuối cùng được ước tính, đây là giá trị mà hàm gọi hàm ftrả về.

Bây giờ chúng ta đã xác định f( fkhông cần phải ở bên trong A, nhưng bằng cách này, chúng ta có thể đã khai báo nó là một biến / hàm cục bộ (không thực sự khác biệt) Anếu chúng ta không muốn lưu một số byte), hãy quay lại A. if (count _this == 0)kiểm tra xem Amảng đầu vào có trống không và nếu có, Atrả về 0. Nếu không thì hàm fđược gọi và giá trị trả về của nó sẽ là Agiá trị trả về của nó.

Người ta có thể nhận thấy rằng có vẻ như một dấu chấm phẩy sẽ bị thiếu ở một vài nơi, nhưng đây không phải là trường hợp, bởi vì dấu chấm phẩy chỉ cần thiết sau một câu lệnh nếu một câu lệnh khác đi theo nó trong cùng một khối mã (tức là chuỗi).


Đợi đã, cái gì?! Vận hành Flashpoint?
Brain Guider

wat thế nào? gì??? confuzed
Christopher

@DownChristopher Đã thêm một lời giải thích.
Steadybox

1
@AnderBiguri Yep, tại sao không? Ngôn ngữ kịch bản của trò chơi phù hợp với định nghĩa của ngôn ngữ lập trình được đưa ra trong bài đăng meta được liên kết trong câu hỏi.
Steadybox 20/03/2017

1
@Steadybox Tôi bối rối về sự tồn tại của sự vật, không phải tính hợp lệ của nó !!
não

5

Perl 5 , 15 byte

Đã lưu 2 byte bằng cách sử dụng kỹ thuật tương tự như câu trả lời Ruby của Doorknob .

14 byte mã + -pcờ

$_=!/\b0|^..$/

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

/.../Đảm bảo rằng các mảng là không có sản phẩm nào (nó sẽ phù hợp trên bất kỳ mảng nhưng [].
/\b0/sẽ chỉ phù hợp nếu có một 0trong mảng. (các \bđảm bảo rằng 0không phải là một phần của một số khác nhưng một số nguyên).


5

Haskell , 48 byte

f x=or[elem c"[,"|c:'0':_<-scanr(:)[]x]<(x<"[]")

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

Cảm ơn Lynn cho các trường hợp thử nghiệm và x<"[]" mẹo.

Bất đẳng thức bên ngoài đòi hỏi (x<"[]")phải là True (danh sách không trống) vàor[elem c"[,"|c:'0':_<-scanr(:)[]x] là Sai (không có số 0).

Các ký tự 0được phát hiện như sau a ,hoặc [, trái ngược với một số như 20. Biểu thức scanr(:)[]xtạo ra tất cả các điều kiện lc:'0':_<-bắt giữ những người có nhân vật thứ hai '0'. Sau đó, elem c"[,"kiểm tra xem ký tự đầu tiên là ,hay [.

Tôi giả sử ở đây rằng các danh sách kiểu Haskell không có khoảng trắng, nhưng nếu vậy ','thì chỉ có thể thay thế bằng ' '.

Đây là một phương thức 48 byte trực tiếp hơn, mặc dù nó tạo ra 01không phải là Truthy / Falsey trong Haskell.

f"[]"=0
f(c:'0':_)|elem c"[,"=0
f(_:t)=f t
f _=1

5

Thạch , 4 byte

F;LẠ

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

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

F;LẠ  Main link. Argument: A (array)

F     Flatten A.
  L   Yield A's length.
 ;    Concatenate.
   Ạ  All; Tell if all elements of the resulting 1D array are truthy.

Lưu ý rằng nguyên tử Ạ hoạt động giống như Python allvà do đó khá khác so với bị cấm.


8
Cảnh báo: Đây không phải là giải pháp Jelly 4 byte duy nhất, ngoài điều hiển nhiên L;FẠ. Ai có thể tìm thấy một người khác?
Dennis

4

JavaScript (ES6), 34 byte

a=>a.length&&+!~`,${a}`.search`,0`

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


Bạn có thể có thể sử dụng !!a[0]thay vì a.length. (Bạn không phải lo lắng về a[0]số 0 vì kết quả phải là sai trong trường hợp này.)
Neil

Không sao, tôi thấy Qwerty đã đến đó.
Neil

4

Julia, 45 byte

a(x)=all(a,x);a(x::Int)=x!=0;g(x)=x!=[]&&a(x)

Điều này tạo ra một hàm gcho biết liệu sẽ là 1 hay 0 bằng cách gọi hàm đệ quy a. Để làm cho phù hợp a, chúng tôi sử dụng nhiều công văn:

# A method for scalar values
a(x::Int) = x != 0

# A recursive fallback for arrays
a(x) = all(a, x)

Hàm alllấy một đối số hàm, vì vậy chúng ta đang gọi atừng phần tử của đầu vào. Sau đó, chúng tôi chỉ cần xác định chức năng cho trình là

g(x) = x != [] && a(x)

Về cơ bản chúng ta chỉ cần anhưng với một kiểm tra để xử lý chính xác[] .

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


bạn có thể xác định các chức năng a(x)hay g(x)như !xđể thay thế?
Cyoce

4

Vết bẩn , 16 14 11 byte

Cảm ơn Zgarb vì đã tiết kiệm 5 byte.

e`s\0v#|!..

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

Thông báo echo Grime thử và khớp toàn bộ đầu vào và in 0hoặc 1tùy thuộc vào việc đó có khả thi hay không.

Đây thực sự |!là một toán tử "không", bởi vì x|!ynó là tốc ký (x|y)!. Vì vậy, chúng tôi đảm bảo rằng đầu vào không chứa số 0 đứng trước ký hiệu cũng không phải là một chuỗi chỉ có hai ký tự ( []).

Một lưu ý về nửa thứ hai: P#khớp với một hình chữ nhật có chứa ít nhất một trận đấu P. Tuy nhiên, trong trường hợp của chúng tôi Pbao gồm cả hai s\0do đó thường sẽ yêu cầu dấu ngoặc đơn: (s\0)#(vì mức độ ưu tiên #quá cao). Nhưng Grime có một tính năng thực sự gọn gàng nơi bạn có thể sửa đổi mức độ ưu tiên của các toán tử với ^v. Vì vậy, bằng cách sử dụng v#mức #độ ưu tiên của chúng tôi thấp hơn để nó thấp hơn bất kỳ toán tử nào khác (bao gồm cả phép nối), cho phép chúng tôi lưu một byte trên dấu ngoặc đơn.


3

Pip , 12 byte

#Va&`\b0`NIa

Lấy mảng làm đối số dòng lệnh ở dạng repr của Pip, như thế nào [1;[2;3]]. Trả lại 1cho sự thật, 0cho falsey. Dùng 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

              a is 1st cmdline arg (implicit)
 Va            Eval a (converting from a string to a list)
#              Take the length (0 if empty, nonzero if nonempty)
   &          Logical AND
    `\b0`      Regex pattern: word boundary followed by 0 (avoids things like 10)
         NIa   Not in a (0 if `\b0` matches in a, 1 if it doesn't)
              Autoprint

Phần thưởng trả lời, 12 byte

Đây là một chức năng có một danh sách thay thế:

#_>0=0N_Js^s

#_            Len(arg)
  >0          is greater than 0
    =         which also equals the following (comparison operators chain like Python's):
     0N       Count of 0's in
       _Js^s  arg, joined on space and then split on space (a hacky way to flatten)

TIO


3

Röda , 59 44 byte

f a{[1]if{g(a)[[]!=a]}}g a{[a!=0];try a|g _}

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

flấy đầu vào từ luồng của nó làm danh sách có thể chứa các danh sách và số nguyên khác. Nó trả về 1nếu alà sự thật và không có gì khác. Hàm trợ giúp gkiểm tra nếu acó chứa số không.

Giải trình:

f a{[1]if{g(a)[[]!=a]}}
f a{                  } /* Function declaration */
          g(a)          /* Call g -> pushes some booleans to the stream */
              [[]!=a]   /* Push value []!=a to the stream */
       if{           }  /* If all booleans in the stream are true: */
    [1]                 /*   Push 1 to the stream */
                        /* Otherwise return nothing */

g a{[a!=0];try a|g _}   /* Helper function */
g a{                }   /* Function declaration */
    [a!=0];             /* Push value a!=0 to the output stream */
           try          /* Ignore errors in the following if a is not a list */
               a        /* Push values in a to the stream */
                |g _    /* Pull values from the stream and */
                        /*   call g for each of them */
                        /*   (pushes boolean values to the output stream) */

Một giải pháp sử dụng regexes rất có thể sẽ ngắn hơn.

Câu trả lời này có thể đã ngắn hơn nếu nó được phép trả về nhiều giá trị. Điều này đã được thảo luận trong một trong những câu trả lời của tôi trước đây và kết luận rằng nó được phép trong các quy tắc mặc định để trả về các giá trị trung thực và sai lệch khác nhau cho các đầu vào khác nhau, nhưng vì một số lý do, OP đã cấm nó ở đây và ở đó. :


3

Kỳ quan , 15 byte

@&#0! iO0flat#0

Sử dụng:

(@&#0! iO0flat#0)[1;2;3;[8;9;0]]

Làm phẳng đầu vào, nhận tất cả các lần xuất hiện của 0, logic KHÔNG, logic VÀ với đầu vào.


3

Haskell , 62 byte

import Data.List
(%)=isInfixOf
f x=not(",0"%x||"[0"%x)&&x<"[]"

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

Đây là một chức năng String -> Bool. Danh sách của Haskell không đồng nhất, vì vậy không có cách tích hợp nào để thể hiện danh sách như thế nào [0, [0]].


Dựa trên các quy tắc được diễn đạt lại, các đầu vào không được có khoảng trắng vì các mảng Haskell không mặc định. Ít nhất, tôi nghĩ đó là cách giải thích mặc dù Haskell không cho phép các mảng lởm chởm. Nhưng có vẻ như mã của bạn sẽ hoạt động tương tự với ,``.
xnor

2
Như tôi đang quibbling lên trong các ý kiến câu hỏi, Haskell không có mảng lởm chởm (và danh sách) - nó chỉ là nó không thực sự đủ cho những gì câu hỏi này đòi hỏi.
Ørjan Johansen

3

Python 2 , 45 39 38 byte

lambda a:(a>[])^(' 0'in`a`or'[0'in`a`)

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

-6 cảm ơn @BenFrankel


phiên bản trước, không chuyển đổi danh sách sang chuỗi repr, 68 byte:

lambda a:(len(a)and g(a))*1
g=lambda b:all(map(g,b))if b>[]else b!=0

Điều này cho một dương tính giả trên []. Sau đây lưu 6 byte và thành công vào []:lambda a:bool(a)^(' 0'in`a`or'[0'in`a`)
Ben Frankel

2

MATLAB, 49 byte

Vì MATLAB (cũng như Octave) không cho phép các loại mảng lồng nhau này, chúng tôi giải thích nó như một chuỗi.

Đầu tiên chúng ta thay thế tất cả các ký tự không có chữ số bằng một khoảng trắng. Sau đó, chúng tôi sử dụng str2numđể chuyển đổi nó thành một mảng (1D), trên đó chúng tôi có thể áp dụng all(được phép, vì nó không hoàn toàn tự giải quyết nhiệm vụ này.)

s=input('');s(s<45|s>57)=32;disp(all(str2num(s)))

2

egrep, 7 + 3 = 10 byte

\<0|^.]

+3 byte cho -vcờ yêu cầu để đảo ngược kết quả.

Grep không có bất kỳ khái niệm nào về mảng, vì vậy điều này sử dụng biểu diễn chuỗi như được nêu trong câu hỏi. Lấy đầu vào trên một dòng từ stdin, trả về qua mã thoát (bỏ qua thiết bị xuất chuẩn).

(Hiện đang sử dụng một phiên bản không có tài khoản 01và tương tự, vì từ thần là nó ổn)

Mục nhập bash / grep gốc:

grep -Ev '\<0+\>|^.]'

Tìm thấy 0bất cứ nơi nào (sử dụng kiểm tra ranh giới từ \<\>để giảm giá những thứ như 10hoặc a1) hoặc toàn bộ chuỗi khớp [], sau đó đảo ngược kết quả khớp.

Phá vỡ:

grep
     -E \    # extended regular expression syntax
     -v \    # invert match
     \<0+\>  # a number of 0s with alphanumeric boundaries on both sides
     |^.\]   # or ']' as the second character (implies '[]')

Không gian lận, chỉ chơi golf tốt. :) Btw, grep có khả năng kiểm tra tính nguyên thủy, vì vậy đây là ngôn ngữ lập trình theo như PPCG có liên quan. \<0\|^.]cộng -vsẽ được tính là một giải pháp 11 byte.
Dennis

1
@Dennis tuyệt, cảm ơn! (Tôi đã chuyển sang egrepthay vì grepđể lưu một byte bổ sung; tên ngôn ngữ không được tính vào số đếm byte!)
Dave

2

Javascript ES6, 24 ký tự

Hoạt động với mảng, trả về 1hoặc 0:

a=>!!a[0]&!/\b0/.test(a)

Kiểm tra:

f=a=>!!a[0]&!/\b0/.test(a)

console.log([
  [1],
  [10],
  [[]],
  [[[[1]]]],
  [[], [1], [1, 2]],
  [[1], [1, [2]], [1, [2, [3]]]],
  [[8], [8, [9]], [8, [9, [10]]]],
].every(x => f(x)===1))

console.log([
  [],
  [0],
  [0, -1],
  [-1, 0],
  [[[[0]]]],
  [[0], [1, 2], [3, 4, 5]],
  [[8], [8, [9]], [8, [9, [1, 0]]]],
].every(x => f(x)===0))


Vì giá trị trả về có thể là trung thực / giả, bạn có thể bỏ giá trị !!(mặc dù sau đó bạn phải đổi &thành &&). Lưu một byte.
Brian McCutchon

@BrianMcCutchon, không có nhị phân &. Trong trường hợp &&không có !!đầu ra phù hợp sẽ bị phá vỡ: undefinedcho [], 0cho [0][0,1,2]falsecho người khác.
Qwertiy

Tôi không thấy làm thế nào phá vỡ đầu ra nhất quán là xấu trong thử thách này. Quan điểm của tôi khi chuyển sang &&là bạn sẽ cần nếu bạn thực hiện đề xuất đầu tiên của tôi, kể từ đó 2 & 1 == 0.
Brian McCutchon

@BrianMcCutchon, điểm đầu tiên của câu hỏi: "Các giá trị trung thực và sai lệch phải nhất quán cho tất cả các đầu vào, tức là, tất cả các mảng trong đó Ȧ trả về 1 phải ánh xạ tới cùng một giá trị trung thực và tất cả các mảng mà Ȧ trả về 0 phải ánh xạ đến cùng giá trị giả. "
Qwertiy

Ah, tôi đã lướt qua nó quá nhanh. Đừng bận tâm.
Brian McCutchon

2

Å ı ® Ø , 12 4 byte

i0Bu

Giải trình

i            › Take input as a list and automatically flatten it. If empty, push 0.
 0           › Push 0 to the stack
  B          › Pop 0 and push the number of times it appears
   u         › convert top value to its boolean 

Nếu kết quả cần phải được xuất ra ...

i0Buo        › same as above; o outputs the top value on the stack

Giải pháp trước

Tôi đã đăng bài này trước khi nhận ra rằng các ngôn ngữ dựa trên ngăn xếp có thể để lại giá trị trên ngăn xếp như một dạng đầu ra

i0B¿0oP?!¿o?

Giải trình

i            › Take input as a list and automatically flatten it. If empty, push 0.
 0           › Push 0 to the stack
  B          › Pop 0 and push the number of times it appears
   ¿         › If the top value is true ...
    0        › Push 0
     o       › Output the top value on the stack
      P      › Pop the top value from the stack
       ?     › End if statement
        !    › Boolean opposite of top value
         ¿   › If the top value is true ...
          o  › Output the top value
           ? › End if statement

2

Haskell, 45

Như Lynnxnor đã nhận xét, Haskell không đi kèm với một loại danh sách được lồng ghép không đồng nhất. Nhưng thật dễ dàng để thêm chúng dưới dạng một kiểu dữ liệu tùy chỉnh và để cho hàm hoạt động trên kiểu đó và điều này rất thích hợp để hoạt động trên các chuỗi (urgh!) .

data L=L Int|T[L]
f(L n)=n/=0
f(T l)=all f l

Để thực sự có thể viết ra các danh sách như chữ theo [1, [2]]cú pháp, bạn cũng cần một số kiểu chữ fu. Trường hợp thử nghiệm đầy đủ:

{-# LANGUAGE OverloadedLists, TypeFamilies #-}
import GHC.Exts (IsList(..))

instance Num L where
  fromInteger = L . fromInteger
  negate (L n) = L $ negate n
instance IsList L where
  type Item L = L
  fromList = T
main = mapM_ (print . f) (
                    [ [1]
                    , [[[[0]]]]
                    , [[8], [8, [9]], [8, [9, [1, 0]]]]
                    ] :: [L])

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


2

Vim, 23 byte

:g/0\|^..$/d
:s/.\+/1/<CR>

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

Xuất ra một chuỗi rỗng cho sai, hoặc 1đúng. Điều này có thể ngắn hơn nếu tôi có thể xuất ra một chuỗi rỗng hoặc [] sai (cả hai đều là giá trị giả trong vim).



1

Tiếng Litva , 74 byte

(def f #L::((foldl(flatten L)(?(>(length L)0)1 0)#N,A::((?(== N 0)0 A)))))

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

Chà, điều này hóa ra lâu hơn tôi mong đợi. Vụ []án làm tôi vấp ngã và thêm một vài byte. Nó chỉ đơn giản làm phẳng danh sách và thực hiện một nếp gấp còn lại, và nếu tìm thấy 0, nó đặt bộ tích lũy thành 0.


1

Ruby , 24 22 byte

->a{a[0]&&a*?!!~/\b0/}

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

Vâng, tôi biết có một giải pháp tốt hơn trong Ruby nhưng tôi muốn tìm một giải pháp lấy mảng trong đầu vào thay vì chuỗi.


1

tinylisp , 70 64 byte

(load library
(d _(q((X)(i(c()X)(all(map _ X))X
(q((L)(i L(_ L)0

Dòng cuối cùng là một hàm lambda chưa được đặt tên, lấy một danh sách và trả về 1cho "truey-under-" và 0cho falsey.Hãy thử trực tuyến!

Ung dung

(load library)

(def _Ȧ
 (lambda (val)
  (if (equal? (type val) List)
   (all (map _Ȧ val))
   val)))

(def Ȧ
 (lambda (ls)
  (if ls
   (_Ȧ ls)
   0)))

Hàm trợ giúp đệ quy thực hiện hầu hết công việc. Nếu đối số của nó là một danh sách, chúng ta map đến các phần tử của nó và trả về 1nếu chúng là sự allthật, 0nếu có là falsey. (Thuận tiện, alltrả về 1khi được đưa ra danh sách trống.) Nếu không, đối số phải là số nguyên; chúng tôi trả lại như cũ ( 0là falsey và tất cả các số nguyên khác là trung thực trong tinylisp).

Hàm chính Ȧkiểm tra nếu danh sách không trống. Nếu vậy, nó gọi ; nếu không, nó trở lại 0.

Phiên bản chơi gôn tận dụng một số hành vi không xác định: thay vì sử dụng (e(type X)List)để kiểm tra xem đó Xlà số nguyên hay danh sách, nó (c()X)cố gắng cons(trả trước) danh sách trống vào X. Nếu Xlà một danh sách, điều này dẫn đến một danh sách không trống, đó là sự thật. Nếu Xlà một số nguyên, tinylisp xuất ra một thông báo lỗi và trả về một danh sách trống, đó là falsey. Vì stderr bị bỏ qua, cách tiếp cận này là hợp lệ.


0

PHP, 63 54 byte

9 byte được lưu bởi @ user63956

function a($a){return$a&&!strpos(print_r($a,1)," 0");}

lấy một mảng làm đầu vào; trả về truehoặc false: Nếu $akhông trống,
kiểm tra xem print_rđầu ra có chứa 0giá trị không.

giải pháp mảng, 83 byte

function b($a,$r=0){$r|=$a;foreach($a as$v)$r|=is_array($v)?b($v,1):!!$v;return$r;}

hàm đệ quy trả về 1hoặc 0.

phá vỡ

function b($a,$r=0)
{
    $r|=$a;         # if $a is not empty, set $r (no effect in recursion)
    foreach($a as$v)    # loop through elements:    
        $r&=is_array($v)    # 2. if test failed, clear $r
            ?b($v,1)        # 1. if array, recurse
            :!!$v;          #    else test element <>0
    return$r;           # return $r
}

1
Bạn có thể lưu một vài byte strpos(print_r($a,1)," 0")thay vì preg_match(...).
dùng63956

@ user63956 ... và nó cũng giải quyết được vấn đề 0-index. Tôi đã nhận ra print_rthông số thứ hai . Tuyệt quá!
Tít
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.