diff --git a/main.cpp b/main.cpp
index 938fdd2..066a6ff 100644
--- a/main.cpp
+++ b/main.cpp
@@ -1,122 +1,77 @@
 #include <iostream>
 #include <vector>
+#include <limits>
 
 using namespace std;
 
-int main()
-{
+struct Input {
+    vector<double> numbers;
+    size_t bin_count{};
+};
+
+Input input_data() {
     size_t number_count;
-    cerr << "Enter number count: ";
     cin >> number_count;
 
-    vector<double> numbers(number_count);
-    cerr << "Enter numbers: ";
-    for(size_t i = 0; i < number_count; i ++)
-    {
-        cin >> numbers[i];
+    Input in;
+    in.numbers.resize(number_count);
+
+    for (size_t i = 0; i < number_count; i++) {
+        cin >> in.numbers[i];
     }
 
-    size_t bin_count;
-    cerr << "Enter bin count: ";
-    cin >> bin_count;
+    cin >> in.bin_count;
+
+    return in;
+}
+
+void find_minmax(const vector<double>& numbers, double& min, double& max) {
+    if (numbers.empty()) return;
 
+    min = max = numbers[0];
 
-    double min = numbers[0];
-    double max = numbers[0];
-    for(double number : numbers)
-    {
-        if(number < min)
-        {
+    for (const double& number : numbers) {
+        if (number < min) {
             min = number;
         }
-        if(number > max)
-        {
+        if (number > max) {
             max = number;
         }
     }
+}
 
-    for(size_t i=0; i<bin_count;i++)
-    {
-        for(size_t j = i+1; j < bin_count; j++)
-        {
-            if (numbers[i]==numbers[j])
-            {
-                numbers.erase(numbers.begin()+i);
-                --j;
-            }
-        }
-
-
-    }
-    for(int x:numbers)
-    {
-        cout << x << " ";
-
-    }
-    cout << "\n";
+vector<size_t> make_histogram(const vector<double>& numbers, size_t bin_count) {
+    double min, max;
+    find_minmax(numbers, min, max);
 
     vector<size_t> bins(bin_count, 0);
-    double bin_size = (max - min) / bin_count;
-    for(size_t i = 0; i < numbers.size(); i++)
-    {
-        bool found = false;
-        for(size_t j = 0; (j < (bin_count - 1)) && !found; j++)
-        {
-            auto lo = min + j * bin_size;
-            auto hi = min + (j + 1) * bin_size;
-            if((lo <= numbers[i]) && (numbers[i] < hi))
-            {
-                bins[j]++;
-                found = true;
+    double bin_width = (max - min) / bin_count;
+
+    for (const double& number : numbers) {
+        if (number == max) {
+            bins[bin_count - 1]++;
+        } else {
+            size_t bin_index = static_cast<size_t>((number - min) / bin_width);
+            if (bin_index >= bin_count) {
+                bin_index = bin_count - 1;
             }
-        }
-        if (!found)
-        {
-            bins[bin_count-1]++;
+            bins[bin_index]++;
         }
     }
 
+    return bins;
+}
 
-    const size_t SCREEN_WIDTH = 80;
-    const size_t MAX_ASTERISK = SCREEN_WIDTH - 3 - 1;
-
-    size_t max_bin = bins[0];
-    for(size_t i = 0; i < bin_count; i++)
-    {
-        if(bins[i] > max_bin)
-        {
-            max_bin = bins[i];
-        }
-    }
-
-
-    for (size_t bin: bins)
-    {
-        size_t height = bin;
-
-        if (max_bin > MAX_ASTERISK)
-        {
-          height = MAX_ASTERISK * (static_cast<double>(bin) / max_bin);
-        }
-
-        if (bin < 100)
-        {
-            cout << ' ';
-        }
-        if (bin < 10)
-        {
-            cout << ' ';
-        }
-        cout << bin << "|";
-        for(size_t i = 0; i < height; i++)
-        {
-            cout << "*";
-        }
-        cout << endl;
+void show_histogram_text(const vector<size_t>& bins) {
+    for (size_t i = 0; i < bins.size(); i++) {
+        cout << "Bin " << i << ": " << bins[i] << endl;
     }
-    size_t razmer = 4;
-
-
+}
 
+int main() {
+    auto in = input_data();
+    auto bins = make_histogram(in.numbers, in.bin_count);
+    show_histogram_text(bins);
 
+    return 0;
 }