How can I shorten this python code analyzing a 3d grid?

7

My Python 3 function golf(...) should take a list of lists of lists of strings representing a solid cube and return whether there are any places in which two equal strings are directly next to each other on the x, y or z axis (not diagonally).
If there are no adjacent duplicates, True shall be returned, else False.

The input list and all of its sublists have the same length as they represent a cube, and their length is greater than 1 but lower than or equal to 5. The only possible values for the Strings inside the nested lists are "X" and "Z".
The maximum code length should be less than 200 bytes.

This is an example test case:

golf([[["X", "Z"],
       ["Z", "X"]],
      [["Z", "X"],
       ["X", "Z"]]]) == True
golf([[["X", "Z"],
       ["Z", "X"]],
      [["X", "Z"],
       ["Z", "X"]]]) == False

My current solution has 234 bytes:

def golf(c):
 r=range(len(c));R=[(a,b)for a in r for b in r];j="".join
 return all("XX"not in l and"ZZ"not in l for l in[j(c[x][y][z]for x in r)for y,z in R]+[j(c[x][y][z]for y in r)for x,z in R]+[j(c[x][y][z]for z in r)for x,y in R])

How can I golf this code any further to save another 35 bytes?

Byte Commander

Posted 2016-04-14T19:12:05.573

Reputation: 394

Are you sure this is a valid Python 3 code? E.g. [a,b should throw SyntaxError. – vaultah – 2016-04-14T19:14:52.727

@vaultah: That's a list comprehension. – El'endia Starman – 2016-04-14T19:19:54.707

@El'endiaStarman: yes. I just said that [a,b for a, b in ...] doesn't work. – vaultah – 2016-04-14T19:21:16.433

@vaultah and @FryAmTheEggman, I opened up a Python shell and it looks like you guys are right. Changing a,b to (a,b) fixes that syntax error, but the function still doesn't work (I get a TypeError complaining that indices must be slices or integers, not tuples.) – El'endia Starman – 2016-04-14T19:25:42.643

Sorry, I pasted the wrong version. Now I updated the question with a fixed and working code and I already removed some more spaces as suggested by @FryAmTheEggman – Byte Commander – 2016-04-14T19:42:19.030

You can define j=''.join once and than use j(c[x]...). Should save a few bytes. – Jakube – 2016-04-14T20:06:48.033

@Jakube Thanks, that saved 8 bytes. 36 more to go. – Byte Commander – 2016-04-14T20:52:49.200

you don't need a space in ) for – Cyoce – 2016-04-16T19:06:10.060

1Also, as a golfing suggestion: golf is a 4 byte function name. Try g. – Rɪᴋᴇʀ – 2016-04-19T18:24:29.560

Answers

9

Python 3, 108 107 bytes

Since the cube only contains the strings "X" and "Z", there are only two valid cube patterns. The one that starts with XZXZX... and the one that starts with ZXZXZ....

My solutions generates these 2 cubes and checks if the inputted cube is one of them.

def golf(l):L=len(l);r=range(L);return l in[[[list("XZ"*L)[(i+j+k)%2:][:L]for j in r]for k in r]for i in r]

i iterates over the possible cubes. Since the dimension is at least 2, we can reuse r instead of writing for i in(0,1).

Jakube

Posted 2016-04-14T19:12:05.573

Reputation: 21 462

With length 2, don't the cube patterns start with XZZX or ZXXZ? – Sparr – 2016-05-02T07:54:48.097

@Sparr Yes. With "The one that starts with XZXZX..." I meant only the first row of the top layer. In the case of length 2 it starts with "XY". – Jakube – 2016-05-02T08:11:45.153

7

Python 3, 60 bytes

golf=g=lambda l:all(g(a)*g(b)*(a!=b)for a,b in zip(l,l[1:]))

The function recursively decides whether an N-dimensional array is alternating by checking if:

  • Any two adjacent elements are unequal
  • Each element is alternating

This successfully bottoms out for the strings 'X' and 'Z' because their length is 1, so the all is taken of an empty list.

xnor

Posted 2016-04-14T19:12:05.573

Reputation: 115 687

5

Python 3 with NumPy, 125 bytes

import numpy
def golf(a):a=numpy.array(a);return(a[:-1]!=a[1:]).all()&(a[:,:-1]!=a[:,1:]).all()&(a[:,:,:-1]!=a[:,:,1:]).all()

Python 3, 146 128 bytes

e=lambda x,y:x!=y
z=lambda f:lambda*l:all(map(f,*l))
u=lambda f,g:lambda a:z(f)(a,a[1:])&z(g)(a)
golf=u(z(z(e)),u(z(e),u(e,id)))

Anders Kaseorg

Posted 2016-04-14T19:12:05.573

Reputation: 29 242

Great, thank you! The test environment unfortunately did not contain NumPy, but the other solution works like a charm. – Byte Commander – 2016-04-14T21:04:44.633

@ByteCommander if this is on your computer, opening terminal/cmd type pip install numpy. Then try again after it finishes. – Rɪᴋᴇʀ – 2016-04-19T14:49:48.877

@EasterlyIrk No, it was an online challenge. I have no way to alter the environment. – Byte Commander – 2016-04-19T15:19:39.647

@ByteCommander you should get python anyway. – Rɪᴋᴇʀ – 2016-04-19T18:23:37.650