Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Concurso De Programacion

Iniciado por MA]Mestre, 09 de Marzo de 2005, 04:06:21 PM

« anterior - próximo »

nostromo

 
Cita de: "nostromo"
#include<stdio.h>
s,j;main(d){for(scanf("%d",&d);~6&d-3?0:j<d*d;printf("\n%-3d"+(j++%d>0),(s-j%d+d/2)%d*d+s%d+1))s=j%d*2-j/d+d;}


Me acabo de dar cuenta que he metido dos j%d redundantes dentro de la expresion....
deberian ser solo j y hubiera tenido 123 caracteres!!!!   (nooo)  

gdl

 Además, nostromo, sobraba el +d en la asignación de la s ya que si hubieras quitado el j%d nunca saldría negativo:

#include<stdio.h>
s,j;main(d){for(scanf("%d",&d);~6&d-3?0:j<d*d;printf("\n%-3d"+(j++%d>0),(s-j+d/2)%d*d+s%d+1))s=j*2-j/d;}


Por cierto, me ha gustado mucho la forma que tienes de ver si los valores son correctos.

JuanK

 creo que es muy vada la solucion,
con excepcion de que ha cometido bugs, = que todos los demas.

manko

 
Cita de: "Cronodragón"Ups, estaba seguro que Nostromo había hecho algo similar a mí. Bueno, este es mi código de 126 caracteres incluyendo un cambio de línea de 1 caracter:

#include <stdio.h>
main(){char n[99];FILE*f;scanf("%s",&n);if(f=fopen(n,"r")){while(!feof(f)){fgets(n,99,f);printf("%s",n);}}}


Nadie se dió cuenta de que las condiciones del concurso no dicen nada acerca de que no se puedan usar archivos adicionales al .c, y tampoco dicen nada sobre que el programa tenga que desarrollar matemáticamente el cuadrado, simplemente dice que lo muestre en pantalla. :) Así que junto a ese código van 4 archivitos llamados "3", "5", "7" y "9" que tienen el cuadrado pre-diseñado y listo para se lanzado a la consola. Espero que hayan valido esos exámenes en la universidad donde los profesores se pasaban de listos y ponían trampas en los encabezados de los problemas, por lo que te forzaban a leer con cuidado... y sino, fue divertido hacer esa solución válida. Que gane el mejor! :D
No se si lo estais poniendo en tono de risa y yo no lo pillo.

Pero desde luego estas soluciones con archivos adicionales no deben valer, esta claro. Sino no se porque directamente no se mando:

#include"b.h"
main(){c();}

con su correspondiente b.h con el codigo del cuadrado magico en una funcion c(){...}
29 bytes !!!

manko

 Por cierto, enhorabuena me han gustado mucho vuestras soluciones!

PD: yo me he quedado en 141 Bytes

gdl

 ¡Claro manko! Ahora comprendo aquél de los 22 bytes....

nostromo

 
Cita de: "gdl"Además, nostromo, sobraba el +d en la asignación de la s ya que si hubieras quitado el j%d nunca saldría negativo:

#include<stdio.h>
s,j;main(d){for(scanf("%d",&d);~6&d-3?0:j<d*d;printf("\n%-3d"+(j++%d>0),(s-j+d/2)%d*d+s%d+1))s=j*2-j/d;}


Por cierto, me ha gustado mucho la forma que tienes de ver si los valores son correctos.
Sip, una cosa lleva a la otra. Y el caso es que la misma expresión la escribi de varias formas , creo me obsesione tanto con darle vueltas a la expresion que al final se me olvido lo que me acabas de decir; y lo tenia apuntado en alguno de los 10 folios de apuntes que tire a la basura nada más enviar el codigo.   :rolleyes:

Eso si, me alegre de enviarlo porque no veas el tiempo que "perdi" con el tema.

Al principio tenia i

gdl

 
Cita de: "nostromo"Al principio tenia i
Una pena que la instrucción SAR de los Intel no esté preparada para desplazamientos mayores de 32 bits y sólo tome los últimos 5 bits del segundo operando. Por esta razón mi código falla en los PCs cuando se pone el 99 (=32*3 + 3). (asco)  

ZeruGiran

 Mi codigo de 142 caracteres incluyendo 1 caracter de salto de linea:


#include<stdio.h>
n,x,c;main(){for(scanf("%d",&n);x<99&!(n-3&~6);)c==(n-1+x-x/n*2)%n*n+(n/2+x-x++/n)%n?printf("%-3d%c",x,(++c%n)?0:10),x=0:0;}


Con saltos de linea:


#include<stdio.h>
n,x,c;
main()
{
for(scanf("%d",&n);x<99&!(n-3&~6);)
 c==(n-1+x-x/n*2)%n*n+(n/2+x-x++/n)%n?printf("%-3d%c",x,(++c%n)?0:10),x=0:0;
}


Citar
GDL: Por cierto, supongo que no se tendrán en cuenta las limitaciones de las arquitecturas porque en i386 todos los que usen int van a descubrir que su código falla cuando se introduce el número 4294967299. blink.gif

El mio no fallo. :) Pero parece que perdi de todos modos :(

Saludos.

ZeruGiran

 ¿Que dicen la reglas hacerca de la la impresion del resultado?
Algunos codigo dan como resultado algo como:


4  9  2
3  5  7
8  1  6  bash-3.00$


Y otros esto:


4  9  2
3  5  7
8  1  6  
bash-3.00$



Notese el salto de linea despues del 6.

Creo que Nostromo va ganando ¿cierto? :)

Pogacha

 Claro:

Archivo cuadrado.c :
#include"a"

Archivo a :
#include<stdio.h>
#include<stdlib.h>
#define f (sizeof(int))

int i,j,k,l,m,*t,*u,*v;
int r(x)int x;{return (rand()/256)%x;}
void p(x,y)int *x,y;{for(i=y;--i;k=x[i],x[i]=x[j],x[j]=k)j=r(i+1);}

void o(n,a,q,d)int n,d,*a,*q;
{
  for(m=r(2)?n:1,t=q,l=n/2,i=n;
      i--&&(i!=l||i--);
      *(t++)=i);
  for(p(q,n-1),q[n-1]=l,u=a,i=j=0;
      i<n*n;
      u[i] =q[j]*m,j++,++i%n||(++j,u+=d),j>=n&&(j-=n));
  for(p(q,n-1),u=a,m=n+1-m,i=0,j=n-1;
      i<n*n;
      u[i]+=q[j]*m,j++,++i%n||(--j,u+=d),j>=n&&(j-=n));
}

void s(n,a,q,d)int n,d,*a,*q;
{
  for(q[1]=3-(*q=r(n)),q[3]=3-(q[2]=1^q[r(2)]),t=a,i=n,m=3*r(2);
      i--;
      t+=d)
  for(j=n;
      j--;
      t++[0]=q[j^(i&m)^(i/2)]);
  for(q[1]=3-(*q=r(n)),q[3]=3-(q[2]=1^q[r(2)]),t=a,i=n,m=3-m;
      i--;
      t+=d)
  for(j=n;
      j--;
      t++[0]+=q[j^(i&m)^(i/2)]*4);
}

void e(n,a,q,d)int n,d,*a,*q;
{
  int h,i,k,l,z,g=n/2;
  void (*m)();
  for((m=g!=4?g%2?o:e:s)(g,a,q,g+d),m(g,a+g,q,g+d),l=(n+d)*g,u=a,i=g;
      i--;
      u+=d)
  for(j=n;
      j--;
      j<g&&(*u+=g*2*g),l[u]=*u+(j<g?-1:3)*g*g,u++);
  for(i=g; i--; q[i]=i<g/2);
  for(h=k=(g+1)/2,v=a; v<a+n; v+=g){
     for(u=v,i=g; i--; u+=g+d){
        if(p(q,g),q[z=g-i-1])
        if(k)k--;
        else
        for(j=g;q[--j]||(q[j]=1,q[z]=0););
        else
        if(k>i)
        for(j=g;!q[--j]||(k--,q[z]=1,q[j]=0););
        if(q[i])
        if(h)h--;
        else
        for(j=g;q[--j]||j==z||(q[j]=1,q[i]=0););
        else
        if(h>i||(g==3&&h&&(k==2||i==z)))
        for(j=g;!q[--j]||j==z||(h--,i==z&&k--,q[i]=1,q[j]=0););
        for(t=q,j=g;j--;u++)
        if(0[t++])z=*u,*u=u[l],u[l]=z;
     }
     for(h=k=g/2-g%2,i=g;i--;q[i]=i<h);
  }
}

int main(c,v)
int c;
char **v;
{
  int n,*a,*b;
  srand(getpid());
  if(c<2 || sscanf(1[v],"%d",&n)!=1 || n<3) n=5;
  if(!((a=(int*)malloc(n*n*f))&&(b=(int*)malloc(n*f))))
     return perror("malloc"),1;
  (n!=4?n%2?o:e:s)(n,a,b,0);
  for(i=0;i<n*n;i++)
     printf("%4d%c",a[i]+1,(i+1)%n?' ':'\n');
  return 0;
}



11 bytes  

patagon

 Bueno menos mal que la gente opina, yo estaba flipando con la solución de cronodragon y que nadie dijera nada  :blink:  

nostromo

 
Cita de: "ZeruGiran"Creo que Nostromo va ganando ¿cierto? :)
Ojala!!!   :D  
Pero me temo que no, ses y gdl tienen menos caracteres que yo e imagino que hay gente por ahi de la que todabia no sabemos nada.   O_O


ZeruGiran

 NOSTROMO:

Por lo que lei:

ses: no cumple la regla de las diagonales.
gdl: tiene problemas con el 99 y 7x
JuanK: tiene problemas con 7x
Cronodragron: suponiendo que sea valido usar archivos externos, aun asi ya se aclaro que puedes meterle como parametro C:/autoexec.bat y saca basura (aunque estoy seguro que lo descalificaran).

Me parece que si vaz ganado, tu code quedo genial :)

CoLSoN2

Manuel F. Lara
Descargar juegos indie  - blog sobre juegos indie y casual
El Desarrollo Personal.com  - blog sobre productividad, motivación y espíritu emprendedor






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.