C, 91 102 bytes, corrigidos (novamente), jogados e testados em tempo real:
<strike>s(c){p,f,d;for(p=2,f=d=0;p<c&&!d;){if(c%p==0){c/=p;++f;if(c%p==0)d=1;}++p;}c==p&&f==2&&!d;}</strike>
s(c){int p,f,d;for(p=2,f=d=0;p<c&&!d;){if(c%p==0){c/=p;++f;if(c%p==0)d=1;}++p;}return c==p&&f==2&&!d;}
/ * Isso também funciona em 93 bytes, mas como eu esqueci as regras padrão que restringem o tipo int padrão em variáveis dinâmicas e sobre o fato de não permitir valores implícitos de retorno sem atribuições, não vou aceitar:
p,f,d;s(c){for(p=2,f=d=0;p<c&&!d;){if(c%p==0){c/=p;++f;if(c%p==0)d=1;}++p;}p=c==p&&f==2&&!d;}
(Quem disse que eu sabia alguma coisa sobre C? ;-)
Aqui está o quadro de teste com o script shell nos comentários:
/* betseg's program for sphenic numbers from
*/
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <math.h> /* compile with -lm */
/* l,j;a(i){for(l=1,j=0;l<i;i%++l?:(i/=l,j++));l=i==1&&j==3;} */
#if defined GOLFED
l,j;a(i){for(l=1,j=0;l++<i;fmod((float)i/l,l)?i%l?:(i/=l,j++):(j=9));l=i==1&&j==3;}
#else
int looker, jcount;
int a( intval ) {
for( looker = 1, jcount = 0;
looker++ < intval;
/* Watch odd intvals and even lookers, as well. */
fmod( (float)intval/looker, looker )
? intval % looker /* remainder? */
? 0 /* dummy value */
: ( inval /= looker, jcount++ /* reduce the parameter, count factors */ )
: ( jcount = 9 /* kill the count */ )
)
/* empty loop */;
looker = intval == 1 && jcount == 3; /* reusue looker for implicit return value */
}
#endif
/* for (( i=0; $i < 100; i = $i + 1 )) ; do echo -n at $i; ./sphenic $i ; done */
Peguei emprestada a resposta anterior da betseg para chegar à minha versão.
Esta é a minha versão do algoritmo da betseg, que joguei para chegar à minha solução:
/* betseg's repaired program for sphenic numbers
*/
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
int sphenic( int candidate )
{
int probe, found, dups;
for( probe = 2, found = dups = 0; probe < candidate && !dups; /* empty update */ )
{
int remainder = candidate % probe;
if ( remainder == 0 )
{
candidate /= probe;
++found;
if ( ( candidate % probe ) == 0 )
dups = 1;
}
++probe;
}
return ( candidate == probe ) && ( found == 2 ) && !dups;
}
int main( int argc, char * argv[] ) { /* Make it command-line callable: */
int parameter;
if ( ( argc > 1 )
&& ( ( parameter = (int) strtoul( argv[ 1 ], NULL, 0 ) ) < ULONG_MAX ) ) {
puts( sphenic( parameter ) ? "true" : "false" );
}
return EXIT_SUCCESS;
}
/* for (( i=0; $i < 100; i = $i + 1 )) ; do echo -n at $i; ./sphenic $i ; done */
60
um número esfênico?2 × 2 × 3 × 5