lunes, 16 de enero de 2017

Programando mi primer autómata en Java

Navegando en el foro de Java México me encontré con un post en el que solicitan ayuda para programar un autómata que reconozca el siguiente patrón 0*(11)+0* Me pareció interesante la nota, el Autómata debe aceptar cadenas con al menos un par de 1, rodeados de uno, muchos o ningún cero.

Cadenas aceptadas:
11
00000110000
11000
0000011
01111000

Cadenas no aceptadas:
001100110
0000111
111000
0101011
110011

Me he tomado el tiempo de hacer el diagrama del autómata

Aquí el código fuente

   

/*
 * Automata11
 * Copyright (C) 2017 Roberto Lopez marcos.robrto.lopez@gmail.com
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */
package com.rlopez.demo.automata;

import javax.swing.JOptionPane;

/**
 *
 */
public class Automata11 {
 //init state

 private static final int Q0 = 0;
 private static final int Q1 = 1;
 private static final int Q2 = 2;
 private static final int Q3 = 3;
 private int state;
 public StringBuilder buffer;

 public Automata11() {
  state = Q0;
 }

 public int getState() {
  return state;
 }

 public boolean accept(String str, boolean debug) {
  init();
  for (char c : str.toCharArray()) {
   int previousState = state;
   appendChar(c);
   System.out.println("'" + c + "' " + getStateName(previousState) + " -> " + getStateName(state));
  }
  return state == Q3;
 }

 private void init() {
  state = Q0;
  buffer = new StringBuilder();
 }

 private String getStateName(int stateToGet) {
  String stateName = "";
  switch (stateToGet) {
   case Q0:
    stateName = "Q0";
    break;
   case Q1:
    stateName = "Q1";
    break;
   case Q2:
    stateName = "Q2";
    break;
   case Q3:
    stateName = "Q3";
    break;
  }
  return stateName;
 }

 private void appendChar(char character) {
  if (character != '1' && character != '0') {
   System.err.println("Invalid character");
   return;
  }
  buffer.append(character);
  switch (state) {
   case Q0:
    if (character == '1') {
     state = Q1;
    } else {
     state = Q0;
    }
    break;
   case Q1:
    if (character == '1') {
     state = Q3;
    } else {
     state = Q2;
    }
    break;
   case Q2:
    //not matter accept any character
    state = Q2;
    break;
   case Q3:
    if (character == '1') {
     state = Q1;
    } else {
     state = Q3;
    }
    break;
   default:
    System.err.println("Error unknow state");

  }
 }

 public static void main(String args[]) {
  String string = JOptionPane.showInputDialog(null, "Enter the string with 0 and/or 1");
  Automata11 automata11 = new Automata11();
  System.out.println("The enter String '" + string + " is accept?:" + automata11.accept(string, true));

 }
}


   
Salida:
   

'0' Q0 -> Q0
'0' Q0 -> Q0
'0' Q0 -> Q0
'1' Q0 -> Q1
'1' Q1 -> Q3
'1' Q3 -> Q1
'1' Q1 -> Q3
'0' Q3 -> Q3
'0' Q3 -> Q3
The enter String '000111100 is accept?:true

   

viernes, 13 de enero de 2017

El Guero, mi gran rival en la primaria

Me acuerdo del Guero al menos unas 15 veces al año, me pregunto ¿que ha sido de el?, ¿a que se dedicara?. Nunca tuvimos la oportunidad de compartir nuestros sueños, no dudo que haya ido a la universidad, terminó la universidad, incluso una maestría.  Quizás hoy sea abogado, ingeniero, arquitecto o medico, dudo mucho que se inclinara a la Administración. Es posible que viva en Estados Unidos, con casa propia, una linda  esposa y quizás un par de hijos.
Durante los 6 años que duró la primaria, fuimos rivales, peleábamos por ser el alumno más destacado de un grupo de unos 20 niños, siempre tuvo a su favor el que sus padres tuvieran el grado de Bachiller y le dieran apoyo por las tardes.
La competencia era muy reñida, en ocasiones el obtenía el primer lugar, en otras era yo, así la pasamos toda la primaria, nos emocionaba competir, el uno al otro nos obligábamos a ser mejores cada día, podríamos decir que eramos el dúo Nauto-Sasuke.
A todo esto, le decíamos El Guero porque el era de piel blanca, lo heredo de su madre, una mujer que a sus 35 años tenía la dicha de poseer un cuerpo perfecto, medidas perfectas, bonitas piernas, buena estatura, unos pechos que se hacían notar. En ese entonces yo no tenía ni doce años, así que no, no fantaseaba con esa mujer.
A menudo El Guero y yo nos juntábamos a estudiar por las tardes, en su casa, su madre nos preparaba  unos ricos Buñuelos o Donas, y para acompañarlos un delicioso champurrado.
A finales del quinto grado se selecciona a la escolta, esta se compone por  los alumnos con mejores promedio, siendo el abanderado el del mejor promedio. El Guero me venció por unas décimas, así que el fue el abanderado.
La última vez que nos vimos fue en  los primeros meses de la secundaria, en la secundaría nos enfrentamos con rivales más complicados, los primeros meses le pusimos empeño y estábamos entre los mejores. Pero un día el Guero se fue a los Estados Unidos, en aquellos días no existía Facebook, Hotmail recién estaba viendo la luz, así que perdimos todo contacto. Creo que ese día deje de ponerle empeño al estudio, perdí la motivación, realmente la perdí, pude haber hecho más, haber ido a la Universidad con una beca, ser un buen ingeniero, pero no, empecé a pasar desapercibido y a quedar en el olvido.
Siempre fuimos esforzados, no se si eramos inteligentes, pero sacabamos buenas notas, eso si, a esa edad ninguno de los dos mostraba rasgos de lider. Hoy no se nada del Guero, pero me gustaría saber de el, problamente trabajé en una gran empresa, quizas hoy sea un gran lider, liderango un gran equipo, no se si algún día nos volvamos a encontrar, pero será entretenido.
En la vida necesitamos de un rival que nos impulse a ser mejores, este rival no tiene por que ser otro, podemos ser nosotros mismos.

martes, 10 de enero de 2017

Hacer un bucle(ciclo) en Batch para copiar y pegar un archivo

El otro día me vi en la necesidad de realizar pruebas con el espacio en disco duro, tenía la necesidad de llenar mi disco duro. Se me ocurrió crear un programa .bat con un bucle que copiara y pegara un archivo.

Para ello usé los siguientes comandos.

ComandoDescripción
FOR /L %variable IN (inicio, paso, fin)  DO(comandos)                                         Con esta forma adicional del comando FOR, podemos realizar un bucle que va desde inicio hasta fin inclusives y que aumenta o disminuye en funcion de lo especificado en paso, en variable se va guardando el valor del contador. Nota: En el archivo .bat la variable se debe definir %%variable
COPY origen destino Copia uno o más archivos en otra ubicación. Usaremos la versión más simple, sin opciones.
Aquí el programa para copiar y pegar el achivo "archivo.exe" 300 veces.

@echo off
echo Hola, Copiaremos un archivo
pause
for /L %%x in (1, 1, 300) do (
   echo %x
   copy "archivo.exe" "archivo(%%x).exe"
)