Самый красивый код, который вы когда-либо писали. Romantic edition.

Когда программистов спрашивают о самом красивом коде, когда-либо ими написанном, обычно подразумевают красоту формы, а не содержания.



Но один паренёк, пожелавший остаться неизвестным, рассказал вот такую историю:
В своем классе я — один из немногих, кто прилично знает программирование и любит кодить. Со мной учится одна девчонка, она просто потрясающая… Я серьезно на неё запал, и был просто вне себя от радости, когда попросила меня помочь разобраться с программированием. Недолго думая, я склепал для неё такую вот программку:
#include<stdio.h>
int main()
{
    int i=3;
    int arr[]={85,3,73};
    while(i--)
        printf("%c ",arr[i]);
    return 0;
}


Уже догадались что она выводит? Не буду томить (вдруг, вы не знаете Си), вот окно консоли:



Наконец-то я смог своим кодом выразить свои чувства!

А у вас есть образец вашего кода, который вы считаете красивым? В любом из возможных смыслов. Делитесь, будем рады увидеть его=).

level18.lesson10.home10 не принимается валидатором

Пожалуйста, помогите!
При проверке все работает как часы — файл создается(пробовала и не создавать), сортировка производится верно, все потоки закрыла, просмотрела кучу решений, возникла только одна мысль — может что-то не так с созданием файла? хотя все работает…


package com.javarush.test.level18.lesson10.home10;

/* Собираем файл
Собираем файл из кусочков
Считывать с консоли имена файлов
Каждый файл имеет имя: [someName].partN. Например, Lion.avi.part1, Lion.avi.part2, ..., Lion.avi.part37.
Имена файлов подаются в произвольном порядке. Ввод заканчивается словом "end"
В папке, где находятся все прочтенные файлы, создать файл без приставки [.partN]. Например, Lion.avi
В него переписать все байты из файлов-частей используя буфер.
Файлы переписывать в строгой последовательности, сначала первую часть, потом вторую, ..., в конце - последнюю.
Закрыть потоки. Не использовать try-with-resources
*/

import java.io.*;
import java.util.ArrayList;


public class Solution {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        ArrayList<String> names= new ArrayList<String>();
        while(true){
            String data = reader.readLine();
            if(data.equals("end")) break;
            names.add(data);
        }
        reader.close();

        for(int i = 0; i<names.size(); i++){

            int min_Num = Integer.parseInt(names.get(i).substring(names.get(i).toLowerCase().lastIndexOf('t')+1));
            int min_i = i;
            for(int j = i+1; j<names.size(); j++){
                int new_Num = Integer.parseInt(names.get(j).substring(names.get(j).toLowerCase().lastIndexOf('t')+1));
                if(min_Num>new_Num){
                    min_i = j;
                }
            }
            if(min_i!=i){
                String tmp = names.get(i);
                names.set(i, names.get(min_i));
                names.set(min_i, tmp);
            }
        }



        String fileName = names.get(0).substring(0, names.get(0).lastIndexOf('.'));
        File headFile = new File("/Users/ivan.volkov/Documents/Yandex.Disk.localized/JavaRushHomeWork/JavaRushHomeWork/" + fileName);
        headFile.createNewFile();
        FileOutputStream file = new FileOutputStream(headFile, true);


        for(int i = 0; i<names.size(); i++){
            FileInputStream readFile = new FileInputStream("/Users/ivan.volkov/Documents/Yandex.Disk.localized/JavaRushHomeWork/JavaRushHomeWork/" + names.get(i));
            byte[] buff = new byte[readFile.available()];
            readFile.read(buff);
            file.write(buff);
            readFile.close();
        }

        file.close();


    }
}

com.javarush.test.level18.lesson10.bonus03 не принимает сервер

Добрый день!
Уже четвертый день пытаюсь сделать так, чтобы сервер принял мою задачу. Именно не решить, потому, что решил я ее в первый день, и вывод соответствует требованиям задания, а тупо гадаю почему сервер не принимает задачу. Перечита все ссылки по этой задаче, которые выдал мне гугл — не помогло. Помогите пожалуйста, если есть идеи.

package com.javarush.test.level18.lesson10.bonus03;

/* Прайсы 2
CrUD для таблицы внутри файла
Считать с консоли имя файла для операций CrUD
Программа запускается с одним из следующих наборов параметров:
-u id productName price quantity
-d id
Значения параметров:
где id - 8 символов
productName - название товара, 30 chars (60 bytes)
price - цена, 8 символов
quantity - количество, 4 символа
-u  - обновляет данные товара с заданным id
-d  - производит физическое удаление товара с заданным id (все данные, которые относятся к переданному id)

В файле данные хранятся в следующей последовательности (без разделяющих пробелов):
id productName price quantity
Данные дополнены пробелами до их длины

Пример:
19846   Шорты пляжные синие           159.00  12
198478  Шорты пляжные черные с рисунко173.00  17
19847983Куртка для сноубордистов, разм10173.991234
*/

import java.io.*;
import java.util.*;


public class Solution {




    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        LinkedHashMap<String, List<String>> map = new LinkedHashMap<>();
        String name = reader.readLine();
        reader.close();
        BufferedReader listreader = new BufferedReader(new InputStreamReader(new FileInputStream(name),"Cp1251"));

        String line;


        while ((line = listreader.readLine()) != null) {


            List<String> list = new ArrayList<>();
            String idWithSpace = line.substring(0, 8);
            String id = idWithSpace.trim();
            String productNameWithSpace = line.substring(8, 38);
            String productName = productNameWithSpace.trim();
            String priceWithSpace = line.substring(38, 46);
            String price = priceWithSpace.trim();
            String quantityWithSpace = line.substring(46, 50);
            String quantity = quantityWithSpace.trim();
            list.add(productName);
            list.add(price);
            list.add(quantity);
            map.put(id, list);
        }
        listreader.close();


        if (args[0].equals("-u")) {
            updateOperation(args,map);
        } else if (args[0].equals("-d")) {
            deleteOperation(args,map);
        }
        int counter = 0;

        BufferedWriter outputStream = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(name),"Cp1251"));
        for (Map.Entry<String, List<String>> pair : map.entrySet()) {
            String id = pair.getKey().toString();
            String productName = pair.getValue().get(0);
            String price = pair.getValue().get(1);
            String quantity = pair.getValue().get(2);
            String stroka = String.format("%-8.8s%-30.30s%-8.8s%-4.4s",id,productName,price,quantity);
            outputStream.write(stroka);

            counter++;
            if (counter != map.size()) {
                outputStream.newLine();
            }


        }
        outputStream.close();

    }

    public static void updateOperation(String[] args,LinkedHashMap map) throws IOException {
        List<String> list = new ArrayList<String>();
        StringBuilder sb = new StringBuilder();
        StringBuilder sb2 = new StringBuilder();
        String id = args[1];
        char[] productName1 = new char[30];

        for (int i = 2; i < args.length - 2; i++) {
            sb.append(args[i] + " ");
        }
        char[] productNameFromArgs = sb.toString().toCharArray();
        for (int i = 0; i < productName1.length; i++) {
            if (i == productNameFromArgs.length) break;
            productName1[i] = productNameFromArgs[i];
            sb2.append(productName1[i]);
        }
        String productName = sb.toString();
        String price = args[args.length - 2];
        String quantity = args[args.length - 1];
        list.add(productName);
        list.add(price);
        list.add(quantity);
        if (map.containsKey(id)) {
            map.put(id, list);
        }
    }


    public static void deleteOperation(String[] args,LinkedHashMap map) {
        if (map.containsKey(args[1]))
        map.remove(args[1]);
    }
}

Самый опасный код

Какой кусок кода вы бы назвали самым опасным из всех когда-либо написанных? Тут могут быть разные мнения, однако многие программисты сходятся на том, что опасность в простоте. Поэтому среди самых рискованных кусков кода они называют классическую fork-бомбу.

Это такая программа, которая бесконечно создает свои копии, а те в свою очередь создают свои копии и так пока память не закончится. Такая прожка может быть написана случайно, но чаще всего этот милый небольшой кусочек кода создают для вредительства.

Программа классической fork-бомбы (написанная на языке Си) выглядит так:

#include <unistd.h> 

int main() 
{ 
while(1) 
fork(); 
}


Если вы уже прошли 3 и 4 лекции CS50, то понимаете все слова, кроме fork=). Так вот, с fork() — это системный вызов с помощью которого программа и создает свои копии.

Внимание! Думаем, среди наших читателей найдутся любители экспериментов, которые захотят проверить воочию, положит ли на лопатки эта крохотная программка ваш компьютер. Если решитесь попробовать, настоятельно рекомендуем сохранить все несохраненные документы. Мы серьезно. Скорее всего скорость поедания ресурсов вас удивит=).

level20.lesson10.bonus01 - находим все int - числа Армстронга за 300 мс и с 1 Мб памяти. Задача не принимается

Написал программку, ищущую числа Армстронга. В первоначальном варианте комментариев нет, комментарии сделаны здесь для удобства. По моему все работает и задача решается. Подскажите почему не принимается
import java.util.TreeSet;

/* Алгоритмы-числа
Число S состоит из M чисел, например, S=370 и M(количество цифр)=3
Реализовать логику метода getNumbers, который должен среди натуральных чисел меньше N (long)
находить все числа, удовлетворяющие следующему критерию:
число S равно сумме его цифр, возведенных в M степень
getNumbers должен возвращать все такие числа в порядке возрастания

Пример искомого числа:
370 = 3*3*3 + 7*7*7 + 0*0*0
8208 = 8*8*8*8 + 2*2*2*2 + 0*0*0*0 + 8*8*8*8

На выполнение дается 10 секунд и 50 МБ памяти.
*/
public class Solution {
    public static void main(String[] args)
    {
        {
            long a=System.currentTimeMillis();
            int[] y = getNumbers(Integer.MAX_VALUE);
            long b=System.currentTimeMillis();
            System.out.println("time seconds "+(b-a)/1000);
            System.out.println("memory "+(Runtime.getRuntime().totalMemory()
                    - Runtime.getRuntime().freeMemory())/1024/1024 + " mb");
            for(int i : y){
                System.out.print(i+", ");
            }
        }
    }
    public static int[] getNumbers(int N) {

        int[] result = null;

        //контейнер для временного хранения найденных чисел
        TreeSet<Integer> armstrongs = new TreeSet<>();

        // массив имитирующий 10-значную систему исчисления. Будем его прокручивать
        //в бесконечном цикле. systemAccount[9] соответтвует первому разряду от 0 до 9
        int[] systemAccount = new int[10];

        //таблица степеней
        int[][] tPow = new int[10][10];
        tPow[0][0] = 0;tPow[0][1] = 1;tPow[0][2] = 2;
        tPow[0][3] = 3;tPow[0][4] = 4;tPow[0][5] = 5;
        tPow[0][6] = 6;tPow[0][7] = 7;tPow[0][8] = 8;
        tPow[0][9] = 9;
        for (int ii = 1; ii < 10; ii++){
            for (int jj = 1; jj < 10; jj++){
                tPow[ii][jj] = tPow[0][jj] * tPow[ii - 1][jj];
            }
        }
        tPow[9][9] = Integer.MAX_VALUE; // 9 в степени 9 выходит за пределы int и дает отрицательное число.
        //запоминаем эту степень как максимальное int, все равно это случай выходящий за пределы условия

        // таблица разрядов
        int[] mTen = new int[]{1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};


        int digit = 0; //служит для хранения числа, имитируемого массивом  systemAccount[]
        int sum = 0;   //служит для хранения суммы степеней данного числа
        int temp = 0;  //служебная переменная для перебора массива
        int minJ = 9;  //хранит максимально достигнутый разряд

        //бесконечный цикл, приводящий массив systemAccount[] в движение
        outer:
        while (true){

            // цикл управляющий счетом десятка первого разряда,
            // переключением и повышением 2-10 разрядов
            for (int j = 9; j >=0; j-- )
            {
                minJ = minJ > j ? j: minJ;
                systemAccount[j] = systemAccount[j] == 9 ? 0 : ++systemAccount[j];
                if (systemAccount[j] > 0){
                    while (j < 9){ systemAccount[++j]=0; }
                    break;
                }
            }

            // цикл проверяющий условие что последующее число не меньше предыдущего
            // и заменяющий его на предыдущее если данное число не ноль
            temp = 0;
            for (int k = 0; k < 10; k++)
            {
                if ((systemAccount[k] < temp) && (systemAccount[k] != 0)){
                    systemAccount[k] = temp;
                }
                else if (((systemAccount[k] > temp) && (systemAccount[k] != 0))){
                    temp = systemAccount[k];
                }
            }

            //преобразуем массив systemAccount[] в число и сразу считаем сумму степеней составляющих чисел.
            sum = 0;
            digit = 0;
            for (int d = minJ; d <= 9; d++){
                sum = sum + tPow[9-minJ][systemAccount[d]];
                if (sum < 0) {continue outer;}
                digit = digit + systemAccount[d]*mTen[9-d];
            }


            if ((digit > N)||(digit < 0)){break;} // проверяем границу условия и границу int

            //выполняем проверку что полученное число - число Армстронга
            if (digit == sum){armstrongs.add(digit);}
            //и если оно таковым не является то проверяем чвляется ли
            //числом Армстронга полученная сумма
            else {
                int check = 0;
                int count = 0;
                for (int h = sum; h > 0; h/=10){ count++;}
                for (int h = sum; h > 0; h/=10){ check = check + tPow[count-1][ h%10]; }
                if (check == sum){armstrongs.add(sum);}
            }

        }
        //контейнер в массив
        result = new int[armstrongs.size()];
        for (int z = 0; z < result.length; z++){
            result[z] = armstrongs.pollFirst();
        }
        //всё
        return result;
    }
}
  • ,

Подключение внешних библиотек для решение задач JavaRush

В какой-то момент времени настает понимание необходимости использовать полученные знания.
Итак, когда потребовалось для решения задачи подключить внешнюю библиотеку такой момент настал.
Я вспомнил о том, что у нас есть Maven, который будет работать на нас!
После решения практически всех заданий, я понял, что данный подход является правильным и уважаемым разработчикам ресурса следовало-бы уделить больше внимания Maven, хотя-бы в части подключения библиотек.
В качестве бонуса выкладываю свой pom.xml файл, который следует поместить в корень проекта.


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.javarush.test</groupId>
    <artifactId>test</artifactId>
    <version>1.0</version>
    <name>JavaRush</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.jdk.version>1.7</project.jdk.version>
        <src.dir>src</src.dir>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.6.1</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.6.1</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.6.1</version>
        </dependency>

        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.8.3</version>
        </dependency>

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>18.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-collections4</artifactId>
            <version>4.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpcore</artifactId>
            <version>4.4.3</version>
        </dependency>

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.1</version>
        </dependency>

        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>javax.mail</artifactId>
            <version>1.5.5</version>
        </dependency>

        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.9.1</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

    </dependencies>

    <build>
        <sourceDirectory>${src.dir}</sourceDirectory>

        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.3</version>
                <configuration>
                    <source>${project.jdk.version}</source>
                    <target>${project.jdk.version}</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

test.level18.lesson10.home01

Задача прекрасно работает на компьютере. Но, при прохождении проверки пишет: «Что долго работала на сервере и поэтому была закрыта. В чем может быть дело?
package com.javarush.test.level18.lesson10.home01;

/* Английские буквы
В метод main первым параметром приходит имя файла.
Посчитать количество букв английского алфавита, которое есть в этом файле.
Вывести на экран число (количество букв)
Закрыть потоки. Не использовать try-with-resources
*/

import java.io.*;

public class Solution {
    public static void main(String[] args) throws Exception
    {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        FileInputStream fr = new FileInputStream(reader.readLine());
        char[] m = new char[52];
        for (int i = 0; i < 26; i++)
        {
            m[i] = (char) ('a' + i);
        }
        for (int i = 0; i < 52; i++)
        {
            m[i] = (char) ('A' + i);
        }
        byte[] buf = new byte[fr.available()];
        if(fr.available()>0)
        {
            int count = fr.read(buf);
        }
        String str = new String(buf);
        char[] lips = str.toCharArray();
        int count = 0;
        for (int i = 0; i < lips.length; i++)
            for (int j = 0; j < m.length; j++)
                if (lips[i] == m[j])
                    count++;
        System.out.print(count);
        reader.close();
        fr.close();
    }


}
  • ,

level18.lesson10.home10

package com.javarush.test.level18.lesson10.home10;

/* Собираем файл
Собираем файл из кусочков
Считывать с консоли имена файлов
Каждый файл имеет имя: [someName].partN. Например, Lion.avi.part1, Lion.avi.part2, ..., Lion.avi.part37.
Имена файлов подаются в произвольном порядке. Ввод заканчивается словом "end"
В папке, где находятся все прочтенные файлы, создать файл без приставки [.partN]. Например, Lion.avi
В него переписать все байты из файлов-частей используя буфер.
Файлы переписывать в строгой последовательности, сначала первую часть, потом вторую, ..., в конце - последнюю.
Закрыть потоки. Не использовать try-with-resources
*/

import java.io.*;
import java.util.Arrays;
import java.util.HashMap;


public class Solution {
    public static void main(String[] args) throws IOException{
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        String filename = reader.readLine();
        HashMap<String, byte[]> map = new HashMap<>();
        while(!"end".equals(filename))
        {

            FileInputStream fileInputStream = new FileInputStream(filename);
            byte[] data = new byte[fileInputStream.available()];
            int count = fileInputStream.read(data);
            map.put(filename, data);
            fileInputStream.close();

            filename = reader.readLine();
        }
        reader.close();
        String FileOutputName = "/home/alexandr/Idea/ArhivJavaRush/JavaRushHomeWork/src/com/javarush/test/level18/lesson10/home1010/Lion.avi";
        Object[] arrayKeys = map.keySet().toArray();
        Arrays.sort(arrayKeys);
        FileOutputStream fileOutputStream = new FileOutputStream(FileOutputName);
        for (int i = 0; i < arrayKeys.length; i++)
        {
            byte[] curenntData = map.get(arrayKeys[i]);
            fileOutputStream.write(curenntData);
        }
        fileOutputStream.close();



    }
}


что тут не так? не могу понять.
  • ,

level08.lesson08.task05 c подвохом или ошибка?

В данной задаче автоматом есть такой код
public static void removeItemFromMapByValue(HashMap<String, String> map, String value)
    {
        HashMap<String, String> copy = new HashMap<String, String>(map);
        for (Map.Entry<String, String> pair: map.entrySet())
        {
            if (pair.getValue().equals(value))
                map.remove(pair.getKey());
        }
     }


У нормального человека сразу возникает ощущение что условием задачи есть использование данного кода. Но данный метод не работает, так это уловка что бы ученики немного подумали или просто ошибка в курсе?
  • ,

Один большой массив и два маленьких

Ребята, что не так?


package com.javarush.test.level07.lesson04.task05;

import java.io.BufferedReader;
import java.io.InputStreamReader;

/* Один большой массив и два маленьких
1. Создать массив на 20 чисел.
2. Ввести в него значения с клавиатуры.
3. Создать два массива на 10 чисел каждый.
4. Скопировать большой массив в два маленьких: половину чисел в первый маленький, вторую половину во второй маленький.
5. Вывести второй маленький массив на экран, каждое значение выводить с новой строки.
*/


public class Solution
{
    public static void main(String[] args) throws Exception
    {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int[] arr = new int[20];
        for (int i = 0; i < arr.length; i++)
            arr[i] = Integer.parseInt(reader.readLine());

        int[] arr2 = new int[10];
        int[] arr3 = new int[10];

        for (int i = 0; i < arr.length; i++)
        {
            if (i < 10)
                arr2[i] = arr[i];
            else
                arr3[i] = arr[i];

        }

        for (int i = 0; i < arr3.length; i++)
        System.out.println(arr3[i]);

    }
}
  • ,

level08.lesson08.task02

Сервер не принимает задачу — что не так?

/* Удалить все числа больше 10
Создать множество чисел(Set), занести туда 20 различных чисел.
Удалить из множества все числа больше 10.
*/

package com.javarush.test.level08.lesson08.task02;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Solution
{
public static HashSetcreateSet()
{

Setset = new HashSet();
for (int i = 0; i < 20; i++)
{
set.add(i);
}
return (HashSet) set;
}

public static HashSetremoveAllNumbersMoreThen10(HashSetset)
{

Iteratoriterator = set.iterator();
while (iterator.hasNext())
{
int a = iterator.next();
if (a > 10)iterator.remove();
}
return (HashSet)set;
}

public static void main(String[] args)
{
HashSetA = new HashSet();
A=createSet();
A=removeAllNumbersMoreThen10(A);
}
}
  • ,

level18.lesson10.home01


package com.javarush.test.level18.lesson10.home01;

/* Английские буквы
В метод main первым параметром приходит имя файла.
Посчитать количество букв английского алфавита, которое есть в этом файле.
Вывести на экран число (количество букв)
Закрыть потоки
*/
public class Solution {
    public static void main(String[] args)
    {
        String line = args[0];
        int count = 0;
        for (int i = 0; i < line.length(); i++){
            String s = line.substring(i, i + 1);
            if (s.matches("[a-zA-Z]")) count++;
        }
        System.out.println(count);
    }
}



Почему не проходит тестирование?)