[Python] Le 100 porte

Carlos Catucci carlos.catucci a gmail.com
Dom 26 Apr 2015 14:42:57 CEST


Stavo guardando il problema delle 100 porte e le soluzioni nei vari
linguaggi.

Ad esempio ecco la versione ottimizzata in Go

package main

import "fmt"

func main() {
    var door int = 1
    var incrementer = 0

    for current := 1; current <= 100; current++ {
        fmt.Printf("Door %d ", current)

        if current == door {
            fmt.Printf("Open\n")
            incrementer++
            door += 2*incrementer + 1
        } else {
            fmt.Printf("Closed\n")
        }
    }
}

quella Java

public class Doors{
   public static void main(String[] args){
      int i;
      for(i = 1; i < 101; i++){
         double sqrt = Math.sqrt(i);
         if(sqrt != (int)sqrt){
            System.out.println("Door " + i + " is closed");
         }else{
            System.out.println("Door " + i + " is open");
         }
      }
   }
}

Gia meglio quello Javascript (che sto comunque riscoprendo ed apprezzando)

for (var door = 1; door <= 100; door++) {
  var sqrt = Math.sqrt(door);
  if (sqrt === (sqrt | 0)) {
    console.log("Door %d is open", door);
  }
}

Anche quella in C non mi spiace

#include <stdio.h>

int main()
{
    int i;
    for (i = 1; i * i <= 100; i++)
        printf("door %d open\n", i * i);

    return 0;
}

ora tocca a C++

#include <iostream> //compiled with "Dev-C++" , from RaptorOne

int main()
{
    for(int i=1; i*i<=100; i++)
            std::cout<<"Door "<<i*i<<" is open!"<<std::endl;
}

Il mio primo linguaggio, il Forth

: squared ( n -- n' )  dup * ;
: doors ( n -- )
    1 begin 2dup squared >= while
        dup squared .
    1+ repeat 2drop ;
100 doors

Il solito Perl

while( ++$i <= 100 )
{
    $root = sqrt($i);
    if ( int( $root ) == $root )
    {
        print "Door $i is open\n";
    }
    else
    {
        print "Door $i is closed\n";
    }
}

tocca al php

<?php
for ($i = 1; $i <= 100; $i++) {
    $root = sqrt($i);
    $state = ($root == ceil($root)) ? 'open' : 'closed';
    echo "Door {$i}: {$state}\n";
}
?>

Il Prolog (che come leggibilita' si batte per il trofeo al contrario,
ovvero chi ci capisce nulla

doors_optimized(N) :-
    Max is floor(sqrt(N)),
    forall(between(1, Max, I),
           (   J is I*I,format('Door ~w is open.~n',[J]))).


L'ultimo "gioiello" di Cupertino

/* declare enum to identify the state of a door */
enum DoorState : String {
    case Opened = "Opened"
    case Closed = "Closed"
}

/* declare list of doors state and initialize them */
var doorsStateList = [DoorState](count: 100, repeatedValue:
DoorState.Closed)

/* set i^2 doors to opened */
var i = 1
do {
    doorsStateList[(i*i)-1] = DoorState.Opened
    ++i
} while (i*i) <= doorsStateList.count

/* print the results */
for (index, item) in enumerate(doorsStateList) {
    println("Door \(index+1) is \(item.rawValue)")
}

Restando in tema di gemme, Ruby

doors = [false] * 100
100.times do |i|
  (i ... doors.length).step(i + 1) do |j|
    doors[j] = !doors[j]
  end
end
puts doors.map.with_index(1){|d,i| "Door #{i} is #{d ? 'open' : 'closed'}."}

e per finire il nostro amato Python(e)

print '\n'.join(['Door %s is %s' % (i, ('closed',
'open')[(i**0.5).is_integer()]) for i in xrange(1, 101)])

Io mi astengo dal commentare (sono di parte dite?) ma mi piacerrebbe
sentire commenti sui vari modi di risoluzione. Perche' preferite una data
soluzione?

Carlos
-- 
EZLN ... Para Todos Todo ... Nada para nosotros
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20150426/93fae1a2/attachment.html>


Maggiori informazioni sulla lista Python