int main(int argc, char **argv) { if(argc > 1) { int i; char line[60], *bests, *opts = 0, bestc, optc = 0, c, *s; uint8_t *val; size_t n; double optv = 0, bestv, v; for(i = 1; i < argc; i++) { FILE *fp = fopen(argv[i], "r"); while(fscanf(fp, "%s", line) != EOF) { n = decode_16(line, &val); c = 0; bestv = 0.0; bestc = 0; bests = 0; while(++c) { s = encode_char(xor_1char(val, n, c),n); v = score_text(s, n); //if(line[0] == '3' && line[1] == 'f' && //line[2] == '1' && line[3] == 'b') //printf("%c :: %s :: %f\n", c, s, v); if(v > bestv) { bestv = v; bestc = c; //free(bests); bests = s; } //else // free(s); } //printf("%s : %s\n", line, bests); if(bestv > optv) { optv = bestv; optc = bestc; // free(opts); opts = bests; } //else // free(bests); } fclose(fp); printf("File '%s' best guess:\n\tPlain-Text:" "%s\n\tKey:%c\n\tScore:%f\n", argv[i], opts, optc, optv); } } }
void Score::render(QPainter &painter) { std::string score_text("The current score is: "); std::stringstream ss; ss << m_score * m_lives->getLives(); score_text.append(ss.str()); QStaticText q_score(score_text.c_str()); painter.setFont(QFont("Helvetica", 16)); painter.drawStaticText(0, 0, q_score); }
int main() { // само окно sf::RenderWindow window(sf::VideoMode(width, height), "_dtts"); // для картинки птицы sf::Image bird_image; bird_image.loadFromFile("images/bird_0.png"); bird_image.createMaskFromColor(sf::Color::White); sf::Texture bird_texture; bird_texture.loadFromImage(bird_image); sf::Sprite bird_sprite(bird_texture); // для картинки мертвой птицы sf::Image dead_bird_image; dead_bird_image.loadFromFile("images/dead_bird.png"); dead_bird_image.createMaskFromColor(sf::Color::White); sf::Texture dead_bird_texture; dead_bird_texture.loadFromImage(dead_bird_image); sf::Sprite dead_bird_sprite(dead_bird_texture); // для картинки горизонтального шипа sf::Image hor_spike_image; hor_spike_image.loadFromFile("images/hor_spike.png"); hor_spike_image.createMaskFromColor(sf::Color::White); sf::Texture hor_spike_texture; hor_spike_texture.loadFromImage(hor_spike_image); sf::Sprite hor_spike_sprite(hor_spike_texture); // для картинки вертикального шипа sf::Image ver_spike_image; ver_spike_image.loadFromFile("images/ver_spike.png"); ver_spike_image.createMaskFromColor(sf::Color::White); sf::Texture ver_spike_texture; ver_spike_texture.loadFromImage(ver_spike_image); sf::Sprite ver_spike_sprite(ver_spike_texture); // для отображения текущего счета sf::Font score_font; score_font.loadFromFile("fonts/a_Alterna.ttf"); sf::Text score_text(sf::String("0"), score_font, 36); score_text.setPosition(100, 100); score_text.setColor(sf::Color::Black); // само поле dtts::Field field(width, height, hor_spike_base, hor_spike_height,ver_spike_base,ver_spike_height, complexity, time_step); // создадим птицу, кружочки и шипы и получим начальное состояние птицы dtts::BirdState bird_state = make_bird_n_other(field); bool bird_to_right = true; // ? птица летит вправо bool is_game = false; // ? игра идет // время, прошедшее после смерти птицы double after_death_counter = 0.0; while (window.isOpen()) { // обработка закрытия окна sf::Event Event; while (window.pollEvent(Event)) { if (Event.type == sf::Event::Closed) { window.close(); } if (Event.type == sf::Event::MouseButtonPressed) { if (Event.mouseButton.button == sf::Mouse::Left) { // если игра не идет if (!is_game) { // игра начинается при нажатии на клавишу is_game = true; } // постольку поскольку нажата мышка, взмах имеет место быть field.bird_swing(0); } } } // если игра идет if (is_game) { // птица летит, и получаем ее новое состояние bird_state = field.bird_fly(0); // если птица мертва, считаем время, прошедшее после сметри if (!bird_state.alive) { after_death_counter += time_step; } // если птица мертва достаточно долго, игра прекращается, // старая птица удаляется, и создается новая птица, аналогичная старой, // также создаются новые шипы if (after_death_counter > 1.0) { // удаляем старые кружочки field.clear_circles(0); is_game = false; after_death_counter = 0; field.erase_bird(0); bird_state = make_bird_n_other(field); } // если живая птица ударилась о стену и поменяла направление if (bird_state.alive && bird_state.right_direction != bird_to_right) { // запоминаем новое направление bird_to_right = bird_state.right_direction; // удаляем все шипы field.clear_hor_spikes(); // добавляем шипы на противоположную стену field.add_random_hor_spikes(bird_to_right); } } // получаем все шипы на поле auto spikes = field.get_hor_spikes(); // получаем все кружочки на поле auto circles = field.get_circles(); // счет меняется только во время игры if (is_game) { score_text.setString(sf::String(std::to_string(bird_state.score))); } // очистка старого изображения window.clear(sf::Color::White); // для отображение кружочка sf::CircleShape circle; circle.setFillColor(sf::Color::White); circle.setOutlineThickness(1.5); circle.setOutlineColor(sf::Color::Green); // отображение кружочков for (const auto &one_bird_circles : circles) { for (const auto &one_circle : one_bird_circles) { circle.setPosition(one_circle.x - one_circle.r, height - (one_circle.y + one_circle.r)); circle.setRadius(one_circle.r); window.draw(circle); } } // прорисовка горизонтальных шипов for (const auto &one_spike : spikes) { hor_spike_sprite.setPosition(one_spike.x - (one_spike.x == 0 ? 0 : hor_spike_height), height - (one_spike.y + hor_spike_base / 2)); hor_spike_sprite.setTextureRect(sf::IntRect(one_spike.x == 0 ? 0 : hor_spike_height, 0, hor_spike_height, hor_spike_base)); window.draw(hor_spike_sprite); } // прорисовка вертикальных шипов for (unsigned n = 0; n != std::round(width / ver_spike_base); ++n) { ver_spike_sprite.setPosition(n * ver_spike_base, 0); ver_spike_sprite.setTextureRect(sf::IntRect(ver_spike_base * 0, 0, ver_spike_base, ver_spike_height)); window.draw(ver_spike_sprite); ver_spike_sprite.setPosition(n * ver_spike_base, height - ver_spike_height); ver_spike_sprite.setTextureRect(sf::IntRect(ver_spike_base * 1, 0, ver_spike_base, ver_spike_height)); window.draw(ver_spike_sprite); } // прорисовка птицы draw_bird(bird_state, (bird_state.alive ? bird_sprite : dead_bird_sprite), window); // отображение счета window.draw(score_text); // отображение нового кадра window.display(); // задержка времени Sleep(time_step*1000.0); } return 0; }
int main() { char* doc = calloc(1, 1); size_t doc_len = 0; char* line = NULL; size_t n = 0; while (getline(&line, &n, stdin) != -1) { size_t line_len = strlen(line); doc = realloc(doc, doc_len + line_len); strncpy(doc + doc_len, line, line_len - 1); doc_len += line_len - 1; doc[doc_len] = '\0'; } size_t num_bytes = num_bytes_from_base64(doc_len); char* as_bytes = calloc(num_bytes + 1, 1); num_bytes = base64_to_bytes(doc, as_bytes, num_bytes); as_bytes[num_bytes] = '\0'; double best_hamming = 1e10; int best_keysize = -1; // Start at 10 because my score gets false positives at 5 and 9. for (int k = 10; k <= 40; ++k) { double hamming = 1.0 * ( hamming_distance_n(as_bytes, as_bytes + k, k) + hamming_distance_n(as_bytes, as_bytes + 2 * k, k) + hamming_distance_n(as_bytes + 3 * k, as_bytes + 4 * k, k) + hamming_distance_n(as_bytes + 3 * k, as_bytes + 5 * k, k)) / k; if (hamming < best_hamming) { best_hamming = hamming; best_keysize = k; } } printf("Best keysize: %d: (score %.4f)\n", best_keysize, best_hamming); size_t col_size = num_bytes / best_keysize; char* col = calloc(col_size, 1); char* key = calloc(best_keysize, 1); for (int i = 0; i < best_keysize; ++i) { for (size_t j = 0; j < col_size; ++j) { col[j] = as_bytes[j * best_keysize + i]; } double best_score = -1.0; char best_key = 0; for (int h = 0; h < 256; h++) { char k = h; repeated_xor(col, col_size, &k, 1, col); double score = score_text(col, col_size); if (score > best_score) { best_key = k; best_score = score; } // Undo the "decryption" repeated_xor(col, col_size, &k, 1, col); } key[i] = best_key; } printf("Key: %s\n", key); repeated_xor(as_bytes, num_bytes, key, best_keysize, as_bytes); printf("Decoded: %s\n", as_bytes); free(as_bytes); free(col); free(key); }