СоХабр закрыт.

С 13.05.2019 изменения постов больше не отслеживаются, и новые посты не сохраняются.

| сохранено

H Hello world в 1 строчку на чистом JavaScript в черновиках Recovery Mode

image
Изображение сгенерировано с помощью сервиса instacod.es

Для тех, кто не привык ждать — демка.
Обновлено: удивлен такой популярности моей реализации. Создал репозитарий на Гитхабе, чтобы любой мог форкнуть и присылать Pull Request-ы с улучшениями. Лицензия MIT.

Предисловие


Увидев крутые разработки крутых ребят с хабра, я тоже решил поучаствовать в этой специльной олимпиаде. Но 30 строк? Что за нубство, почему бы не сразу в одну? Окей, вызов принят, как говорится.

Как разрабатывалось


Я давно занимаюсь JS-ом и именно по этой причине подумал, что я смогу осилить такую сложную на первый взгляд задачу. Как все это разрабатывалось — я расскажу по шагам, думаю, это необходимо.

В Javascript есть глобальный объект window, думаю, многие слышали про него. Собственно, как известно, в JS все является объектом. У этого объекта (window) есть объект document (чтобы проверить это утверждение, достаточно в консоли браузера (F12 в хроме, например) сделать запрос
window.document instanceof Object
Консоль вернет нам true). Кстати, доступ к глобальным переменным осуществляется не только через window.variable, но и просто через variable, на то они и глобальные переменные.

У объекта document есть метод write, который позволяет писать в document. Вызвав этот метод с необходимой нам строкой (или объектом, или чем-нибудь еще) мы запишем значение нашей переменной в document.

В общем-то, всё. Вот так на первый взгляд сложное становится простым. Надеюсь, кто-то сможет побить мой рекорд!

комментарии (135)

–97
+46 –143
NLab ,  

В чем смысл Вашего сатиричного поста? Свое недовольство можно выразить в личку, и не плодить бессмысленные посты.

+88
+113 –25
theaqua ,   * (был изменён)

Не совсем понимаю, кому именно я должен выразить свое недовольство. Тем, кто захочет написать еще один велосипед на 30 строк? Но, увы, я в 2013, у нас пока не получается предсказывать будущее.

+218
+221 –3
SanGreel ,  

Имхо слишком уныло, даешь код в 0 строк который делает ничего.

+13
+23 –10
theaqua ,   * (был изменён)

Я попробую, но не обещаю, что получится. Думаю, стоит следить за arxiv.org, я там опубликую paper в случае успеха, аудитория Хабра не приветствует интересные решения.

+15
Ppord ,  

Готово!

+4
+8 –4
xunter ,  

По вашему желанию:

+142
+143 –1
withkittens ,  

Вы использовали на одну строчку больше, чем необходимо. Попробуйте ещё.

+2
DjComandos ,  

Так есть же http://vanilla-js.com/?download

+9
+12 –3
keslo ,   * (был изменён)

Так подходит?
image

+11
samodum ,  

Залейте на гитхаб

+8
+10 –2
samvo ,  
console.log("Hello world!");

Меньше символов. Утилита консольная, но вы же в курсе «ГУЙ это для неудачников»
+4
+5 –1
torbasow ,  

В консоли можно обойтись меньшим. Просто:
>>>"Hello world!"

0
MarcusAurelius ,   * (был изменён)

Так это REPL выводит, только в консоли и работает, а если в js файле, то и не выведется. Можно просто написать Hello world! без кавычек, оно выведется, более того, еще выведется стек-трейс. Кстати, ниже интересное решение есть

+12
aavezel ,  
+3
deepsweet ,  
+1
bozheville ,  

Философии нольстроков можно набраться из этого труда lib.ru/PROZA/KLOCHKO/probel.txt

+5
Strepetarh ,  

На эту тему хотели написать статью, но она получилась пустая.

+6
+7 –1
NoEscape ,   * (был изменён)
+4
+5 –1
Lockal ,  
+37
+40 –3
Mezomish ,  
>В чем смысл Вашего сатиричного поста? Свое недовольство можно выразить в личку, и не плодить бессмысленные посты.

В чем смысл вашего негативного комментария? Свое недовольство можно выразить в личку, и не плодить бессмысленные комментарии.
+15
Indexator ,  

Вот это я понимаю ироничный пост!) Даже посмеялся, хотя иронию не разделяю) А не то, что недавний высер про веб-браузер в 30 строк…

+33
+36 –3
artem_drozdoff ,  

Ребят, найдите работу и не мучайтесь с количеством строк

+8
Mushtat ,  

Дело в том, что нужно будет мучаться с качеством :)

0
artem_drozdoff ,  

Ну in my humble opinion, куда интереснее работать над качеством:-)

+27
+28 –1
WGH ,  

Какой же это чистый JavaScript, если подразумевается наличие документа?

+2
+3 –1
lolmaus ,  
console.log("Hello, world!");
Так? :)
+4
+5 –1
ivan_kolmycheck ,  

Подразумевает наличие консоли. Она появилась не так уж и давно в тех же браузерах. ;)

+3
lolmaus ,  

document нельзя, console тоже нельзя… ну тебя, Пятачок, сам не знаешь, чего хочешь!

+2
+3 –1
ivan_kolmycheck ,  

С документом или консолью каждый может. ;)

+4
ertaquo ,  

Так и с интерпретатором или операционной системой тоже. На асме разве что… но там ж процессор, с ним тоже сможет кто угодно. А вот без процессора и чтоб не больше 30 строк — это сильно будет!

+16
+17 –1
lolmaus ,  

Вы меня вынудили:

alert("Hello, world!");
+2
+3 –1
kiaplayer ,  

Для alert() нужен window :(

+4
lolmaus ,  

А задача вообще имеет решение?

+31
TheShock ,  
throw 'hello world'



$ node -e "throw 'hello world'"

[eval]:1
throw 'Hello World'
^
Hello World
+2
+3 –1
lolmaus ,  

Нет ножек консоли — нет мультиков.

+4
TheShock ,  

Вот только в отличии от console.log — это именно конструкция языка, а не просто метод стандартной либы ;)

+19
Halt ,  

Это дзеновское созерцание программы. В любой программе есть ошибка. В Совершенной Программе, код и ошибка это одно и то же.

+5
+20 –15
lampa ,   * (был изменён)

Они старались, а вы — нет. Вечно чем-то недовольны…

+5
Seldon ,  

Пусть стараются у себя на компьютере, старания — не повод выкладывать всякую фигню на профильный ресурс где аудитория ждет немного другой уровень постов.
Меня лично бесит этот спам из «стараний», который может повторить сколь-нибудь адекватный программист ниже среднего.

+5
+8 –3
VoVanJinn ,  

Пятницы надо было дождаться хотябы…

+1
+4 –3
jaybekster ,  

Без улыбки не прочесть ))

+7
oshibka404 ,  

Было сложно, но у меня получилось!

+28
topy ,  

А слабо Hello world в 30 строк?

+17
agegorin ,  

Вы не поверите, в песочнице уже есть.
habrahabr.ru/sandbox/74624/

+2
topy ,  

Отлично, жалко нет инвайта для этого кодера

0
might ,  

думаю, индусы и на большее кол-во строк растягивали)

+2
ImLiar ,  

dart в свое время уложился всего в 17259 строк

+5
+6 –1
samodum ,  

Слабо написать HelloWorld в 30 строк?

+3
+4 –1
Urvin ,  

С фабрикой…

0
ivan_kolmycheck ,   * (был изменён)
+3
ivan_kolmycheck ,  
Для тех, кому лень сходить по ссылке
#!/usr/bin/env ruby

class MegaGreeter
  attr_accessor :names

  # Create the object
  def initialize(names = "World")
    @names = names
  end

  # Say hi to everybody
  def say_hi
    if @names.nil?
      puts "..."
    elsif @names.respond_to?("each")
      # @names is a list of some kind, iterate!
      @names.each do |name|
        puts "Hello #{name}!"
      end
    else
      puts "Hello #{@names}!"
    end
  end

  # Say bye to everybody
  def say_bye
    if @names.nil?
      puts "..."
    elsif @names.respond_to?("join")
      # Join the list elements with commas
      puts "Goodbye #{@names.join(", ")}.  Come back soon!"
    else
      puts "Goodbye #{@names}.  Come back soon!"
    end
  end

end


if __FILE__ == $0
  mg = MegaGreeter.new
  mg.say_hi
  mg.say_bye

  # Change name to be "Zeke"
  mg.names = "Zeke"
  mg.say_hi
  mg.say_bye

  # Change the name to an array of names
  mg.names = ["Albert", "Brenda", "Charles",
    "Dave", "Engelbert"]
  mg.say_hi
  mg.say_bye

  # Change to nil
  mg.names = nil
  mg.say_hi
  mg.say_bye
end
–3
+7 –10
Suvitruf ,  

Слишком толсто.

+1
iklementiev ,   * (был изменён)

Ради такого поста можно было и в пол строки уложиться.

+3
+7 –4
Prometheus ,  

document.write(«Hello world!»);

можно и еще короче написать :)

alert(«Hello world!»);

Правильно правильно, а то многие уже разучились тут писать на нативном JS, куда ни плюнь — везде Jquery
А вот раньше было время, никакого тебе $
наичистейший нативный код :)))
document.getElementById
document.getElementsByClassName
document.getElementsByTagName

+13
murr ,  

Если уже кичиться олдфажностью, то стоит отметить, что getElementsByClassName появилось относительно недавно.

0
Prometheus ,  

Да, но это уже не столь важно, т.к. это уже история.

+4
Lockal ,  
куда ни плюнь — везде Jquery

А что мелочиться? Даёшь jQuery на каждый однострочник! Поразите всех мощью селекторов!

$('*').text("Hello world!");
0
ivan_kolmycheck ,  

Ждём «Подключение JQuery в одну строку».

+1
oWeRQ ,  

Лучше как-то так:

$('body *:not(:has(div))').text("Hello world!");
+7
Agent_J ,  

В одну строку не айс.

Надо было делать действительно в 30
Демо

eval(function(p, a, c, k, e, r)
{
    "use strict";
    e = String;
    if(!''.replace(/^/, String))
    {
        while(c--)
        {
            r[c] = k[c] || c;
        }
        k = [
            function(e)
            {
                return r[e];
            }
        ];
        e = function()
        {
            return'\\w+';
        };
        c = 1;
    }
    
    while(c--)if(k[c])
    {
        p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c]);
    }
    
    return p;
}('0.1("2 3!");', 4, 4, 'document|write|Hello|world'.split('|'), 0, {}));

+9
solshark ,  

А можно на гитхаб выложить? Есть пару пулл-риквестов :)

+21
shpaker ,  

Вас тоже раздражают двойные кавычки? )

+1
theaqua ,  

Без проблем! GitHub.

+1
shpaker ,  

Демо божественное

+7
+8 –1
alexraven ,  

Олдфагов не раздражают двойные кавычки. В наше время одинарные кавычки были признаком Паскаля ))

+15
+19 –4
deepsweet ,  

целиком разделяю иронию автора :)
что за школоло измерять крутость в количестве строк? сходите уже на js1k или даже 140byt.es, посмотрите как пишут взрослые дядьки и успокойтесь.

+3
hardex ,  

Коллектив Instacode в лице меня выражает вам благодарность за контрибуцию этого бесценного кода в фонд знаний человечестве!

0
theaqua ,  

На самом деле, вот было бы здорово, если бы можно было скрывать, чтобы не появлялось в общем списке (он же вроде есть).

0
hardex ,  

Стесняетесь? Можно слить картинку и удалить.

+2
theaqua ,  

Вовсе нет. Просто я воспользовался только для генерации hipster-like картинки, а сам сервис, как мне показалось, преследует другие цели, в итоге мой пост там (да и тут, честно говоря) — всего лишь мусор.

+2
hardex ,  

Вообще говоря там 99.99% — мусор, так что ничего страшного.

+3
+4 –1
ababo ,  

автор крут! респект и уважуха, теперь буду учить JS с удвоенным рвением!

+4
pxx ,  

Можете пофиксить, чтобы работало в 12 Опере? Видимо используется что-то из сверхновых стандартов: ES5 или даже 6

+27
+28 –1
theaqua ,  

Попробую написать юзерскрипт позже, после этой публикации завалили предложениями пройти собеседование.

+2
mezastel ,  

Даешь код длиной в -1 строку, при запуске которого происходит фазовая инверсия вселенной.

0
Oxyd ,  

Поделить на 0 можно и в одну строку.

–2
+4 –6
zag2art ,  

Шпилил в вашу игруху часа два — затягивает!!! (брызжа слюной)

+1
Dyo ,   * (был изменён)

Кто знает как называется сервис который обрабатывает скриншоты в перспективу? Как у картинки в посте. Что — то такое проскальзывало на хабре вроде.

+3
Antelle ,  
+6
wbb ,   * (был изменён)

Вот еще один хороший фреймворк в 6 строчек — jquery-1.10.2

+5
+6 –1
Suvitruf ,  

Я конечно понимаю, что недавние посты по JS могли многим надоесть, но…

Судя по рейтингу этой статьи, сообщество предпочитает абсолютно бессмысленные статьи как эта?

+8
+10 –2
vitvad ,  

Среди всех опубликованных 30ти строчных скриптов я не заметил ни одного интересного требующего какой-либо особой уличной магии. Зато у них есть одно общее свойство — громкий заголовок. Больше всего меня расстроил Exel в 30 строк.
Вот почему я солидарен с автором сего поста и поставил ему плюс.

+3
Suvitruf ,  

А эту статью, следовательно, посчитали интересной? Ок.

+1
+2 –1
vitvad ,  

откуда это следует?
Но она хотябы подняла мне настроение.
На хабре часто после одного хорошего/успешного поста появляется череда постов той же тематики с маленьким промежутком времени между ними. И за частую финальной точкой в таких сериях становится вот такого рода иронический пост.

+10
Agent_J ,   * (был изменён)

Из оценки к этой статье следует, что всем надоели «{{ something }} в 30 строк на javascript» без каких-либо интересных концептуальных решений.

–3
+3 –6
friday ,  

> Собственно, как известно, в JS все является объектом.

Странно слышать это от человека, который «давно занимается JS-ом».

String, Number и Boolean, например, не являются объектами, они лишь симулируют их поведение. При работе с ними как с объектами они «оборачиваются» в объекты, которые сразу после операции с ними уничтожаются.

> var s = «some string»;
undefined
> s instanceof Object; // объект, да?
false
> s.attr = 1;
1
> s.attr;
undefined

Можно даже попытаться изменить существующие атрибуты:

> s.length = 0;
0
> s.length;
11;

0
+1 –1
theaqua ,   * (был изменён)

Я знаю. Я пародировал тех, кто не понимает JS и думают, что > в JS все является объектом. Ну и пытаются привнести свою толику ООП, когда пишут свою реализацию классов.

Спасибо, что обратили внимание.

+10
zxcabs ,  

Если уж умничаете, то умничайте правильно:
String, Number, Boolean как раз таки являются объектами, а вот string, number, boolean уже нет.

+3
+4 –1
theaqua ,  

По просьбам сообщества теперь доступен репозитарий на GitHub.

+9
cuhuak ,  

Вам понадобилось пять коммитов, чтобы сделать программу в одну строку :)

0
theaqua ,  

Инициализация через веб-интерфейс гитхаба (с лицензией и так далее); сама программа; ридми; первый issue; мердж

+5
edwardspec ,  

Всё правильно — коммиты должны быть максимально атомарны.

0
jaybekster ,  

А что с кодом в одну строчку и один символ?

;

Идеальный код =)
0
oshibka404 ,  

Можно короче.

+6
edwardspec ,   * (был изменён)
А что с кодом в одну строчку и один символ?
;
tl;dr
0
Yanovsky ,  
+13
armed ,  

Малевич своим черным квадратом примерно также подытожил ту эпоху в живописи :)

+1
edwardspec ,  

Интересно, сколько он сделал коммитов.

+1
Doktor_Gradus ,  

О, довольно много. Более того, существуют его же авторства форки и следующие версии.

0
Crazybot ,  

Его версия уже была форком.

–2
kriokamera ,  

Ничего он не итожил, и особенно так.

0
iago ,  

Пруфы пожалуйста. К примеру, Вассерман считает что итожил, и у меня нет причин ему не доверять в этом конкретном вопросе.

+10
grayKot ,  

Не мог пройти мимо столь важной и интересной темы.
У меня есть первый серьезный патч для тебя:

< document.write("Hello World!")
---
> document.write('Hello World!')


Извини, что не в гитхаб, но если очень нужно, то сделаю Pull Request.

В патче double quotes заменены на single quotes. На это есть две «очень» важные причины:
1. От одинарных кавычек меньше визуального шума
2. Производительность. Вот тест который, показывает, что одинарные кавычки намного быстрее!
var iterations = 1000000;

document.body.innerHTML = '';
var start = new Date().getTime();
for (var i = 0; i < iterations; i++) {
    document.write("Hello World!");
}
var doubleTime = new Date().getTime() - start;

document.body.innerHTML = '';
start = new Date().getTime();
for (var i = 0; i < iterations; i++) {
    document.write('Hello World!');
}
var singleTime = new Date().getTime() - start;

alert('double quotes time: ' + doubleTime + '\nsingle qoutes time: ' + singleTime);


Сорри, что тест не в одну строку. Но в 30 все же влез.
+13
TheShock ,  

На самом деле весь кайф одинарных кавычек в том, что для них не надо нажимать «шифт»

0
zloool ,  

lulwut?

0
sedu ,  
+2
grayKot ,  

очевидно же, вы тестируете в неправильном браузере

0
alexraven ,   * (был изменён)

А вот и нет. double quotes time: 19613, single qoutes time: 19868, хром какой-то-последний.

0
NektoDev ,   * (был изменён)

Ошиблись немного.

«double quotes time: 10967single qoutes time: 11092»

Chrome

Я буду обновлять комментарии…

+6
dshvechikov ,  

Автор, конечно, знатный тролль 80 лвла. Спасибо, посмеялся :)

+7
SilverTH ,  

Значит не будет теперь порта Дума в 30 строчек? :(

0
Alexey2005 ,   * (был изменён)

Тоже поддался общему ажиотажу, решив накодить как раз трёхмерный лабиринт с возможностью бродилова. Чтобы вместить классический raycasting-алгоритм (как в Wolf3D, псевдотрёхмерность) в 30 строк, пришлось предварительно сгенерировать набор lookup-таблиц суммарным объёмом 4Мб, которые просто помещаются в HTML и идут в качестве ресурсов довеском к коду. Зато JS всего 30 строчек, да.
К счастью, вовремя остановился, увидев эту статью.

+3
iago ,  

Нет, не останавливайтесь пожалуйста! Ваш проект — это как раз интересные 30 строчек, а не змейка.

0
+1 –1
IgorAdamenko ,  

Самое интересное, что автор расписал одну строчку более подробно, чем все остальные «гении» свои тридцать строк, которые, как говорится, без 100 грамм не разберешь.

+3
crwin ,  

Добавьте минифицированную версию, пожалуйста, а то многовато как-то…

+3
Levsha128 ,  

document.write('hll wrld')
Забирайте :)

+1
+2 –1
sefus ,  

Автор забыл запятую в обращении к миру. Пофиксите пожалуйста.

0
landan ,  

а как запустить? хочу другу-программисту показать, не верит.

+2
keslo ,  

Крутой код!!! Использовал бы его, но он у меня в IE

+4
edwardspec ,  

Проблема на вашей стороне: у вас IE.

+17
+18 –1
sedu ,  

Кажется получилось.
Hello world в 0 строк на чистом JavaScript.
jsfiddle.net/xCG5A/

+1
i_d3ndy ,  

Я ждал такого поста. Да, действительно автор расписал свою одну строчку очень подробно, нежели другие. Ждем очередной арканоид, только в одну строчку :)

0
NaN ,   * (был изменён)
var 你好,世界

а он есть!
+1
iHun ,  

Под какой лицензией распространяется данный код? Можно ли использовать в своих проектах?

+1
edwardspec ,   * (был изменён)

Лицензия MIT.

/*
The MIT License (MIT)

Copyright (c) 2013 %author_name%

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
document.write("Hello, World!")
0
+1 –1
imater ,  

Автор первой подобной статьи изобрёл DDOS Хабрахабра из 30 строк кода.

+1
eveel ,  

Платиновый пост.

0
Scorpion97 ,  

Кто-нибудь может дать ссылку на сервис, в котором из кода можно сгенерировать изображение, как в этой статье? Заранее благодарен.

+1
theaqua ,  
0
Scorpion97 ,  

О да, это он! Долго не мог найти его, уже отчаялся, спасибо огромное!

0
zildarius ,  
'Hello, World!', без JS и без текста
0
bubuq ,  

Хело ворлд, 0 строк яваскрипта, 0 строк разметки: jsfiddle.net/96JEe/

0
Agent_J ,  

Да ну?! А body откуда взялся, если нет разметки?

0
bubuq ,  

Элемент BODY присутствует, даже если нет тэга <body>.

0
rg_software ,  

Автор, вы забыли указать, какой текстовый редактор был использован при разработке, и какие его особенности заставили вас выбрать его в качестве основного инструмента.