/*
* Problem :: 2659 / 십자카드 문제
*
* Kind :: Simulation
*
* Insight
* - 십자모양 카드에서 (위쪽, 오른쪽, 아래쪽, 왼쪽) 을
* 간단히 (u, r, d, l) 이라고 하자
* + urdl 의 모든 조합
* 즉, 1111 ~ 9999 까지 모든 시계수를 구하고
* 주어진 십자 카드의 시계수가 몇번째로 작은 시계수인지 알아내면된다
*
* - 위처럼 풀 경우 모든 시계수를 구하고
* 중복되는 시계수를 제거한 뒤 한번 정렬해주어야 한다
* + 그러나 위와같은 작업없이 구할 수 있는 좋은 풀이가 있었다
* https://browoo.tistory.com/122
* # 일단 주어진 십자 카드의 시계수를 구한 뒤
* 1111 부터 그 시계수 이하의 시계수들만 찾아
* 몇번째인지 찾는 알고리즘이다
* -> 주어진 십자 카드의 시계수를 cn, 몇번째인지 세는 변수를 rank 라고 하고
* urdl 순서의 네자릿수의 수가 주어졌을 때 시계수를 반환하는 함수를 clockNum 이라 하면
* for (int i=1111; i<=cn; i++) {
* if (clockNum(i)) == i) rank++;
* }
*
* Point
* - 정말 if (clockNum(i) == i) 로
* cn 이하의 시계수를 찾는 알고리즘이 너무 신선하고 우아하다
* + 이래서 PS 를 끊을 수 없다니까 ㅋㅋ
*/
//
// BOJ
// ver.C++
//
// Created by GGlifer
//
// Open Source
#include <iostream>
using namespace std;
#define endl '\n'
// Set up : Global Variables
/* None */
// Set up : Functions Declaration
int clockNum(int n);
int main()
{
// Set up : I/O
ios::sync_with_stdio(false);
cin.tie(nullptr);
// Set up : Input
string s;
for (int i=0; i<4; i++) {
char c; cin >> c;
s += c;
}
// Process
int cn = clockNum(stoi(s)); /* 주어진 십자 카드의 시계수 */
int ans = 0; /* cn 은 전체 시계수에서 ans 번째 */
for (int i=1111; i<=cn; i++) {
/* i 와 clockNum(i) 가 같다면
* 이는 cn 이하의 시계수를 찾은 것을 뜻함 */
if (clockNum(i) == i) ans++;
}
// Control : Output
cout << ans << endl;
}
// Helper Functions
int clockNum(int n)
/* 십자 카드에서 urld 에 해당하는 네자릿수의 수가 주어졌을 때 그 카드의 시계수를 반환 */
{
int ret = n;
for (int i=0; i<3; i++) {
n = n % 1000 * 10 + n / 1000;
ret = min(ret, n);
} return ret;
}