style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Más fácil que FizzBuzz

En reddit el día de hoy apareció el siguiente link:

http://www.thousandtyone.com/blog/EasierThanFizzBuzzWhyCantProgrammersPr...

"Más fácil que FizzBuzz, ¿por que los programadores no pueden imprimir del 100 al 1?" (por cierto no explica por qué)

Básicamente se trata de resolver este problema:

"Imprimir del 100 al 1 con la restricción de que el código debe de comenzar con: for ( int i = 0;, no puede haber nada antes y no se puede usar más de un loop"

Y explica que muchísimos fallan con eso, el tiempo ideal es de < 2 minutos, y si tardan más de 10 estan fuera (yo tarde 2:07 y funcionó en el primer intento).

Ahí se los dejo nomás para entretenerse:

public class M {
    public static void main( String ... a ) {
        for (int i = 0;
     }
}

Luego discutimos si tiene algún valor este tipo de preguntas y/o si alguien que se tarda más de 10 minutos o le toma varios intentos vale la pena ser considerado continuar siendo entrevistado.

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

fácil

Me salió a la primera y me tardé menos de un minuto. Está buena la pregunta, luego les digo por qué.

Imagen de ezamudio

Correlación

Lo que está muy bueno es la correlación entre el tiempo que se quejan de su chamba y el tiempo que les toma resolver el problema. No necesariamente significa algo, pero ciertamente está interesante.

Re: Más fácil

Yo tardé menos de un minuto y funcionó con el primer intento, aunque el compilador en línea se tardó algunos segundos en compilar y ejecutar... :-P

Imagen de juanjo23

So easy

01:07, contando la ejecución en línea de comandos.

Imagen de julgo

creo que me demore menos de

creo que me demore menos de 30 segundos en pensar la solución , no lo he realizado supongo que escribiéndola hubiera sido un minuto a minuto y medio , como dato se me ocurrio usar un menos dentro del for.. , alguno uso otra forma??

Imagen de Cid

Mi solución

Igual use una resta tarde como 3 minutos con todo y código, a lo mejor había otras soluciones pero elegí la primera que vino a mi mente.

System.out.println(100-i);
Imagen de Cid

Solución que no me gusta

No me gusta pero también lo hace:

public class M {

        public static void main(String... a) {
                for (int i = 0; i < 100; System.out.print(100 - i + " "), i++)
                {
                }
        }
}

Re: no me gusta

Con una pequeña modificación:

public class M {
    public static void main (String... a)  {
        for (int i = 0; i++ < 100; System.out.printf("%d ", 100 - i)) ;
    }
}
Imagen de Cid

Pero solo imprime del 99

Pero solo imprime del 99 hacia atras, si cambiamos el for ya lo hace desde el 100

for (int i = 0; i++ <= 100; System.out.printf("%d ", 101 - i));

Aunque aún así no me acostumbro a ver sentencias distintas a operaciones y declaraciones dentro de la sintaxis del for, tal vez porque casi nunca las veo.

Imagen de rodrigo salado anaya

Otra variante (Groovy)

for(int i = 0; i < 100; println(100 - i++));

Imagen de ezamudio

y la otra

hay dos formas de hacer la resta, esta es otra for(int i=0;i>-100;println(100+i--))

Imagen de rodrigo salado anaya

Una curiosidad (Groovy)

Solo por curiosidad de ver si se podía o no usar un closure, y quedo algo así:

for(int i = 0; {
   println(100 - i)
   return 99 > i++
}(););

¿99? Mea culpa >.<

¿99? Mea culpa >.<

public class M {     public

public class M {
    public static void main( String ... a ) {
        for (int i = 0; i < 100 ; i++ ) {
            System.out.println( 100 - i );
        }    
     }
}

Correcto, se puede poner la sentencia en el for, pero ¿porque lo harías? es terrible. Si, me tardé 2:07 en abrir el editor, escribir el public bla bla, pensar en la solución ( como 30s ) , hacerle una ejecución mental? (no quería hacerlo en dos intentos por el 99 , 0 etc. y listo, pare el cronómetro en 2:07

Obvio es muy sencillo, es como una pregunta de entrada, el artículo dice que hay quién no lo puede resolver ( por N razones ). Si alguien no lo resuelve en un tiempo considerable y se queja mucho, vale la pena continuar la entrevista? Habríamos perdido a jpaul aquí porque escribía 99?

No es lo mismo evaluar a alguien por algo tan pequeño como esto, ( o por preguntas meramente teóricas ), es muy difícil. En donde estoy me dejaron un proyecto sencillo, pero completo, de 16 hrs máximo, ( lo hice en 20 ) y dice que máximo porque le puedes seguir poniendo más y más features sin parar, y menos de 16 hrs. lo dejarías muy básico y con eso se evaluaba al candidato.

Desafortunadamente lo tuvimos que quitar porque ese proceso tomaba mucho tiempo y nos ganaban mucho candidatos buenos.

100 - i

He aquí mi solución original:

for (int i = 0; 100 - i > 0; i++) System.out.println(100 - i);

Jajaj ok entonces si pasas a

Jajaj ok entonces si pasas a la segunda pregunta.... oh, un momento, sin llaves después del for?

;) ;)

:'(

:'(

Imagen de Cid

Curiosidad


Correcto, se puede poner la sentencia en el for, pero ¿porque lo harías? es terrible.

Intencionalmente la coloque (deducí que no la debo de usar porque esta puede formar parte del bloque de código del for y si hablamos de legibilidad de código, algunos o varios podrían tardarse en interpretarlo ), y si fuera el caso con un reclutador cuando menos preguntaría cuales preguntas falle y porque falle, no me quedaría con el puesto pero cuando menos algo aprendería.


No es lo mismo evaluar a alguien por algo tan pequeño como esto, ( o por preguntas meramente teóricas ), es muy difícil

La mayoria de las veces los reclutadores como no son gente del área, pues ni lo teórico preguntan (he visto a varios reclutadores), cuando menos con algo básico puedes evitar tener una papa caliente.


vale la pena continuar la entrevista? Habríamos perdido a jpaul aquí porque escribía 99?

Yo he entrevistado gente, y no es que yo tenga mucho conocimiento, pero la realidad es que no confiaron en los reclutadores por lo que ya mencione anteriormente, yo si continuaria la entrevísta aunque se tardarán más de 10 minutos, siempre y cuando la resolvieran, y tampoco descartaría a jpaul podría ser que por el afan de hacer algo rápido por la presión se descuido, y si tal vez digan pero si asi se descuido como confiarias en algo que haga para un entorno productivo, y pues como siempre contestaría somos humanos y todos cometemos errores algún día, eso si se vigilaría más el trabajo de estas personas al principio.

Imagen de julgo

otra solucion

esta si no se quien se atreva a escribir los 100 números , pero es una solución no?
pasándole lista de argumentos en el comando :
java M 100 99 98 97 96 .........0

public class M {
     public static void main( String ... a ) {
         for (int i = 0; i < 100 ; i++ )
             out.println( a[i] );
     }
}
 
Imagen de Cid

Varargs

Ya que usaste un varargs (argumento variadico) y son bastantes números, digo suena algo enfermo (no digo que tu solución lo sea) añadir miles o tal vez millones de argumentos pero solo por curiosidad investigue cuantos permitiría y encontre que sería el limite de tamaño de un arreglo, lo cual varia de virtual machine en virtual machine:

limit size of arrays

El sentido de mostrar otras soluciones, denota conocimiento del lenguaje y creatividad, tal vez el reclutador este buscando estas características tambien.

Re: rápido

… y tampoco descartaría a jpaul podría ser que por el afan de hacer algo rápido por la presión se descuido …

Fast

Imagen de Cid

la misma gata pero revolcada

public class M {

        public static void main(String [] args){
                for (int i = 0 ; i != 100;){
                        System.out.printf("%d ", 100-i++);
                }
        }
}

La pregunta es buena para ver

La pregunta es buena para ver si el entrevistado sabe las idiosincrasias de algún lenguaje de programación:

for (var i = 0; 100 - i; i++) {
  console.log(100 - i);
}

O bien para determinar que tanto tiempo le gusta perder en un ciclo for...

for (var i = 0; ++i; i-=2) {
  var imprimir_los = function(xs) {
    var elementos_de = function(xs, i, j) {
      if (i <= j) {
        console.log(xs[i]);
        elementos_de(xs, i + 1, j);
      }
    }
    elementos_de(xs, 0, xs.length);
  };
  var numeros = function(p) {
    var insertados_en = function(xs, i, j) {
      if (i >= j) {
        xs.push(i);
        insertados_en(xs, --i, j);
      }
      return xs;
    }
    return insertados_en([], p.desde_el, p.hasta_el);
  }
 
  //imprimir_los(numeros({"desde_el": 50, "hasta_el": 10}));
 
  //imprimir_los(numeros({"desde_el": 5, "hasta_el": 0}));
 
  imprimir_los(numeros({"desde_el": 100, "hasta_el": 1}));
}

y pasar con el siguiente entrevistado ;-)

Imagen de julgo

otra solucion original

El sentido de mostrar otras soluciones, denota conocimiento del lenguaje y creatividad, tal vez el reclutador este buscando estas características tambien.
si ante una pregunta el entrevistado te muestra varias opciones explicando ventajas y desventajas entre una y otra , es necesario seguir preguntando? alguien que sabe se nota al instante por su manera de responder expresarse y rebatir con conviccion .
a mi me toco un entrevistador que queria ejecutar mi .war dandole doble click......pfff
en cuanto al codigo de @Antonio Hernand no lo entendi pero me hizo acordar una funcion recursiva y aqui mi ultima solucion :

public class M {
   
 public static void main(String args[]) {
     for (int i = 0; i <=1; i++) {
          imprime(100);
         }
  }
 static void imprime(int n){
  out.println(n);
   n--;
     if(n>0)
         imprime(n);
 }
}
 
Imagen de rodrigo salado anaya

Complejidad innecesaria.

Hola @Antonio, considero que tu código tiene un exceso de complejidad innecesaria, usar el for como una especie de Main no es una buena idea, incluso si te obligaran a usarlo así, podrías escribir algo un poco menos complejo, p.e.:

for(var i = 0; !i; i++) {
  console.log(i)
}

No considero que usar funciones recursivas en JavaScript sea mala idea, pero debes tener mucho cuidado en los escenario que eliges para ese tipo de tareas. Echale un ojo a esto

Por otro lado, la misma curiosidad de una función anónima dentro del for en JS:

for(var i = 0; function() {
   console.log(100 - i)
   return 99 > i++
}(););

Saludos.

Imagen de ezamudio

código

Se clavan mucho en el código. Yo creo que la pregunta es útil no tanto por el código que la persona escriba, sino por ver el proceso por el cual llega a esa línea o dos líneas que escriba. Para mi, la mejor respuesta sería:

for (int i=0; i < 100; i++) {
  System.out.println(100-i);
}

Y ya. Sin cosas rebuscadas, código bien escrito, que hace lo que tiene que hacer, no es rebuscado, y ya.

Nuevamente, esto que sigue es mi opinión muy personal:

¿Por qué es importante que lo escriba en menos de dos minutos? Porque el problema es bastante simple y la neta si no encuentran la solución rápido ps ni al caso continuar. Oscar puede hacerse el mártir todo lo que quiera pero en la entrevista seguramente nadie va a contar el tiempo que se tarde en abrir el editor de su preferencia, o en compilar el código, porque el entrevistador ya se sabe las pocas respuestas aceptables y ni siquiera es necesario compilarlo (o pueden usar algo tipo groovyConsole para compilarlo y ejecutarlo rápido y simple).

¿Por qué es importante que lo hagan bien a la primera? Cualquier programador se puede poner a teclear soluciones y probarlas hasta encontrar una que funcione. Eso es un code monkey. Gracias por participar, pero no gracias. Un buen programador le piensa un rato, y luego escribe el código. Para un problema tan simple, sí espero que lo puedan escribir bien a la primera; es muy importante que primero piensen lo que van a hacer, y luego lo hagan. Qué tal si eso de escribir código nomás para ver si jala lo hace siempre, ya en proyectos reales? Alguien va a tener que mantener ese código. Que si tal vez lo hagan mal por la presión de la entrevista, pues sí, pero es un buen ejemplo también de cómo se comportan bajo presión, porque seguramente habrá un momento en que tengan que trabajar así (obvio debe ser algo esporádico; si un programador está constantemente trabajando bajo presión, algo anda mal).

...pero también tuve que

...pero también tuve que salvar el archivo y luego ... compilaaar! ( e invocar el interprete ) :D :D

Pues estoy 7 segs más arriba de un candidato normal, he tenido que suplir mis carencias con esfuerzo extra.

¡Psst! Oye, Oscar ...

¡Psst! Oye, Oscar … Para estos casos tal vez quieras usar http://ideone.com/. Ya incluye el método main. ¡Ya no tienes que escribirlo! ;-)

Imagen de Cid

jajaja

Yo si conte ese tiempo jajaja.

Imagen de Cid

Preguntas en una entrevista

Ya que se habla del tema:

Programming Interview Resources

Claro ... menos que me he

Claro ... menos que me he tardado en solo escribir y compilar ( ya sabiendo la respuesta obvio) 45 secs ( y mejorando )

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">