Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пара задач на смекалку 
:(
    Опции темы
ivanovpv
Дата 26.5.2010, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Варвар
**


Профиль
Группа: Участник
Сообщений: 639
Регистрация: 26.1.2005
Где: Москва

Репутация: 4
Всего: 28



Хммм... Есть такой хак:
Код

import javax.tools.JavaCompiler;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import java.io.*;

public class Tester
{
    public static void main(String args[])
    {
        Tester obj = new Tester();
        StringBuffer sb=new StringBuffer();
        sb.append("public class MyPrinter\n");
        sb.append("{\n");
        sb.append("public static void main(String[] args)\n");
        sb.append("{\n");
        sb.append("\tfor(int i=0; i < 1000000; i++)\n");
        sb.append("\t\tSystem.out.println(i);\n");
        sb.append("\t}\n");
        sb.append("}\n");
        File file=new File("MyPrinter.java");
        try
        {
            file.delete();
            file.createNewFile();
            OutputStream os=new FileOutputStream(file, false);
            Writer writer=new OutputStreamWriter(os);
            writer.write(sb.toString());
            writer.close();
            JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
            StandardJavaFileManager filemanager = compiler.getStandardFileManager(null, null, null);
            Iterable compilationUnits = filemanager.getJavaFileObjects(file);
            compiler.getTask(null, filemanager, null, null, null, compilationUnits).call();
            filemanager.close();
            Runtime.getRuntime().exec("java MyPrinter > output.txt");
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}


Суть состоит в том, что на лету создаем классик который печатает означенные от 1 до мульона, компилим его и тут же запускаем. Формально цикла в исходниках нет  smile

Добавлено через 2 минуты и 4 секунды
Можно конечно и покруче навертеть. Создать класс через рефлексию схватить его метод и запустить и не маяться вызовом Runtime.exec()


--------------------
Aut viam inveniam aut faciam
PM MAIL Skype   Вверх
ivanovpv
Дата 27.5.2010, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Варвар
**


Профиль
Группа: Участник
Сообщений: 639
Регистрация: 26.1.2005
Где: Москва

Репутация: 4
Всего: 28



Цитата(Самозванка @  25.5.2010,  15:03 Найти цитируемый пост)
Как не используя циклы распечатать все числа от 1 до 1 000 000 ?  


Придумал еще 1 вариант - на это раз честный без хака.

Код

import java.io.*;

public class Tester2
{
    public static void main(String args[])
    {
        byte[] buffer=new byte[1000000];
        MyOutputStream mos=new MyOutputStream();
        try
        {
            mos.write(buffer);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}

class MyOutputStream extends OutputStream
{
    static int counter=0;

    @Override
    public void write(int b) throws IOException
    {
        System.out.println(counter++);
    }
}





--------------------
Aut viam inveniam aut faciam
PM MAIL Skype   Вверх
pathfinder
Дата 27.5.2010, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 3.3.2010

Репутация: 2
Всего: 10



ivanovpv, все ж таки цикл присутствует в OutputStream write(byte[] b).
PM MAIL   Вверх
mrbrooks
Дата 27.5.2010, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: нет
Всего: 306



Цитата(susanin @  25.5.2010,  18:47 Найти цитируемый пост)
powerOn, а если на плюсах и без потока?возможно? 

дык той же рекурсией аля:
Код

#include <iostream>

void rec(int param)
{
    if (param <= 1000000)
    {
        std::cout << param++ << std::endl;
        rec(param);
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    rec(0);
    return 0;
}


Добавлено через 2 минуты и 8 секунд
Цитата(kemiisto @  25.5.2010,  21:03 Найти цитируемый пост)
Хе-хе. Его величество goto! smile 

гы
PM MAIL   Вверх
susanin
Дата 27.5.2010, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 587
Регистрация: 7.10.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 7



Цитата(mrbrooks @  27.5.2010,  16:15 Найти цитируемый пост)
дык той же рекурсией аля:

я этот вариант еще во 2 посте предложил...

Цитата(LSD @  25.5.2010,  15:11 Найти цитируемый пост)
Цитата(susanin @  25.5.2010,  16:05 )рекурсией?Тепло, но совсем не точно, StackOverflowError пока никто не отменял.


PM MAIL   Вверх
Kircul
Дата 27.5.2010, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 20.2.2007

Репутация: 6
Всего: 7



Цитата(Самозванка @  25.5.2010,  14:03 Найти цитируемый пост)
Есть связаный однонаправленный список... Каким образом распечатать его задом наперед.... Привести несколько вариантов... 


Записать в стек и выводить из стека. Такой вариант не предлагали?
PM   Вверх
Kircul
Дата 27.5.2010, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 20.2.2007

Репутация: 6
Всего: 7



ivanovpv, твоя идея с интерпретацией кода может быть реализована проще.
Код

public class T {

    public static void main(String[] args) throws ScriptException {
        new ScriptEngineManager().getEngineByName("JavaScript")
                              .eval("for(var i = 1; i <=10; i++) {println(i);}");
    }

}


Правда в таком случае код пишется на JS, а не на Java.

Это сообщение отредактировал(а) Kircul - 27.5.2010, 17:17
PM   Вверх
Kircul
Дата 27.5.2010, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 20.2.2007

Репутация: 6
Всего: 7



Вот вариант решения первой задачи даже без циклов в JS:
Код

public class T {

    public static void main(String[] args) throws ScriptException {
        ScriptEngineManager engineManager = new ScriptEngineManager();
        engineManager.getEngineByName("js")
                .eval("var i = 1;\n" +
                        "function f() {" +
                        "if (i <= 1000000) {" +
                        "println(i);" +
                        "f(i++);" +
                        "}" +
                        "}\n" +
                        "f();");
    }

}

Только запускать надо с параметрами "-Xms512m -Xmx512m" Этого достаточно.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0583 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.