Hi Elias,

If I understood your solution correctly, it basically boils down to the 
(correct, as far as I can tell)
assumption that, for every block of adjacent face-down pancakes, you need two 
flips:
- one to flip all the pancakes up to the first face-down one
- one to flip the whole block of now face-down pancakes back face-up

This seems to always be correct, except if the very top block is face-down, in 
which case one
extra flip is required for that block.

Having understood this, I came up with a slightly different solution:
(~↑X)+2×+/2>/X  if 0 represents a face-down pancake, and
(↑X)+2×+/2</X   obviously if 1 represents a face-down one.

Does this seem correct to you? If it does, I hope it helped others understand 
your solution.

Cheers,
Louis

> On 23 Jun 2016, at 02:39, Elias Mårtenson <loke...@gmail.com> wrote:
> 
> No, actually not. The problem statement says that the final state of the 
> pancake stack should be that they are all facing up. Thus if the final state 
> is 0,there needs to be an extra flip done.
> 
> Regards, 
> Elias
> 
> On 23 Jun 2016 02:25, "Juergen Sauermann" <juergen.sauerm...@t-online.de 
> <mailto:juergen.sauerm...@t-online.de>> wrote:
> Hi,
> 
> a minor bug below:
> 
>       +/(X,1)≠(1↑X),X←1 1 1 0 1 1 1 1 1 0 0 0 1 0 0 1 0 0 0 0
> 8
>       +/(X,1)≠(1↑X),X←1 1 1 0 1 1 1 1 1 0 0 0 1 0 0 1 0 0 0 1
> 8
> 
> Maybe you meant
> 
>       +/(X,¯1↑X)≠(1↑X),X←1 1 1 0 1 1 1 1 1 0 0 0 1 0 0 1 0 0 0 0
> 7
>       +/(X,¯1↑X)≠(1↑X),X←1 1 1 0 1 1 1 1 1 0 0 0 1 0 0 1 0 0 0 1
> 8
> 
> /// Jürgen
> 
> 
> On 06/22/2016 08:27 AM, Elias Mårtenson wrote:
>> I've CC'ed the gnu-apl list with my answer to Christian's question, since I 
>> think this is an interesting discussion. For the newcomers, this is about 
>> the solution to this Codejam question: 
>> https://code.google.com/codejam/contest/6254486/dashboard#s=p1 
>> <https://code.google.com/codejam/contest/6254486/dashboard#s=p1>
>> 
>> It's quite simple actually. The idea is simply based on the observation that 
>> what you really want to compute is the number of transitions 0→1 and 1→0.
>> 
>> The original list is compared to another list that is the same as the 
>> original, but shifted one step to the left. The last element shifted in is a 
>> 1, since you always want the final stack to be face-side-up.
>> 
>> Thus, the comparison is:
>> 
>> 1 1 1 0 1 1 1 1 1 0 0 0 1 0 0 1 0 0 0 1
>> 1 1 0 1 1 1 1 1 0 0 0 1 0 0 1 0 0 0 1 1
>> ---------------------------------------
>> 0 0 1 1 0 0 0 0 1 0 0 1 1 0 1 1 0 0 1 0
>> 
>> Then, all you have to do is to count the number of ones in the result.
>> 
>> Addendum:
>> 
>> I just thought of a different way to think of this. If I simply remove any 
>> series of consecutive numbers, all I have to do is to count the length of 
>> the resulting array (subtracting one if the final element is 1). However, 
>> the method of eliminating duplicates in APL is very similar to the above 
>> solution (comparing with a shifted array) so even if you approach the 
>> problem in this way, the code will be pretty much identical.
>> 
>> Regards,
>> Elias
>> 
>> On 22 June 2016 at 13:09, Christian Robert <christian.rob...@polymtl.ca 
>> <mailto:christian.rob...@polymtl.ca>> wrote:
>>       X←¯1+?20⍴2
>>       X
>> 1 1 1 0 1 1 1 1 1 0 0 0 1 0 0 1 0 0 0 1
>>       +/(X,1)≠(1↑X),X
>> 8
>> 
>> 
>> Well, 8 is the answer to the question, it says nothing on how to solve that 
>> puzzle.
>> 
>> A point + on your QI(fr) or IQ(us).
>> 
>> eg: Keep your mind on the question, not on the solution.
>> 
>> if you can elaborate on the 8 here, please do explain.
>> 
>> well, I will dissect your code and try to figure out by myself.
>> well, no, finally just tell me how that work.
>> 
>> many thanks,
>> 
>> Xtian.
>> 
>> 
>> On 2016-06-22 00:47, Elias Mårtenson wrote:
>> All solutions are available here: https://www.go-hero.net/jam/16 
>> <https://www.go-hero.net/jam/16>
>> 
>> But the relevant core of my solution is here (minus all the file parsing 
>> stuff):
>> 
>>       +/(X,1)≠(1↑X),X
>> 
>> Where X is an array of 1 and 0 representing the state of the pancake stack.
>> 
>> The code should be pretty clear, but please let me know if you need help 
>> understanding it and I'll be happy to explain.
>> 
>> For reference, the full code is here:
>> 
>> ∇Z←solve_case X
>>   Z ← +/(X,1)≠(1↑X),X
>> ∇
>> 
>> ∇Z←IN read_case I ;line
>>   line ← ⎕UCS ¯1↓FIO∆fgets IN
>>   ⎕←"Case #",(⍕I),": ",(⍕solve_case line='+')
>>   Z←⍬
>> ∇
>> 
>> ∇solve FILENAME ;fd;n;s
>>   fd ← "r" FIO∆fopen FILENAME
>>   n ← ⍎ ⎕UCS ¯1 ↓ FIO∆fgets fd
>>   ({(⍵+1)⊣fd read_case ⍵}⍣n) 1
>>   FIO∆fclose fd
>> ∇
>> 
>> Regards,
>> Elias
>> 
>> On 22 June 2016 at 12:36, Christian Robert <christian.rob...@polymtl.ca 
>> <mailto:christian.rob...@polymtl.ca><mailto:christian.rob...@polymtl.ca 
>> <mailto:christian.rob...@polymtl.ca>>> wrote:
>> 
>>     Can I see your solution to the stack of pancakes ?
>> 
>>     I wrote a Lambda (at that time, 2 months ago) to reverse some pancakes 
>> off the top of the stack and experimented with that.
>> 
>>     No obvious solution came to me.
>> 
>>     I only need the mechanics/algorithm, not the READ from file part (but 
>> you can provide it if relevant).
>> 
>>     thanks,
>> 
>>     Xtian.
>> 
>> 
>>     On 2016-04-10 07:48, Elias Mårtenson wrote:
>> 
>>         Yesterday, I participated in the Google Code Jam (programming 
>> competition). For one of the tasks, APL was a very good fit. The question is 
>> here: https://code.google.com/codejam/contest/6254486/dashboard#s=p1 
>> <https://code.google.com/codejam/contest/6254486/dashboard#s=p1>
>> 
>>         My solution (which I will not post right now, since one of you might 
>> want to give it a shot first) was terse and simple. A very simple APL 
>> expression.
>> 
>>         However, reading the input a file and formatting the result took 
>> many lines of very ugly code.
>> 
>>         This attempt at using APL to solve a real-world programming problem 
>> illustrated two separate issues that, needs to be handled:
>> 
>>         Firstly, the FILE_IO library is way too low-level. For example, in 
>> the Codejam tasks, one usually have to read a whitespace-limited sequence of 
>> numbers. When I solve the problems in Lisp, all I need to do is to call 
>> READ. A flextible IO probrary that makes these kinds of this simple would be 
>> nice.
>> 
>>         I could (and indeed have considered to) write such functions in APL, 
>> but this causes a second problem:
>> 
>>         Error handling in GNU APL is very bad. In particular, there is 
>> nothing similar to UNWIND-PROTECT (or try/finally in Java). There is no way 
>> to safely write code that opens a file, works on it and then closes it. If 
>> an error occurs, there is no way to ensure that the filehandle is closed. 
>> When I developed my solution to the Codejam problem, I ended up leaking a 
>> lot of file handles.
>> 
>>         Does anyone know how Dyalog and other vendors handle this? Do they 
>> have a full exception system?
>> 
>>         Regards,
>>         Elias
>> 
>> 
>> 
> 

Reply via email to