6a391df5e0
* make.scm (check-scaffold-tinycc): New target. * guile/guix/make.scm (<target>): Add baseline field. (method-check): Handle baseline. * scaffold/tinycc/00_assignment.c: New file. * scaffold/tinycc/00_assignment.expect: New file. * scaffold/tinycc/01_comment.c: New file. * scaffold/tinycc/01_comment.expect: New file. * scaffold/tinycc/02_printf.c: New file. * scaffold/tinycc/02_printf.expect: New file. * scaffold/tinycc/03_struct.c: New file. * scaffold/tinycc/03_struct.expect: New file. * scaffold/tinycc/04_for.c: New file. * scaffold/tinycc/04_for.expect: New file. * scaffold/tinycc/05_array.c: New file. * scaffold/tinycc/05_array.expect: New file. * scaffold/tinycc/06_case.c: New file. * scaffold/tinycc/06_case.expect: New file. * scaffold/tinycc/07_function.c: New file. * scaffold/tinycc/07_function.expect: New file. * scaffold/tinycc/08_while.c: New file. * scaffold/tinycc/08_while.expect: New file. * scaffold/tinycc/09_do_while.c: New file. * scaffold/tinycc/09_do_while.expect: New file. * scaffold/tinycc/10_pointer.c: New file. * scaffold/tinycc/10_pointer.expect: New file. * scaffold/tinycc/11_precedence.c: New file. * scaffold/tinycc/11_precedence.expect: New file. * scaffold/tinycc/12_hashdefine.c: New file. * scaffold/tinycc/12_hashdefine.expect: New file. * scaffold/tinycc/13_integer_literals.c: New file. * scaffold/tinycc/13_integer_literals.expect: New file. * scaffold/tinycc/14_if.c: New file. * scaffold/tinycc/14_if.expect: New file. * scaffold/tinycc/15_recursion.c: New file. * scaffold/tinycc/15_recursion.expect: New file. * scaffold/tinycc/16_nesting.c: New file. * scaffold/tinycc/16_nesting.expect: New file. * scaffold/tinycc/17_enum.c: New file. * scaffold/tinycc/17_enum.expect: New file. * scaffold/tinycc/18_include.h: New file. * scaffold/tinycc/18_include.c: New file. * scaffold/tinycc/18_include.expect: New file. * scaffold/tinycc/19_pointer_arithmetic.c: New file. * scaffold/tinycc/19_pointer_arithmetic.expect: New file. * scaffold/tinycc/20_pointer_comparison.c: New file. * scaffold/tinycc/20_pointer_comparison.expect: New file. * scaffold/tinycc/21_char_array.c: New file. * scaffold/tinycc/21_char_array.expect: New file. * scaffold/tinycc/22_floating_point.c: New file. * scaffold/tinycc/22_floating_point.expect: New file. * scaffold/tinycc/23_type_coercion.c: New file. * scaffold/tinycc/23_type_coercion.expect: New file. * scaffold/tinycc/24_math_library.c: New file. * scaffold/tinycc/24_math_library.expect: New file. * scaffold/tinycc/25_quicksort.c: New file. * scaffold/tinycc/25_quicksort.expect: New file. * scaffold/tinycc/26_character_constants.c: New file. * scaffold/tinycc/26_character_constants.expect: New file. * scaffold/tinycc/27_sizeof.c: New file. * scaffold/tinycc/27_sizeof.expect: New file. * scaffold/tinycc/28_strings.c: New file. * scaffold/tinycc/28_strings.expect: New file. * scaffold/tinycc/29_array_address.c: New file. * scaffold/tinycc/29_array_address.expect: New file. * scaffold/tinycc/30_hanoi.c: New file. * scaffold/tinycc/30_hanoi.expect: New file. * scaffold/tinycc/31_args.c: New file. * scaffold/tinycc/31_args.expect: New file. * scaffold/tinycc/32_led.c: New file. * scaffold/tinycc/32_led.expect: New file. * scaffold/tinycc/33_ternary_op.c: New file. * scaffold/tinycc/33_ternary_op.expect: New file. * scaffold/tinycc/34_array_assignment.c: New file. * scaffold/tinycc/34_array_assignment.expect: New file. * scaffold/tinycc/35_sizeof.c: New file. * scaffold/tinycc/35_sizeof.expect: New file. * scaffold/tinycc/36_array_initialisers.c: New file. * scaffold/tinycc/36_array_initialisers.expect: New file. * scaffold/tinycc/37_sprintf.c: New file. * scaffold/tinycc/37_sprintf.expect: New file. * scaffold/tinycc/38_multiple_array_index.c: New file. * scaffold/tinycc/38_multiple_array_index.expect: New file. * scaffold/tinycc/39_typedef.c: New file. * scaffold/tinycc/39_typedef.expect: New file. * scaffold/tinycc/40_stdio.c: New file. * scaffold/tinycc/40_stdio.expect: New file. * scaffold/tinycc/41_hashif.c: New file. * scaffold/tinycc/41_hashif.expect: New file. * scaffold/tinycc/42_function_pointer.c: New file. * scaffold/tinycc/42_function_pointer.expect: New file. * scaffold/tinycc/43_void_param.c: New file. * scaffold/tinycc/43_void_param.expect: New file. * scaffold/tinycc/44_scoped_declarations.c: New file. * scaffold/tinycc/44_scoped_declarations.expect: New file. * scaffold/tinycc/45_empty_for.c: New file. * scaffold/tinycc/45_empty_for.expect: New file. * scaffold/tinycc/46_grep.c: New file. * scaffold/tinycc/46_grep.expect: New file. * scaffold/tinycc/47_switch_return.c: New file. * scaffold/tinycc/47_switch_return.expect: New file. * scaffold/tinycc/48_nested_break.c: New file. * scaffold/tinycc/48_nested_break.expect: New file. * scaffold/tinycc/49_bracket_evaluation.c: New file. * scaffold/tinycc/49_bracket_evaluation.expect: New file. * scaffold/tinycc/50_logical_second_arg.c: New file. * scaffold/tinycc/50_logical_second_arg.expect: New file. * scaffold/tinycc/51_static.c: New file. * scaffold/tinycc/51_static.expect: New file. * scaffold/tinycc/52_unnamed_enum.c: New file. * scaffold/tinycc/52_unnamed_enum.expect: New file. * scaffold/tinycc/54_goto.c: New file. * scaffold/tinycc/54_goto.expect: New file. * scaffold/tinycc/55_lshift_type.c: New file. * scaffold/tinycc/55_lshift_type.expect: New file. * scaffold/tinycc/56_btype_excess-1.c: New file. * scaffold/tinycc/56_btype_excess-1.expect: New file. * scaffold/tinycc/57_btype_excess-2.c: New file. * scaffold/tinycc/57_btype_excess-2.expect: New file. * scaffold/tinycc/58_function_redefinition.c: New file. * scaffold/tinycc/58_function_redefinition.expect: New file. * scaffold/tinycc/59_function_array.c: New file. * scaffold/tinycc/59_function_array.expect: New file. * scaffold/tinycc/60_enum_redefinition.c: New file. * scaffold/tinycc/60_enum_redefinition.expect: New file. * scaffold/tinycc/61_undefined_enum.c: New file. * scaffold/tinycc/61_undefined_enum.expect: New file. * scaffold/tinycc/62_enumerator_redefinition.c: New file. * scaffold/tinycc/62_enumerator_redefinition.expect: New file. * scaffold/tinycc/63_local_enumerator_redefinition.c: New file. * scaffold/tinycc/63_local_enumerator_redefinition.expect: New file. * scaffold/tinycc/64_macro_nesting.c: New file. * scaffold/tinycc/64_macro_nesting.expect: New file. * scaffold/tinycc/67_macro_concat.c: New file. * scaffold/tinycc/67_macro_concat.expect: New file. * scaffold/tinycc/70_floating_point_literals.c: New file. * scaffold/tinycc/70_floating_point_literals.expect: New file. * scaffold/tinycc/71_macro_empty_arg.c: New file. * scaffold/tinycc/71_macro_empty_arg.expect: New file. * scaffold/tinycc/72_long_long_constant.c: New file. * scaffold/tinycc/72_long_long_constant.expect: New file. * scaffold/tinycc/73_arm64.c: New file. * scaffold/tinycc/73_arm64.expect: New file. * scaffold/tinycc/74_nocode_wanted.c: New file. * scaffold/tinycc/74_nocode_wanted.expect: New file. * scaffold/tinycc/75_array_in_struct_init.c: New file. * scaffold/tinycc/75_array_in_struct_init.expect: New file. * scaffold/tinycc/76_dollars_in_identifiers.c: New file. * scaffold/tinycc/76_dollars_in_identifiers.expect: New file. * scaffold/tinycc/77_push_pop_macro.c: New file. * scaffold/tinycc/77_push_pop_macro.expect: New file. * scaffold/tinycc/78_vla_label.c: New file. * scaffold/tinycc/78_vla_label.expect: New file. * scaffold/tinycc/79_vla_continue.c: New file. * scaffold/tinycc/79_vla_continue.expect: New file. * scaffold/tinycc/80_flexarray.c: New file. * scaffold/tinycc/80_flexarray.expect: New file. * scaffold/tinycc/81_types.c: New file. * scaffold/tinycc/81_types.expect: New file. * scaffold/tinycc/82_attribs_position.c: New file. * scaffold/tinycc/82_attribs_position.expect: New file. * scaffold/tinycc/83_utf8_in_identifiers.c: New file. * scaffold/tinycc/83_utf8_in_identifiers.expect: New file. * scaffold/tinycc/84_hex-float.c: New file. * scaffold/tinycc/84_hex-float.expect: New file. * scaffold/tinycc/85_asm-outside-function.c: New file. * scaffold/tinycc/85_asm-outside-function.expect: New file. * scaffold/tinycc/86_memory-model.c: New file. * scaffold/tinycc/86_memory-model.expect: New file. * scaffold/tinycc/87_dead_code.c: New file. * scaffold/tinycc/87_dead_code.expect: New file. * scaffold/tinycc/88_codeopt.c: New file. * scaffold/tinycc/88_codeopt.expect: New file. * scaffold/tinycc/89_nocode_wanted.c: New file. * scaffold/tinycc/89_nocode_wanted.expect: New file. * scaffold/tinycc/90_struct-init.c: New file. * scaffold/tinycc/90_struct-init.expect: New file. * scaffold/tinycc/91_ptr_longlong_arith32.c: New file. * scaffold/tinycc/91_ptr_longlong_arith32.expect: New file. * scaffold/tinycc/92_enum_bitfield.c: New file. * scaffold/tinycc/92_enum_bitfield.expect: New file. * scaffold/tinycc/93_integer_promotion.c: New file. * scaffold/tinycc/93_integer_promotion.expect: New file. * scaffold/tinycc/COPYING: New file. * scaffold/tinycc/LICENSE: New file. include
123 lines
3.3 KiB
C
123 lines
3.3 KiB
C
/* example from http://barnyard.syr.edu/quickies/hanoi.c */
|
|
|
|
/* hanoi.c: solves the tower of hanoi problem. (Programming exercise.) */
|
|
/* By Terry R. McConnell (12/2/97) */
|
|
/* Compile: cc -o hanoi hanoi.c */
|
|
|
|
/* This program does no error checking. But then, if it's right,
|
|
it's right ... right ? */
|
|
|
|
|
|
/* The original towers of hanoi problem seems to have been originally posed
|
|
by one M. Claus in 1883. There is a popular legend that goes along with
|
|
it that has been often repeated and paraphrased. It goes something like this:
|
|
In the great temple at Benares there are 3 golden spikes. On one of them,
|
|
God placed 64 disks increasing in size from bottom to top, at the beginning
|
|
of time. Since then, and to this day, the priest on duty constantly transfers
|
|
disks, one at a time, in such a way that no larger disk is ever put on top
|
|
of a smaller one. When the disks have been transferred entirely to another
|
|
spike the Universe will come to an end in a large thunderclap.
|
|
|
|
This paraphrases the original legend due to DeParville, La Nature, Paris 1884,
|
|
Part I, 285-286. For this and further information see: Mathematical
|
|
Recreations & Essays, W.W. Rouse Ball, MacMillan, NewYork, 11th Ed. 1967,
|
|
303-305.
|
|
*
|
|
*
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
#define TRUE 1
|
|
#define FALSE 0
|
|
|
|
/* This is the number of "disks" on tower A initially. Taken to be 64 in the
|
|
* legend. The number of moves required, in general, is 2^N - 1. For N = 64,
|
|
* this is 18,446,744,073,709,551,615 */
|
|
#define N 4
|
|
|
|
/* These are the three towers. For example if the state of A is 0,1,3,4, that
|
|
* means that there are three discs on A of sizes 1, 3, and 4. (Think of right
|
|
* as being the "down" direction.) */
|
|
int A[N], B[N], C[N];
|
|
|
|
void Hanoi(int,int*,int*,int*);
|
|
|
|
/* Print the current configuration of A, B, and C to the screen */
|
|
void PrintAll()
|
|
{
|
|
int i;
|
|
|
|
printf("A: ");
|
|
for(i=0;i<N;i++)printf(" %d ",A[i]);
|
|
printf("\n");
|
|
|
|
printf("B: ");
|
|
for(i=0;i<N;i++)printf(" %d ",B[i]);
|
|
printf("\n");
|
|
|
|
printf("C: ");
|
|
for(i=0;i<N;i++)printf(" %d ",C[i]);
|
|
printf("\n");
|
|
printf("------------------------------------------\n");
|
|
return;
|
|
}
|
|
|
|
/* Move the leftmost nonzero element of source to dest, leave behind 0. */
|
|
/* Returns the value moved (not used.) */
|
|
int Move(int *source, int *dest)
|
|
{
|
|
int i = 0, j = 0;
|
|
|
|
while (i<N && (source[i])==0) i++;
|
|
while (j<N && (dest[j])==0) j++;
|
|
|
|
dest[j-1] = source[i];
|
|
source[i] = 0;
|
|
PrintAll(); /* Print configuration after each move. */
|
|
return dest[j-1];
|
|
}
|
|
|
|
|
|
/* Moves first n nonzero numbers from source to dest using the rules of Hanoi.
|
|
Calls itself recursively.
|
|
*/
|
|
void Hanoi(int n,int *source, int *dest, int *spare)
|
|
{
|
|
int i;
|
|
if(n==1){
|
|
Move(source,dest);
|
|
return;
|
|
}
|
|
|
|
Hanoi(n-1,source,spare,dest);
|
|
Move(source,dest);
|
|
Hanoi(n-1,spare,dest,source);
|
|
return;
|
|
}
|
|
|
|
int main()
|
|
{
|
|
int i;
|
|
|
|
/* initialize the towers */
|
|
for(i=0;i<N;i++)A[i]=i+1;
|
|
for(i=0;i<N;i++)B[i]=0;
|
|
for(i=0;i<N;i++)C[i]=0;
|
|
|
|
printf("Solution of Tower of Hanoi Problem with %d Disks\n\n",N);
|
|
|
|
/* Print the starting state */
|
|
printf("Starting state:\n");
|
|
PrintAll();
|
|
printf("\n\nSubsequent states:\n\n");
|
|
|
|
/* Do it! Use A = Source, B = Destination, C = Spare */
|
|
Hanoi(N,A,B,C);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/
|