#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */
typedef char *buf;

/* Variables and functions */
int /*<<< orphan*/ *fgets(char *, int, int /*<<< orphan*/);
int /*<<< orphan*/ printf(char *, ...);
int /*<<< orphan*/ stdin;
int main(void) {
  char buf[2];
  char values[4];
  char current = 0;
  char total = 0;
  while (NULL != fgets(buf, sizeof(buf), stdin)) {
    if (*(buf) == 10) {
      continue;
    }
    if (*(buf) == '\0') {
      break;
    }
    if (current < 4) {
      *(values + current) = *(buf) - '0';
      total += *(values + current);
    } else {
      total -= *(values + (current % 4));
      *(values + (current % 4)) = *(buf) - '0';
      total += *(values + (current % 4));
    }
    current++;
  }
  if (current < 4) {
    printf("invalid input\n");
  } else {
    printf("%lf\n", total / (double)4);
  }
  printf("%d %d\n", current, total);
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
movl   $0x0,-0x4(%rbp)
movb   $0x0,-0xb(%rbp)
movb   $0x0,-0xc(%rbp)
lea    -0x6(%rbp),%rdi
mov    0x2ea6(%rip),%rax
mov    (%rax),%edx
mov    $0x2,%esi
call   1040 <fgets@plt>
mov    %rax,%rcx
xor    %eax,%eax
cmp    %rcx,%rax
je     121c <main+0xfc>
movsbl -0x6(%rbp),%eax
cmp    $0xa,%eax
jne    116e <main+0x4e>
jmp    1137 <main+0x17>
movsbl -0x6(%rbp),%eax
cmp    $0x0,%eax
jne    1180 <main+0x60>
jmp    121c <main+0xfc>
movsbl -0xb(%rbp),%eax
cmp    $0x4,%eax
jge    11b9 <main+0x99>
movsbl -0x6(%rbp),%eax
sub    $0x30,%eax
mov    %al,%cl
movsbl -0xb(%rbp),%eax
cltq
mov    %cl,-0xa(%rbp,%rax,1)
movsbl -0xb(%rbp),%eax
cltq
movsbl -0xa(%rbp,%rax,1),%ecx
movsbl -0xc(%rbp),%eax
add    %ecx,%eax
mov    %al,-0xc(%rbp)
jmp    120f <main+0xef>
movsbl -0xb(%rbp),%eax
mov    $0x4,%ecx
cltd
idiv   %ecx
movslq %edx,%rax
movsbl -0xa(%rbp,%rax,1),%ecx
movsbl -0xc(%rbp),%eax
sub    %ecx,%eax
mov    %al,-0xc(%rbp)
movsbl -0x6(%rbp),%eax
sub    $0x30,%eax
mov    %al,%cl
movsbl -0xb(%rbp),%eax
mov    $0x4,%esi
cltd
idiv   %esi
movslq %edx,%rax
mov    %cl,-0xa(%rbp,%rax,1)
movsbl -0xb(%rbp),%eax
mov    $0x4,%ecx
cltd
idiv   %ecx
movslq %edx,%rax
movsbl -0xa(%rbp,%rax,1),%ecx
movsbl -0xc(%rbp),%eax
add    %ecx,%eax
mov    %al,-0xc(%rbp)
mov    -0xb(%rbp),%al
add    $0x1,%al
mov    %al,-0xb(%rbp)
jmp    1137 <main+0x17>
movsbl -0xb(%rbp),%eax
cmp    $0x4,%eax
jge    123c <main+0x11c>
lea    0xdd8(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
jmp    125e <main+0x13e>
movsbl -0xc(%rbp),%eax
cvtsi2sd %eax,%xmm0
movsd  0xdb4(%rip),%xmm1
divsd  %xmm1,%xmm0
lea    0xdc0(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
movsbl -0xb(%rbp),%esi
movsbl -0xc(%rbp),%edx
lea    0xdaf(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
xor    %eax,%eax
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %rbp
push   %r15
push   %r14
push   %rbx
push   %rax
xor    %r14d,%r14d
mov    0x2ea7(%rip),%rbp
lea    0x2(%rsp),%rbx
xor    %r15d,%r15d
nopl   0x0(%rax)
mov    0x0(%rbp),%edx
mov    %rbx,%rdi
mov    $0x2,%esi
call   1050 <fgets@plt>
test   %rax,%rax
je     11a6 <main+0x76>
movzbl 0x2(%rsp),%eax
cmp    $0xa,%al
je     1150 <main+0x20>
test   %al,%al
je     11a6 <main+0x76>
cmp    $0x3,%r14b
jg     118b <main+0x5b>
add    $0xd0,%al
movsbq %r14b,%rcx
mov    %al,0x4(%rsp,%rcx,1)
add    %al,%r15b
add    $0x1,%r14b
jmp    1150 <main+0x20>
movzbl %r14b,%ecx
and    $0x3,%ecx
add    $0xd0,%al
add    %al,%r15b
sub    0x4(%rsp,%rcx,1),%r15b
mov    %al,0x4(%rsp,%rcx,1)
add    $0x1,%r14b
jmp    1150 <main+0x20>
movsbl %r15b,%ebx
cmp    $0x3,%r14b
jg     11be <main+0x8e>
lea    0xe5d(%rip),%rdi
call   1030 <puts@plt>
jmp    11d8 <main+0xa8>
cvtsi2sd %ebx,%xmm0
mulsd  0xe36(%rip),%xmm0
lea    0xe37(%rip),%rdi
mov    $0x1,%al
call   1040 <printf@plt>
movsbl %r14b,%esi
lea    0xe2a(%rip),%rdi
mov    %ebx,%edx
xor    %eax,%eax
call   1040 <printf@plt>
xor    %eax,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
@stdin = global i32 0
@.str = [15 x i8] c"invalid input\0A\00"
@.str.1 = [5 x i8] c"%lf\0A\00"
@.str.2 = [7 x i8] c"%d %d\0A\00"
define i32 @main() {
%1 = alloca i32
%2 = alloca [2 x i8]
%3 = alloca [4 x i8]
%4 = alloca i8
%5 = alloca i8
store i32 0, i32* %1
store i8 0, i8* %4
store i8 0, i8* %5
br label %6
6: ; preds = %85, %16, %0
%7 = getelementptr inbounds [2 x i8], [2 x i8]* %2, i64 0, i64 0
%8 = load i32, i32* @stdin
%9 = call i32* @fgets(i8* %7, i32 2, i32 %8)
%10 = icmp ne i32* null, %9
br i1 %10, label %11, label %88
11: ; preds = %6
%12 = getelementptr inbounds [2 x i8], [2 x i8]* %2, i64 0, i64 0
%13 = load i8, i8* %12
%14 = sext i8 %13 to i32
%15 = icmp eq i32 %14, 10
br i1 %15, label %16, label %17
16: ; preds = %11
br label %6
17: ; preds = %11
%18 = getelementptr inbounds [2 x i8], [2 x i8]* %2, i64 0, i64 0
%19 = load i8, i8* %18
%20 = sext i8 %19 to i32
%21 = icmp eq i32 %20, 0
br i1 %21, label %22, label %23
22: ; preds = %17
br label %88
23: ; preds = %17
%24 = load i8, i8* %4
%25 = sext i8 %24 to i32
%26 = icmp slt i32 %25, 4
br i1 %26, label %27, label %49
27: ; preds = %23
%28 = getelementptr inbounds [2 x i8], [2 x i8]* %2, i64 0, i64 0
%29 = load i8, i8* %28
%30 = sext i8 %29 to i32
%31 = sub nsw i32 %30, 48
%32 = trunc i32 %31 to i8
%33 = getelementptr inbounds [4 x i8], [4 x i8]* %3, i64 0, i64 0
%34 = load i8, i8* %4
%35 = sext i8 %34 to i32
%36 = sext i32 %35 to i64
%37 = getelementptr inbounds i8, i8* %33, i64 %36
store i8 %32, i8* %37
%38 = getelementptr inbounds [4 x i8], [4 x i8]* %3, i64 0, i64 0
%39 = load i8, i8* %4
%40 = sext i8 %39 to i32
%41 = sext i32 %40 to i64
%42 = getelementptr inbounds i8, i8* %38, i64 %41
%43 = load i8, i8* %42
%44 = sext i8 %43 to i32
%45 = load i8, i8* %5
%46 = sext i8 %45 to i32
%47 = add nsw i32 %46, %44
%48 = trunc i32 %47 to i8
store i8 %48, i8* %5
br label %85
49: ; preds = %23
%50 = getelementptr inbounds [4 x i8], [4 x i8]* %3, i64 0, i64 0
%51 = load i8, i8* %4
%52 = sext i8 %51 to i32
%53 = srem i32 %52, 4
%54 = sext i32 %53 to i64
%55 = getelementptr inbounds i8, i8* %50, i64 %54
%56 = load i8, i8* %55
%57 = sext i8 %56 to i32
%58 = load i8, i8* %5
%59 = sext i8 %58 to i32
%60 = sub nsw i32 %59, %57
%61 = trunc i32 %60 to i8
store i8 %61, i8* %5
%62 = getelementptr inbounds [2 x i8], [2 x i8]* %2, i64 0, i64 0
%63 = load i8, i8* %62
%64 = sext i8 %63 to i32
%65 = sub nsw i32 %64, 48
%66 = trunc i32 %65 to i8
%67 = getelementptr inbounds [4 x i8], [4 x i8]* %3, i64 0, i64 0
%68 = load i8, i8* %4
%69 = sext i8 %68 to i32
%70 = srem i32 %69, 4
%71 = sext i32 %70 to i64
%72 = getelementptr inbounds i8, i8* %67, i64 %71
store i8 %66, i8* %72
%73 = getelementptr inbounds [4 x i8], [4 x i8]* %3, i64 0, i64 0
%74 = load i8, i8* %4
%75 = sext i8 %74 to i32
%76 = srem i32 %75, 4
%77 = sext i32 %76 to i64
%78 = getelementptr inbounds i8, i8* %73, i64 %77
%79 = load i8, i8* %78
%80 = sext i8 %79 to i32
%81 = load i8, i8* %5
%82 = sext i8 %81 to i32
%83 = add nsw i32 %82, %80
%84 = trunc i32 %83 to i8
store i8 %84, i8* %5
br label %85
85: ; preds = %49, %27
%86 = load i8, i8* %4
%87 = add i8 %86, 1
store i8 %87, i8* %4
br label %6
88: ; preds = %22, %6
%89 = load i8, i8* %4
%90 = sext i8 %89 to i32
%91 = icmp slt i32 %90, 4
br i1 %91, label %92, label %94
92: ; preds = %88
%93 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str, i64 0, i64 0))
br label %100
94: ; preds = %88
%95 = load i8, i8* %5
%96 = sext i8 %95 to i32
%97 = sitofp i32 %96 to double
%98 = fdiv double %97, 4.000000e+00
%99 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.1, i64 0, i64 0), double %98)
br label %100
100: ; preds = %94, %92
%101 = load i8, i8* %4
%102 = sext i8 %101 to i32
%103 = load i8, i8* %5
%104 = sext i8 %103 to i32
%105 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.2, i64 0, i64 0), i32 %102, i32 %104)
ret i32 0
}

LLVM IR (-O2):
@stdin = global i32 0
@.str.1 = [5 x i8] c"%lf\0A\00"
@.str.2 = [7 x i8] c"%d %d\0A\00"
@str = [14 x i8] c"invalid input\00"
define i32 @main() {
%1 = alloca [2 x i8]
%2 = alloca [4 x i8]
%3 = getelementptr inbounds [2 x i8], [2 x i8]* %1, i64 0, i64 0
%4 = getelementptr inbounds [4 x i8], [4 x i8]* %2, i64 0, i64 0
br label %5
5: ; preds = %29, %0
%6 = phi i8 [ %31, %29 ], [ 0, %0 ]
%7 = phi i8 [ %30, %29 ], [ 0, %0 ]
br label %8
8: ; preds = %5, %12
%9 = load i32, i32* @stdin
%10 = call i32* @fgets(i8* %3, i32 2, i32 %9)
%11 = icmp eq i32* %10, null
br i1 %11, label %32, label %12
12: ; preds = %8
%13 = load i8, i8* %3
switch i8 %13, label %14 [
i8 10, label %8
i8 0, label %32
]
14: ; preds = %12
%15 = icmp slt i8 %6, 4
br i1 %15, label %16, label %21
16: ; preds = %14
%17 = add i8 %13, -48
%18 = sext i8 %6 to i64
%19 = getelementptr inbounds [4 x i8], [4 x i8]* %2, i64 0, i64 %18
store i8 %17, i8* %19
%20 = add i8 %17, %7
br label %29
21: ; preds = %14
%22 = and i8 %6, 3
%23 = zext i8 %22 to i64
%24 = getelementptr inbounds [4 x i8], [4 x i8]* %2, i64 0, i64 %23
%25 = load i8, i8* %24
%26 = add i8 %13, -48
store i8 %26, i8* %24
%27 = add i8 %26, %7
%28 = sub i8 %27, %25
br label %29
29: ; preds = %21, %16
%30 = phi i8 [ %20, %16 ], [ %28, %21 ]
%31 = add i8 %6, 1
br label %5
32: ; preds = %12, %8
%33 = icmp slt i8 %6, 4
br i1 %33, label %34, label %36
34: ; preds = %32
%35 = call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([14 x i8], [14 x i8]* @str, i64 0, i64 0))
br label %40
36: ; preds = %32
%37 = sitofp i8 %7 to double
%38 = fmul double %37, 2.500000e-01
%39 = call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([5 x i8], [5 x i8]* @.str.1, i64 0, i64 0), double %38)
br label %40
40: ; preds = %36, %34
%41 = sext i8 %6 to i32
%42 = sext i8 %7 to i32
%43 = call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([7 x i8], [7 x i8]* @.str.2, i64 0, i64 0), i32 %41, i32 %42)
ret i32 0
}