Problem: http://nabetani.sakura.ne.jp/hena/ordf04octsp/ Implementierungslinks: http://qiita.com/Nabetani/items/8ead5622e192d9655cf5
Wie immer aus der Ruby-Implementierung, bei der die meisten Testdaten weggelassen werden:
def solve(src0)
src = src0.to_i
Array.new(8){ |s|
if src[s]==1
w = (1..8).find{ |x| src[(s+x)%8]==1 }
w + (w==4 ? 1 : 2)
end
}.compact.sort.join
end
DATA.all?{ |line|
num, src, expected = line.split(/\s+/ )
actual = solve( src )
okay = expected == actual
puts( "%s %s:%s->%s ( %s )" % [(okay ? "ok" : "**NG**"), num, src, actual, expected] )
okay
}.tap{ |x| puts( x ? "everything is okay" : "something wrong" ) }
__END__
0 165 3445
1 80 48
2 255 33333333
Eine unkomplizierte Implementierung, die Sie mit dem Rest drehen können. Es ist einfacher, mit Rubinen umzugehen.
Der Teil, in dem sich die Anzahl der Eckpunkte ändert, wenn die Mitte zu einer geraden Linie wird, ist ad hoc.
damit.
Das Folgende ist ein Port davon zu C99 wie es ist:
//clang -std=c99 -Wall
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int compare( const void * a, const void * b ){
const char * ac = (const char * )a;
const char * bc = (const char * )b;
return *ac-*bc;
}
char * solve_impl( int src )
{
char buffer[9]={0};
char * pos=buffer;
for( int s=0 ; s<8 ; ++s ){
if ( src & (1<<s ) ){
int w=1;
for( ; w<=8 ; ++w ){
if ( src & (1<<((w+s)%8)) ){
break;
}
}
*pos=w+( w==4 ? '1' : '2' );
++pos;
}
}
qsort( buffer, pos-buffer, 1, compare );
return strdup( buffer );
}
char * solve( char const * src )
{
return solve_impl( atoi( src ) );
}
void test( char const * src, char const * expected )
{
char * actual = solve( src );
_Bool ok = 0==strcmp(actual, expected);
printf( "%s : %s / %s / %s\n", (ok ? "ok" : "**NG**"), src, expected, actual );
free( actual );
}
int main()
{
/*0*/ test( "165", "3445" );
/*1*/ test( "80", "48" );
/*2*/ test( "255", "33333333" );
return 0;
}
Das Sortieren ist mühsam. Es ist wirklich nervig. Davon abgesehen denke ich, dass es so ist. Ich denke, dass der Bereich, in dem die Zeichenkette durch Hinzufügen von "1" und "2" erstellt wird, der Sprache C entspricht.
Recommended Posts