Hallo Worldプログラム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
tk-xleader

Hallo Worldプログラム

#1

投稿記事 by tk-xleader » 17年前

雑談です。

プログラミングの1番始めの基礎の基礎であるHallo worldプログラムですが、一体どのくらいの数の違った数の実装が存在するのでしょうか?
という疑問を持ったので、Hallo Worldプログラムをたくさん集めてみようと思います。ですので、思いっきり滅茶苦茶なのでもいいので、いろいろな実装をお待ちしています。

条件
1:言語はC/C++/Javaのいずれか、規格を問いません。
2:空白は全て無視します(つまり見た目だけが異なるコードは同じとします)
3:環境依存のコードもその環境を明記の上OKですが、次の条件を満たすようにしてください。
  ・その環境でコンパイルして動く事。
  ・CUIであること。
4:出力結果は以下のようにしてください。
Hallo world!
まず自分から出します。言語はC++です。
#include<cstdio>
#include<vector>
using namespace std;

int main()
{
	vector<char>hallostring;
	hallostring.push_back('h');
	hallostring.push_back('a');
	hallostring.push_back('l');
	hallostring.push_back('l');
	hallostring.push_back('o');
	hallostring.push_back(' ');
	hallostring.push_back('w');
	hallostring.push_back('o');
	hallostring.push_back('r');
	hallostring.push_back('l');
	hallostring.push_back('d');
	hallostring.push_back('!');
	
	vector<char>::iterator itr=hallostring.begin();
	for(;itr!=hallostring.end();itr++){
		putchar(*itr);
	}
	return 0;
}
よろしくお願いします。

フリオ

Re:Hallo Worldプログラム

#2

投稿記事 by フリオ » 17年前

 Cで、
#include<stdio.h>

char *s = "Hello World!";

int main(void)
{
	if(!*s) return 0;
	fputc(*s ++, stdout);
	main();
	return 0;
}

組木紙織

Re:Hallo Worldプログラム

#3

投稿記事 by 組木紙織 » 17年前

では基本的なものを
言語はcです。
<code>
#include<stdio.h>
int main(void){printf("Hallo world!\n");return0;}
</code>

GPGA

Re:Hallo Worldプログラム

#4

投稿記事 by GPGA » 17年前

苦しんで覚えるC言語掲示板に昔投稿されたものです
http://hpcgi3.nifty.com/mmgames/patio/p ... ast&no=369

通りすがり

Re:Hallo Worldプログラム

#5

投稿記事 by 通りすがり » 17年前

上記リンク先のようなコードが出ては後に続く投稿がなくなりそうです(w

IOCCC(International Obfuscated C Code Competetion)
http://www.ioccc.org/
1987年の優勝作品でこんなものがあるようです。
#include <stdio.h> 
#define unix 1
main(){printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}
hello worldじゃなくてすみません。

tk-xleader

Re:Hallo Worldプログラム

#6

投稿記事 by tk-xleader » 17年前

>フリオさん

メイン関数の再帰呼び出しですか、これは思いつきませんでした。
ある意味でCとC++で互換性が無い部分をHalloWorldプログラムで提示しているということにもなってますね。

>組木紙織さん

たぶん最も本やHPに書いてあるパターンですね。

>GPGAさん

かなりすごいのが一つありましたけど…
苦しんで覚えるC言語」は約1年前にCやり始めたときに勉強していたページです。

ここで一つ思いついたので書いてみます。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<set>
using namespace std;

struct Check{
	bool operator()(char a,char b){
		return (bool)(rand()/(double)RAND_MAX+1);
	}
	Check(){}
};

int main()
{
	multiset<char,Check>hallo;
	for(const char *p="hallo world!";*p;p++){
		hallo.insert(*p);
	}
	multiset<char,Check>::iterator itr=hallo.begin();
	for(;itr!=hallo.end();itr++){
		putc(*itr,stdout);
	}
	return 0;
}
もうすでにsetの使い方を明らかに逸脱していますが。

tk-xleader

Re:Hallo Worldプログラム

#7

投稿記事 by tk-xleader » 17年前

>通りすがりさん

確かに何やってるか分からないですね。IOCCC…、Wikipediaで見たことはあるのですが…
確か目的は、皮肉的にプログラミング作法を伝えるなど…、でしたっけ?

たかぎ

Re:Hallo Worldプログラム

#8

投稿記事 by たかぎ » 17年前

C言語で出来るだけ多くの関数を使うというのは、以前「苦C」で書きましたし、それは既に紹介されているようなので...

というわけで、C++で簡単なものから書いてみます。
#include <iostream>

// HelloではなくHalloなのは仕様
bool f = std::cout << "Hallo world!" << std::endl;

int main() {}
一ひねりだけしてあります。

組木紙織

Re:Hallo Worldプログラム

#9

投稿記事 by 組木紙織 » 17年前

コンストラクタとデストラクタを使った簡単なものです。
ちょっと長いけど。
#include <iostream>
#include <exception>
class A
{
public:
	A(){std::cout<<'H';}
	~A(){std::cout<<'!';throw std::exception();}
};

class B
{
private:
	A a;
public:
	B(){std::cout<<'a';}
	~B(){std::cout<<'d';}
};

class C
{
private:
	B b;
public:
	C(){std::cout<<'l';}
	~C(){std::cout<<'l';}
};

class D
{
private:
	C c;
public:
	D(){std::cout<<'l';}
	~D(){std::cout<<'r';}
};

class E
{
private:
	D d;
public:
	E(){std::cout<<'o';}
	~E(){std::cout<<'o';}
};

class F
{
private:
	E e;
public:
	F(){std::cout<<' ';}
	~F(){std::cout<<'W';}
};



int main()
{
	try{
	F f;
	}catch(...)
	{
	}
	return 0;
}
#テンプレート使ったのも考えてみたいな。

tk-xleader

Re:Hallo Worldプログラム

#10

投稿記事 by tk-xleader » 17年前

>たかぎさん

あっ、「ハロー」のつづり間違ってました。でもそれは気にしないでください。

>通りすがりさん

追記ですが、
>上記リンク先のようなコードが出ては後に続く投稿がなくなりそうです(w

今回の目的は、「とことんまでにHello Worldプログラムを無茶苦茶な実装をするとどうなるか」がテーマではなく、「とことんな数のHello Worldプログラムの実装を集める」ということがテーマなので、難しいということは考えなくてもよさそうです。
簡単なものでも難しいものでも、そこから学び取れるものは大きいと思うので、さまざまなコードからさまざまな事を学んでいこうと思ってこのトピを立てました。
※ネタが尽きると難しい方向に持っていかざるを得ないようには思いますが。

一度初心に戻って…
#include<iostream>

int main()
{
	std::cout<<"Hallo World"<<std::endl;
	return 0;
}
言語はC++です。

tk-xleader

Re:Hallo Worldプログラム

#11

投稿記事 by tk-xleader » 17年前

>組木紙織さん

コンストラクタとデストラクタの呼び出しの順番を考慮して呼び出されるわけですね。

「苦C」でのたかぎさんのプログラムをちょこっとだけ参考にして…
#include<iostream>
#include<typeinfo>
#include<string>
using namespace std;

struct Hallo{
	string operator()(){
		return string(typeid(*this).name());
	}
	Hallo(){}
};

struct World{
	string operator()(){
		return string(typeid(*this).name());
	}
	World(){}
};

template<typename T>
void OutPut(T obj)
{
	cout<<obj();
}

int main()
{
	OutPut(Hallo());
	cout<<' ';
	OutPut(World());
	cout<<'!'<<endl;
	return 0;
}
templateとRTTIも投入してみました。

hoge

Re:Hallo Worldプログラム

#12

投稿記事 by hoge » 17年前

C++の次期規格で採用される可変長templateを使って書いてみました。
#include <iostream>
#include <iterator>

template <char... C>
class hallo;

template <char C>
class hallo<C>
{
public:
    hallo()
      {
        *std::ostream_iterator<char>(std::cout) = C;
      }
};
template <char C, char... X>
class hallo<C,X...>:public hallo<C>,public hallo<X...>{};

hallo<'H','a','l','l','o',' ','W','o','r','l','d','!','\n'> X;

int main(){}

たかぎ

Re:Hallo Worldプログラム

#13

投稿記事 by たかぎ » 17年前

比較的簡単なもので、応用価値があるものだと、
#include <iostream>
#include <iterator>
#include <algorithm>

int main()
{
  const char str[/url] = "Hallo world!\n";
  std::copy(str + 0, str + sizeof(str), std::ostream_iterator<char>(std::cout));
  return 0;
}
とか。

tk-xleader

Re:Hallo Worldプログラム

#14

投稿記事 by tk-xleader » 17年前

>たかぎさん

ostream_iteratorは使い方が未だ良く分からないのですが、これはOutPutIteratorとして考えてもいいのでしょうか?

少々ググって調べてみたのですが、これでもHallo World!って表示されるようですね。
#include<stdio.h>

int main()
{
	unsigned char sbyte[1000]={0};
	unsigned char*byte=sbyte;
	
	(*byte)+=9;
	
	while(*byte){
		byte++;
		(*byte)+=8;
		byte++;
		(*byte)+=11;
		byte++;
		(*byte)+=5;
		byte-=3;
		(*byte)--;
	}
	byte++;
	putchar(*byte);
	byte++;
	(*byte)-=2;
	putchar(*byte);
	(*byte)+=4;
	(*byte)+=7;
	putchar(*byte);
	putchar(*byte);
	(*byte)+=3;
	putchar(*byte);
	byte++;
	(*byte)--;
	(*byte)-=12;
	putchar(*byte);
	byte--;
	(*byte)+=8;
	putchar(*byte);
	(*byte)-=8;
	putchar(*byte);
	(*byte)+=3;
	putchar(*byte);
	(*byte)-=6;
	putchar(*byte);
	(*byte)-=8;
	putchar(*byte);
	byte++;
	(*byte)++;
	putchar(*byte);
	return 0;
}
一応文字コードがASCIIの状況でのみ有効なコードです。

TT414

Re:Hallo Worldプログラム

#15

投稿記事 by TT414 » 17年前

int main ( void ) {
static char H[4], a[4], l[4], o[4], sp[4], w[4], r[4], d[4], em[4];
printf ( "%*s%n%*s%n%*s%n%*s%n%*s%n%*s%n%*s%n%*s%n%*s%n\n%c%c%c%c%c%c%c%c%c%c%c%c\n",' ',"",sp,'!'-' ',"",em,'H'-'!',"",H,'a'-'H',"",a,'d'-'a',"",d,'l'-'d',"",l,'o'-'l',"",o,'r'-'o',"",r,'w'-'r',"",w,H,a,l,l,o,sp,w,o,r,l,d,em);
return 0;
}

tk-xleader

Re:Hallo Worldプログラム

#16

投稿記事 by tk-xleader » 17年前

>TT414さん

このコードをコンパイルして実行してもわけのわからない出力がされてしまいます。
なぜでしょうか?

たかぎ

Re:Hallo Worldプログラム

#17

投稿記事 by たかぎ » 17年前

> ostream_iteratorは使い方が未だ良く分からないのですが、これはOutPutIteratorとして考えてもいいのでしょうか?

はい。大丈夫です。

tk-xleader

Re:Hallo Worldプログラム

#18

投稿記事 by tk-xleader » 17年前

>たかぎさん

ありがとうございます。最近になってやっとSTLの仕組みやRTTIが分かってきたので、一応質問しておこうと思いまして。


一つ出しときます。
#include<cstdio>
#include<string>
#include<algorithm>

int main()
{
	std::string s="Hallo World!";
	std::for_each(s.begin(),s.end(),std::putchar);
	return 0;
}
関数オブジェクトの使い方間違ってるような気もしますが…

TT414

Re:Hallo Worldプログラム

#19

投稿記事 by TT414 » 17年前

>tkmakwins15さん
しつれいしました。

int main ( void ) {
static char H[4], a[4], l[4], o[4], sp[4], w[4], r[4], d[4], em[4];
printf ( "%*s%n%*s%n%*s%n%*s%n%*s%n%*s%n%*s%n%*s%n%*s%n\n%s%s%s%s%s%s%s%s%s%s%s%s\n",' ',"",sp,'!'-' ',"",em,'H'-'!',"",H,'a'-'H',"",a,'d'-'a',"",d,'l'-'d',"",l,'o'-'l',"",o,'r'-'o',"",r,'w'-'r',"",w,H,a,l,l,o,sp,w,o,r,l,d,em);
return 0;
}

でした

tk-xleader

Re:Hallo Worldプログラム

#20

投稿記事 by tk-xleader » 17年前

>TT414さん

確かに表示されました。でもどういうからくりなのでしょうか?

Sleepy

Re:Hallo Worldプログラム

#21

投稿記事 by Sleepy » 17年前

文字列の定義を外出ししてみました。
#include "stdio.h"

int main(int argc, char **argv)
{
	if(argc > 1)
	{
		puts(argv[1]);
	}
	return 0;
}

tk-xleader

Re:Hallo Worldプログラム

#22

投稿記事 by tk-xleader » 17年前

>Sleepyさん

確かにコマンドラインにHallo Worldと渡せば表示はされますね。

世の中にはC/C++/JavaではありませんがこれでHello World!って出力されるプログラミング言語があるようです。

H
↑ソースコードです。
Cに戻って…、例えばこんなのもありかな…
#include<stdio.h>

int rand(void);

int main(void)
{
	int i;
	for(i=0;i<12;i++){
		putchar(*("w!olloH dlra"+rand()));
	}
	return 0;
}

int rand(void)
{
	static int random=1;
	random=(random*13+5)%12;
	return random;
}
言語はCです。C++でもコンパイルはできますが…

のどが痛い

Re:Hallo Worldプログラム

#23

投稿記事 by のどが痛い » 17年前

>tkmakwins15さん
最初の%*sの最小フィールド幅は' 'の値になります。
sには""が対応するので結局%nまでの文字数=' 'の値になります。
%nまでの文字数がsp[0]に入るので結果' 'の値を入れることになります。
他の文字も同様です。

手ぶらではあれなので一応私も載せておきます。
#include<stdio.h>
int main ( void ) { 
	int i;
	for(i=0;i<12;i++) printf("%c","Hallo World!");
	return 0; 
}

tk-xleader

Re:Hallo Worldプログラム

#24

投稿記事 by tk-xleader » 17年前

>のどが痛いさん

あっ、なるほど、%nの使い方がポイントなわけですね。

一応C++で…
#include<iostream>
#include<sstream>
#include<string>
using namespace std;

int main()
{
	ostringstream str;
	str<<"Hallo World!"<<ends;
	cout<<str.str()<<endl;
	return 0;
}

閉鎖

“C言語何でも質問掲示板” へ戻る