int hardness(char *str, int fromInclu, int toExclu) {
  int ret = 10;
  int i = fromInclu;
  int allSame = 1;
  for (; i < toExclu; i++) {
    if (str[fromInclu] != str[i]) {
      allSame = 0;
      break;
    }
  }
  if (allSame) {
    return 1;
  }
  int len = toExclu - fromInclu;
  if (str[fromInclu + 2] == str[fromInclu]) {
    ret = len == 3 || (len == 4 && str[fromInclu + 1] == str[fromInclu + 3]) ||
                  (len == 5 && (str[fromInclu + 1] == str[fromInclu + 3] &&
                                str[fromInclu] == str[fromInclu + 4]))
              ? 4
              : 10;
  } else {
    int sub = str[fromInclu] - str[fromInclu + 1];
    for (i = fromInclu + 2; i < toExclu; i++) {
      if (str[i - 1] - str[i] != sub) {
        return 10;
      }
    }
    ret = sub == 1 || sub == -1 ? 2 : 5;
  }
  return ret;
}


x86 assembly (clang, -O0):
<hardness>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %edx,-0x18(%rbp)
movl   $0xa,-0x1c(%rbp)
mov    -0x14(%rbp),%eax
mov    %eax,-0x20(%rbp)
movl   $0x1,-0x24(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    116d <hardness+0x6d>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    -0x10(%rbp),%rcx
movslq -0x20(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
cmp    %ecx,%eax
je     115a <hardness+0x5a>
movl   $0x0,-0x24(%rbp)
jmp    116d <hardness+0x6d>
jmp    115f <hardness+0x5f>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1122 <hardness+0x22>
cmpl   $0x0,-0x24(%rbp)
je     1183 <hardness+0x83>
movl   $0x1,-0x4(%rbp)
jmp    1336 <hardness+0x236>
mov    -0x18(%rbp),%eax
sub    -0x14(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
mov    -0x10(%rbp),%rcx
movslq -0x14(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
cmp    %ecx,%eax
jne    1283 <hardness+0x183>
mov    $0x1,%al
cmpl   $0x3,-0x28(%rbp)
mov    %al,-0x2d(%rbp)
je     1268 <hardness+0x168>
cmpl   $0x4,-0x28(%rbp)
jne    11f9 <hardness+0xf9>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%ecx
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%edx
add    $0x3,%edx
movslq %edx,%rdx
movsbl (%rax,%rdx,1),%edx
mov    $0x1,%al
cmp    %edx,%ecx
mov    %al,-0x2d(%rbp)
je     1268 <hardness+0x168>
xor    %eax,%eax
cmpl   $0x5,-0x28(%rbp)
mov    %al,-0x2e(%rbp)
jne    1262 <hardness+0x162>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%ecx
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%edx
add    $0x3,%edx
movslq %edx,%rdx
movsbl (%rax,%rdx,1),%edx
xor    %eax,%eax
cmp    %edx,%ecx
mov    %al,-0x2f(%rbp)
jne    125c <hardness+0x15c>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    -0x10(%rbp),%rcx
mov    -0x14(%rbp),%edx
add    $0x4,%edx
movslq %edx,%rdx
movsbl (%rcx,%rdx,1),%ecx
cmp    %ecx,%eax
sete   %al
mov    %al,-0x2f(%rbp)
mov    -0x2f(%rbp),%al
mov    %al,-0x2e(%rbp)
mov    -0x2e(%rbp),%al
mov    %al,-0x2d(%rbp)
mov    -0x2d(%rbp),%dl
mov    $0xa,%eax
mov    $0x4,%ecx
test   $0x1,%dl
cmovne %ecx,%eax
mov    %eax,-0x1c(%rbp)
jmp    1330 <hardness+0x230>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    -0x10(%rbp),%rcx
mov    -0x14(%rbp),%edx
add    $0x1,%edx
movslq %edx,%rdx
movsbl (%rcx,%rdx,1),%ecx
sub    %ecx,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x14(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    1301 <hardness+0x201>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
mov    -0x10(%rbp),%rcx
movslq -0x20(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
sub    %ecx,%eax
cmp    -0x2c(%rbp),%eax
je     12ee <hardness+0x1ee>
movl   $0xa,-0x4(%rbp)
jmp    1336 <hardness+0x236>
jmp    12f3 <hardness+0x1f3>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    12ae <hardness+0x1ae>
mov    $0x1,%al
cmpl   $0x1,-0x2c(%rbp)
mov    %al,-0x30(%rbp)
je     131a <hardness+0x21a>
cmpl   $0xffffffff,-0x2c(%rbp)
sete   %al
mov    %al,-0x30(%rbp)
mov    -0x30(%rbp),%dl
mov    $0x5,%eax
mov    $0x2,%ecx
test   $0x1,%dl
cmovne %ecx,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<hardness>:
mov    $0x1,%eax
mov    %edx,%r10d
sub    %esi,%r10d
jle    11f4 <hardness+0xf4>
movslq %esi,%r8
lea    (%rdi,%r8,1),%r11
movsbl (%rdi,%r8,1),%r9d
mov    $0x1,%ecx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
cmp    %ecx,%r10d
je     11f4 <hardness+0xf4>
lea    0x1(%rcx),%rsi
cmp    (%r11,%rcx,1),%r9b
mov    %rsi,%rcx
je     1130 <hardness+0x30>
movsbl 0x2(%rdi,%r8,1),%eax
cmp    %r9b,%al
jne    1182 <hardness+0x82>
mov    $0x4,%eax
cmp    $0x3,%r10d
je     11f4 <hardness+0xf4>
cmp    $0x5,%r10d
je     11f5 <hardness+0xf5>
cmp    $0x4,%r10d
jne    117c <hardness+0x7c>
mov    0x1(%r8,%rdi,1),%cl
cmp    0x3(%r8,%rdi,1),%cl
je     11f4 <hardness+0xf4>
mov    $0xa,%eax
ret
movsbl 0x1(%r8,%rdi,1),%ecx
add    $0x2,%r8
sub    %ecx,%r9d
cmp    %edx,%r8d
jge    11db <hardness+0xdb>
movsbl -0x1(%r8,%rdi,1),%ecx
sub    %eax,%ecx
mov    $0xa,%eax
cmp    %r9d,%ecx
jne    11f4 <hardness+0xf4>
lea    (%r8,%rdi,1),%rdx
add    $0x1,%rdx
add    $0xfffffffd,%r10d
xor    %edi,%edi
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
cmp    %edi,%r10d
je     11db <hardness+0xdb>
movsbl (%rdx,%rdi,1),%ecx
movsbl -0x1(%rdx,%rdi,1),%esi
sub    %ecx,%esi
add    $0x1,%rdi
cmp    %r9d,%esi
je     11c0 <hardness+0xc0>
jmp    11f4 <hardness+0xf4>
xor    %eax,%eax
cmp    $0xffffffff,%r9d
setne  %al
cmp    $0x1,%r9d
lea    0x2(%rax,%rax,2),%ecx
mov    $0x2,%eax
cmovne %ecx,%eax
ret
mov    0x1(%r8,%rdi,1),%cl
mov    $0xa,%eax
cmp    0x3(%r8,%rdi,1),%cl
jne    11f4 <hardness+0xf4>
cmp    0x4(%r8,%rdi,1),%r9b
mov    $0x4,%ecx
mov    $0xa,%eax
cmove  %ecx,%eax
ret

LLVM IR (-O0):
define i32 @hardness(i8* %0, i32 %1, i32 %2) {
%4 = alloca i32
%5 = alloca i8*
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
store i8* %0, i8** %5
store i32 %1, i32* %6
store i32 %2, i32* %7
store i32 10, i32* %8
%13 = load i32, i32* %6
store i32 %13, i32* %9
store i32 1, i32* %10
br label %14
14: ; preds = %34, %3
%15 = load i32, i32* %9
%16 = load i32, i32* %7
%17 = icmp slt i32 %15, %16
br i1 %17, label %18, label %37
18: ; preds = %14
%19 = load i8*, i8** %5
%20 = load i32, i32* %6
%21 = sext i32 %20 to i64
%22 = getelementptr inbounds i8, i8* %19, i64 %21
%23 = load i8, i8* %22
%24 = sext i8 %23 to i32
%25 = load i8*, i8** %5
%26 = load i32, i32* %9
%27 = sext i32 %26 to i64
%28 = getelementptr inbounds i8, i8* %25, i64 %27
%29 = load i8, i8* %28
%30 = sext i8 %29 to i32
%31 = icmp ne i32 %24, %30
br i1 %31, label %32, label %33
32: ; preds = %18
store i32 0, i32* %10
br label %37
33: ; preds = %18
br label %34
34: ; preds = %33
%35 = load i32, i32* %9
%36 = add nsw i32 %35, 1
store i32 %36, i32* %9
br label %14
37: ; preds = %32, %14
%38 = load i32, i32* %10
%39 = icmp ne i32 %38, 0
br i1 %39, label %40, label %41
40: ; preds = %37
store i32 1, i32* %4
br label %178
41: ; preds = %37
%42 = load i32, i32* %7
%43 = load i32, i32* %6
%44 = sub nsw i32 %42, %43
store i32 %44, i32* %11
%45 = load i8*, i8** %5
%46 = load i32, i32* %6
%47 = add nsw i32 %46, 2
%48 = sext i32 %47 to i64
%49 = getelementptr inbounds i8, i8* %45, i64 %48
%50 = load i8, i8* %49
%51 = sext i8 %50 to i32
%52 = load i8*, i8** %5
%53 = load i32, i32* %6
%54 = sext i32 %53 to i64
%55 = getelementptr inbounds i8, i8* %52, i64 %54
%56 = load i8, i8* %55
%57 = sext i8 %56 to i32
%58 = icmp eq i32 %51, %57
br i1 %58, label %59, label %123
59: ; preds = %41
%60 = load i32, i32* %11
%61 = icmp eq i32 %60, 3
br i1 %61, label %119, label %62
62: ; preds = %59
%63 = load i32, i32* %11
%64 = icmp eq i32 %63, 4
br i1 %64, label %65, label %81
65: ; preds = %62
%66 = load i8*, i8** %5
%67 = load i32, i32* %6
%68 = add nsw i32 %67, 1
%69 = sext i32 %68 to i64
%70 = getelementptr inbounds i8, i8* %66, i64 %69
%71 = load i8, i8* %70
%72 = sext i8 %71 to i32
%73 = load i8*, i8** %5
%74 = load i32, i32* %6
%75 = add nsw i32 %74, 3
%76 = sext i32 %75 to i64
%77 = getelementptr inbounds i8, i8* %73, i64 %76
%78 = load i8, i8* %77
%79 = sext i8 %78 to i32
%80 = icmp eq i32 %72, %79
br i1 %80, label %119, label %81
81: ; preds = %65, %62
%82 = load i32, i32* %11
%83 = icmp eq i32 %82, 5
br i1 %83, label %84, label %117
84: ; preds = %81
%85 = load i8*, i8** %5
%86 = load i32, i32* %6
%87 = add nsw i32 %86, 1
%88 = sext i32 %87 to i64
%89 = getelementptr inbounds i8, i8* %85, i64 %88
%90 = load i8, i8* %89
%91 = sext i8 %90 to i32
%92 = load i8*, i8** %5
%93 = load i32, i32* %6
%94 = add nsw i32 %93, 3
%95 = sext i32 %94 to i64
%96 = getelementptr inbounds i8, i8* %92, i64 %95
%97 = load i8, i8* %96
%98 = sext i8 %97 to i32
%99 = icmp eq i32 %91, %98
br i1 %99, label %100, label %115
100: ; preds = %84
%101 = load i8*, i8** %5
%102 = load i32, i32* %6
%103 = sext i32 %102 to i64
%104 = getelementptr inbounds i8, i8* %101, i64 %103
%105 = load i8, i8* %104
%106 = sext i8 %105 to i32
%107 = load i8*, i8** %5
%108 = load i32, i32* %6
%109 = add nsw i32 %108, 4
%110 = sext i32 %109 to i64
%111 = getelementptr inbounds i8, i8* %107, i64 %110
%112 = load i8, i8* %111
%113 = sext i8 %112 to i32
%114 = icmp eq i32 %106, %113
br label %115
115: ; preds = %100, %84
%116 = phi i1 [ false, %84 ], [ %114, %100 ]
br label %117
117: ; preds = %115, %81
%118 = phi i1 [ false, %81 ], [ %116, %115 ]
br label %119
119: ; preds = %117, %65, %59
%120 = phi i1 [ true, %65 ], [ true, %59 ], [ %118, %117 ]
%121 = zext i1 %120 to i64
%122 = select i1 %120, i32 4, i32 10
store i32 %122, i32* %8
br label %176
123: ; preds = %41
%124 = load i8*, i8** %5
%125 = load i32, i32* %6
%126 = sext i32 %125 to i64
%127 = getelementptr inbounds i8, i8* %124, i64 %126
%128 = load i8, i8* %127
%129 = sext i8 %128 to i32
%130 = load i8*, i8** %5
%131 = load i32, i32* %6
%132 = add nsw i32 %131, 1
%133 = sext i32 %132 to i64
%134 = getelementptr inbounds i8, i8* %130, i64 %133
%135 = load i8, i8* %134
%136 = sext i8 %135 to i32
%137 = sub nsw i32 %129, %136
store i32 %137, i32* %12
%138 = load i32, i32* %6
%139 = add nsw i32 %138, 2
store i32 %139, i32* %9
br label %140
140: ; preds = %163, %123
%141 = load i32, i32* %9
%142 = load i32, i32* %7
%143 = icmp slt i32 %141, %142
br i1 %143, label %144, label %166
144: ; preds = %140
%145 = load i8*, i8** %5
%146 = load i32, i32* %9
%147 = sub nsw i32 %146, 1
%148 = sext i32 %147 to i64
%149 = getelementptr inbounds i8, i8* %145, i64 %148
%150 = load i8, i8* %149
%151 = sext i8 %150 to i32
%152 = load i8*, i8** %5
%153 = load i32, i32* %9
%154 = sext i32 %153 to i64
%155 = getelementptr inbounds i8, i8* %152, i64 %154
%156 = load i8, i8* %155
%157 = sext i8 %156 to i32
%158 = sub nsw i32 %151, %157
%159 = load i32, i32* %12
%160 = icmp ne i32 %158, %159
br i1 %160, label %161, label %162
161: ; preds = %144
store i32 10, i32* %4
br label %178
162: ; preds = %144
br label %163
163: ; preds = %162
%164 = load i32, i32* %9
%165 = add nsw i32 %164, 1
store i32 %165, i32* %9
br label %140
166: ; preds = %140
%167 = load i32, i32* %12
%168 = icmp eq i32 %167, 1
br i1 %168, label %172, label %169
169: ; preds = %166
%170 = load i32, i32* %12
%171 = icmp eq i32 %170, -1
br label %172
172: ; preds = %169, %166
%173 = phi i1 [ true, %166 ], [ %171, %169 ]
%174 = zext i1 %173 to i64
%175 = select i1 %173, i32 2, i32 5
store i32 %175, i32* %8
br label %176
176: ; preds = %172, %119
%177 = load i32, i32* %8
store i32 %177, i32* %4
br label %178
178: ; preds = %176, %161, %40
%179 = load i32, i32* %4
ret i32 %179
}

LLVM IR (-O2):
define i32 @hardness(i8* nocapture %0, i32 %1, i32 %2) {
%4 = icmp sgt i32 %2, %1
br i1 %4, label %5, label %90
5: ; preds = %3
%6 = sext i32 %1 to i64
%7 = getelementptr inbounds i8, i8* %0, i64 %6
%8 = load i8, i8* %7
br label %9
9: ; preds = %5, %14
%10 = phi i64 [ %6, %5 ], [ %11, %14 ]
%11 = add nsw i64 %10, 1
%12 = trunc i64 %11 to i32
%13 = icmp eq i32 %12, %2
br i1 %13, label %90, label %14
14: ; preds = %9
%15 = getelementptr inbounds i8, i8* %0, i64 %11
%16 = load i8, i8* %15
%17 = icmp eq i8 %8, %16
br i1 %17, label %9, label %18
18: ; preds = %14
%19 = add nsw i32 %1, 2
%20 = sext i32 %19 to i64
%21 = getelementptr inbounds i8, i8* %0, i64 %20
%22 = load i8, i8* %21
%23 = icmp eq i8 %22, %8
br i1 %23, label %24, label %54
24: ; preds = %18
%25 = sub nsw i32 %2, %1
switch i32 %25, label %53 [
i32 3, label %90
i32 4, label %26
i32 5, label %36
]
26: ; preds = %24
%27 = add nsw i32 %1, 1
%28 = sext i32 %27 to i64
%29 = getelementptr inbounds i8, i8* %0, i64 %28
%30 = load i8, i8* %29
%31 = add nsw i32 %1, 3
%32 = sext i32 %31 to i64
%33 = getelementptr inbounds i8, i8* %0, i64 %32
%34 = load i8, i8* %33
%35 = icmp eq i8 %30, %34
br i1 %35, label %90, label %53
36: ; preds = %24
%37 = add nsw i32 %1, 1
%38 = sext i32 %37 to i64
%39 = getelementptr inbounds i8, i8* %0, i64 %38
%40 = load i8, i8* %39
%41 = add nsw i32 %1, 3
%42 = sext i32 %41 to i64
%43 = getelementptr inbounds i8, i8* %0, i64 %42
%44 = load i8, i8* %43
%45 = icmp eq i8 %40, %44
br i1 %45, label %46, label %90
46: ; preds = %36
%47 = add nsw i32 %1, 4
%48 = sext i32 %47 to i64
%49 = getelementptr inbounds i8, i8* %0, i64 %48
%50 = load i8, i8* %49
%51 = icmp eq i8 %8, %50
%52 = select i1 %51, i32 4, i32 10
br label %90
53: ; preds = %26, %24
br label %90
54: ; preds = %18
%55 = sext i8 %8 to i32
%56 = add nsw i32 %1, 1
%57 = sext i32 %56 to i64
%58 = getelementptr inbounds i8, i8* %0, i64 %57
%59 = load i8, i8* %58
%60 = sext i8 %59 to i32
%61 = sub nsw i32 %55, %60
%62 = icmp slt i32 %19, %2
br i1 %62, label %63, label %85
63: ; preds = %54
%64 = add nsw i64 %20, -1
%65 = getelementptr inbounds i8, i8* %0, i64 %64
%66 = load i8, i8* %65
%67 = sext i8 %66 to i32
%68 = sext i8 %22 to i32
%69 = sub nsw i32 %67, %68
%70 = icmp eq i32 %69, %61
br i1 %70, label %71, label %90
71: ; preds = %63, %76
%72 = phi i64 [ %73, %76 ], [ %20, %63 ]
%73 = add nsw i64 %72, 1
%74 = trunc i64 %73 to i32
%75 = icmp eq i32 %74, %2
br i1 %75, label %85, label %76
76: ; preds = %71
%77 = getelementptr inbounds i8, i8* %0, i64 %73
%78 = load i8, i8* %77
%79 = getelementptr inbounds i8, i8* %0, i64 %72
%80 = load i8, i8* %79
%81 = sext i8 %80 to i32
%82 = sext i8 %78 to i32
%83 = sub nsw i32 %81, %82
%84 = icmp eq i32 %83, %61
br i1 %84, label %71, label %90
85: ; preds = %71, %54
%86 = icmp eq i32 %61, 1
%87 = icmp eq i32 %61, -1
%88 = or i1 %86, %87
%89 = select i1 %88, i32 2, i32 5
br label %90
90: ; preds = %9, %76, %63, %3, %24, %53, %46, %36, %26, %85
%91 = phi i32 [ %89, %85 ], [ 4, %26 ], [ 4, %24 ], [ 10, %36 ], [ %52, %46 ], [ 10, %53 ], [ 1, %3 ], [ 10, %63 ], [ 10, %76 ], [ 1, %9 ]
ret i32 %91
}