• 締切済み

文字のプリントで数値を表現するプログラム

かなり以前の大学等の情報処理センターではフォートランで計算させることが多いと思います。フォートランはそのままでは作図ができないのでファイルに文字を出力するような方法で作図ができたと思います。例えば松田聖子の画像を細かい文字で表示したようなものが壁に貼ってあったりしたと思います(ある程度年配の人ならご存知かと)。あれは数値の2次元的な広がりの画像データを使ってその数値に対して何らかのルールで文字を当てて紙にプリントしたものだと思います(文字は紙に印刷すると2次元ですね)。このアルゴリズムとかあるいはソースなどがどこかにないかなと思うのですが。どうでしょうか。データ形式としてはラスターということになると思いますが。 それ以外にも時系列のグラフを同じような方法で表示するとかいろいろあったと思います。これは線を引くことを模擬しているのでベクターという風な感じになりますが、線がないところはスペース文字が入っているはずなのでラスター風ではあります。そのようなソースプログラムはどこかにないかなと思いますが。どうでしょうか。ソースが無ければアルゴリズムでもいいです。自分で考えてもいいのですが、やはりこれは後ろ向き過ぎるので既にあるものでもいいのですが。 古いフォートランで科学技術計算を解説する本とかにのっているのではないかと思いますが、どうでしょうか。ちょっとさがしてみるのですが、ありそでなさそです。本質ではないのでその部分だけはサンプルに載せないという本もあるようです。温故知新というかそれなりに面白い面もあると思うのですが。 よろしくお願いします。

みんなの回答

回答No.1

こんにちは。私も世代的には近いと思います。 若い方は何を意味しているか分からない…という人もいるのでは。 ざっと見てみたところ、下記のようなものが見つかりました。 JavaScriptなどで実装している例もあるみたいですね。 [aalib.js - 画像や動画をアスキーアートに MOONGIFT] https://www.moongift.jp/2016/05/aalib-js-%E7%94%BB%E5%83%8F%E3%82%84%E5%8B%95%E7%94%BB%E3%82%92%E3%82%A2%E3%82%B9%E3%82%AD%E3%83%BC%E3%82%A2%E3%83%BC%E3%83%88%E3%81%AB/ [C言語で画像→アスキーアートコンバータを作る - 3DプリンタとITとプリキュアのブログ] http://precure-3dprinter.hatenablog.jp/entry/2017/09/10/C%E8%A8%80%E8%AA%9E%E3%81%A7%E7%94%BB%E5%83%8F%E2%86%92%E3%82%A2%E3%82%B9%E3%82%AD%E3%83%BC%E3%82%A2%E3%83%BC%E3%83%88%E3%82%B3%E3%83%B3%E3%83%90%E3%83%BC%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B [AA変換(アスキーアート生成)|Web便利ツール@ツールタロウ] https://tool-taro.com/image_to_ascii/

skmsk1941093
質問者

お礼

回答ありがとうございます。考えてみるとフォントを小さくすると、100x100とかそれなりの分解能だと結構いろいろできるものですね。ただ、結局は物量的な分厚さはプログラムとしては簡易なものと同じことになるわけですね。いまどきのPCでやるなら全然負荷もかからないしですね。当時の言語はおそらくフォートランなのではないかと思います。フォートランでできないかなと思いますが。Cを見ながら移植はできそうですが。単純な割に面白いものだとおもうんですけどね。

関連するQ&A

  • Fortranの割り算について

    フォートランによる数値計算についてお尋ねします。(技術系では今でもフォートランが現役なので) 何百万回も割り算をするアルゴリズムがあります。分母は定数で、分子がいっぱい変化します。としますと、割り算ではなく、分の1を計算して掛け算にしてもよいわけです。精度よりも高速化のほうが今はウェイトが高い状況です。 プログラムとしてそのように組んだ方が速いかも、と思いますが、一方でコンパイラが気を利かせて掛け算としてコンパイルしているかも知れません。もし、そうならばプログラムを書き換える意味がありません。 このあたりがコンパイラオプションなのかな?と思いますが、デフォルトでどのように計算しているか不明なのです。 以前の数値計算の本(PC-9801の頃)では時間を計って”ほら、割り算より掛け算が早いでしょ”ということを示すものなどがありました。そのような場合はコンパイラがそこまで気を利かせていないということになりますが、だいたいのところコンパイラは割り算をできるだけ掛け算に変更しようとしているのでしょうか。 PC上でのフォートラン(コンパックフォートランです。Microsoft,DECとオーナが変わってきてついに終わってしまったPC用のあのフォートランです。)を使っています。藁をも掴む思いで高速化を進めています。いかがでしょうか。

  • PWSCFでの電荷密度の単位

    PWSCFでの電荷密度の単位 よろしくお願いします。 PWSCFという、固体物質の数値計算を行うソフトで電荷密度分布を計算したのですが その単位が分からず困っています。 フォートランのソースファイルを眺めてみたのですが、 どこに書いてあるのかが分かりません。 御存じの方がいらっしゃれば教えていただけますでしょうか?

  • 流体の数値解析で座標変換を行った際の境界条件の処理について

    simple解法で二次元乱流の数値計算プログラムをやっているのですが,滑りなしで翼面の流速を0にしたい場合 ,座標変換を行った際にはどうすればよいのでしょうか?本のプログラムではヤコビアンの成分を二乗して たしたものの平方根をかけたりしているのですが, これが何を意味しているのいまいちわかりません. これだけで伝わりにくければ補足しますのでよろしく お願いします.

  • 乱数発生ルーチンの使い方について

    数値計算において一様乱数を発生させるルーチンがいろいろあります。ソースが公開されているものやコンパイラが提供したりするものです。それらを利用する場合、乱数発生のシーズ(種)を与えてそれに応じて動作するというものが多いだろうと思います。そこで質問ですが、10000個の乱数を1回発生させる場合と100個の乱数を100回発生させる場合とで乱数の感じがかなり違います。いずれの場合も100×100の2次元データ(エクセルのシート状)として出力して作図したらその違いが簡単に分かります。この違いの原因はシーズの与え方が1回と100回という違いだろうと思います。100回のシーズの与え方にパターンが出来てしまうからだと思われます。例えば時間を使ってシーズを与えなおすことも考えられますが、今時のPCだとあっという間なのでシーズが同じだから、同じ乱数が100個できてしまいます。乱数を繰り返し発生させるときにその繰り返しの中でパターン化された乱数にならないように発生させる方法がないでしょうか。シーズが要らない乱数生成ルーチンとかですが。あるいはシーズをランダムに取得する方法が含まれたルーチン(シーズがないように見える)などです。あるいは本当にないものなど。メルセンヌツイスターはどうなのでしょうか。一応、フォートランでの利用を考えていますが、言語依存の問題ではないかもと思いますが。 よろしくお願いします。

  • 本のタイトル、出版社、シリーズ名、どれかを教えてください。

    本を探しています。 私の記憶では「四次元のひみつ」というタイトルになっている本ですが、探してみても見つかりません。 タイトルが違うようなので、ぜひ正しいタイトルを教えてください。 この本の記憶があって断片でも存在を覚えていてくださる方でも結構です。子どもの頃大好きだった本です。 内容は、 一本の木の上をアリが歩いている図、これが一次元の説明。紙の上に線が引いてあって、一次元アリは線の上しか歩けないが、二次元アリは面を歩ける、これが2次元の説明。3次元は私達の住む世界。四次元はそれに時間が加わるという内容。他に、漫画で光速の宇宙船で宇宙を旅行してきて、地球に帰ってくると、その乗組員は年をとらないが、地球では皆、年をとってしまっているというようなものも載っていました。 他にはエッシャーの階段か水の流れる水路、滝のような絵も載っていたかもしれません。 あいまいな記憶で申し訳ありません。 どうぞよろしくお願いいたします。

  • 数値計算したいのに文字列連結されてしまう。

    数値計算したいのに文字列連結されてしまう。 交通費の合計値を計算するhtmlページを作成しております。 テキストボックスの値が変更された時に動くJavaScriptを作成しております。 html側には name="cost1" ~ name="cost10" までのタグがあ、 どのテキストボックスが変更されても合計計算のJavaScriptが呼ばれます。 下記のようなソースを書いておりまして、 cost1~cost10までの合計値をcost_sum.valueに代入したいと思っています。 しかし下記※印部で文字列連結がされてしまいます。 過去の類似質問等検索しまして、 直前に-0を入れて数値計算として扱わせる事や、 parseInt(costsum); を直前に入れるなど試みたのですが上手く行きません。 htmlとJavaScriptを扱い始めて日が浅く、 基本的なことを聞いてしまっているとは思いますがよろしくお願いします。 【test.html】 <input type="text" value="100" name="cost_1" id="cost_1" size="5" OnChange="sum_calculate();"> …(中略)… <input type="text" value="2000" name="cost_2" id="cost_2" size="5" OnChange="sum_calculate();"> <!-- 合計値をcost_sum.valueに入れる --!> <input type="text" value="" style="background-color:#D4D0C8" readonly="readonly" name="cost_sum" id="cost_sum" size="5"> 【test.ja】 function sum_calculate() {  n = 1;  costsum = 0;  while(n <= 10 ) {   alert(n + "週目");   va = "cost_" + n;   va = document.getElementById(va).value;   alert(va);   costsum = costsum - 0 + va ;   //※文字列連結されてしまう   alert(costsum);   n = n + 1;   }   this.cost_sum.value = costsum;  }

  • C言語プログラム

    こんな課題が出たのですが、さっぱりわかりません。 誰か解る人がいたら教えてほしいです。 1 3+5+7+…+nと奇数の和を求め、和が100を越えたときのnの値を求めて表示するプログラムをdo~whileを使って作成しなさい。 2  キーボードから3つの数を読み込み、最大値を求める処理を繰り返し行うプログラムを、do~whileを使って作成しなさい。繰り返しの終了は、計算のあとで、'S'(1文字)が入力されるまでとし、それ以外の文字では、処理を続行すること。 3  整数型1次元配列kに整数123,456,789をそれぞれ代入し、その内容を表示するプログラムを作成しなさい。 4  文字型1次元配列strに'u'を、'n'、'i'、'x'それぞれ代入し、その内容を文字列として出力するプログラムを作成しなさい。 5  要素数50の整数型1次元配列mの要素すべてに、その添字に対応した0~49の数値を代入し、その内容を表示するプログラムを作成しなさい。 3は #include <stdio.h> main() { int k[3]; k[0] = 123; k[1] = 456; k[2] = 789; printf("%d\n%d\n%d", k[0], k[1], k[2]); return 0; } と解いてみたんですが、やっぱ間違えてますよね?

  • java 電卓のプログラム

    或る程度まで進みましたが、 ソースコードが分からず困っています;; こんな問題なのですが・・・ 課題1 以下の要件を満たす電卓のプログラム Calculatorクラスを作成し、ソースコードを 示せ。 1.最初に標準入力から文字を1文字入力し 計算の種類や動作を決定する。 必要な入力文字と動作の種類の対応を下記に示す。 入力文字  動作   +    数値a,bを受け取りa+bの結果を表示する   -    数値a,bを受け取りa-bの結果を表示する   *    数値a,bを受け取りa*bの結果を表示する   /   数値a,bを受け取りa/bの結果を表示する       ただし、b=0の時は「Infinity」と表示する   !    数値aを受け取りaの階乗を計算し表示する   q   終了する 2. 計算の種類が決定した後、標準入力から計算に必要な数字を入力する 3.計算が終了した後、再度、標準入力からの動作の 種類を受け付ける。 こんな感じです。 で、一応ここまで進んでいます。 import java.io.*; public class Calculator { public static void main(String[] args) throws IOException { BufferedReader buf = new BufferedReader( new InputStreamReader(System.in)); int i = 0; int answer = 1; System.out.println("+、-、*、/、!、qから選んで入力してください"); String s = buf.readLine(); System.out.println("数字を二つ入力してください"); int a = Integer.parseInt(buf.readLine()); int b = Integer.parseInt(buf.readLine()); if (s.equals("+")) { System.out.println(a + b); } if (s.equals("-")) { System.out.println(a - b); } if (s.equals("*")) { System.out.println(a * b); } if (s.equals("/")) { System.out.println(a / b); } if (s.equals("!")) { System.out.println("階乗の計算をします。数字を一つ入力してください"); while (i < a) { i++; answer = i * answer; System.out.println("a!=" + answer); } } if (s.equals("q")) { //終了する処理 } } } とりあえず、自分でなんとか・・・。 後、残ったのは割り算で bに0が入力された時にInfinityと表示するのと、 階乗と終了する処理・・・・。 そして、終了の命令があるまで計算を続ける ソースを書く・・・。 ここからどのようにすればいいのでしょうか・・・ 教えてください。お願いします!

    • ベストアンサー
    • Java
  • FDTDの数値計算について

    光波の伝搬の計算としてFDTD法を用いる事を考え、Scilabを用いた1次元のFDTD法をまず行うことを考えています。想定する状況は左端に光源があり、空気(屈折率1)を伝搬するという単純なものです。 そこでプログラムを以下のようにしました。 各パラメータは波長ramuda=500*10^-9,dz=ramuda/20,dt=dz/c,透磁率と誘電率mu=ep=1としています。 Hy(1:M)=0; Ex(1:M+1)=0; For n=1:N, Ex(1)=sin(n*dt*c/ramuda); Hy=Hy-dt./mu.*diff(Ex)/dz; Ex(2:M)=Ex(2:M)-dt./ep.*diff(Hy)/dz; end 宇野先生や橋本先生、小舘先生などの本を読む限り条件等はこれでよいはずなのですが、全く伝搬するような計算ができませんでした。数値計算自体慣れていないため、足りない部分があるかと思いますが全く見当がつきませんでした。どうか何が足りていない、何が間違っているなどありましたらご指摘いただきけないでしょうか。

  • センターの情報関係基礎の勉強法を教えてください!

    センターの情報関係基礎の勉強法を教えてください 今高3の受験生ですが、センターは数学2Bではなく、情報関係基礎を受ける予定です。 因みにPCの知識はP検準2級までは(模擬試験ですが)難なく合格判定が出ましたし、自信もあります。 センターでの問題形式は以下の様に定着しているようですが、 第1問(必答):2進数をはじめとする数値の処理,インターネット知識 ⇒これはセンターをやってみたところ、ほぼ満点取れました 第2問(必答):アルゴリズム ⇒これは全然出来ませんでした・・・ 第3問(選択):表計算ソフト ⇒大体点数を取れました 第4問(選択):アルゴリズム,プログラム ⇒アルゴリズムを選んだほうが点を取りやすいと言われていたのでそっちをやりましたが、やはり第2問同様ダメでした・・・・ この様にアルゴリズムの問題はあまり出来ず、シスアドの本で勉強するといいという意見をネットで見かけますが具体的にどの様な本がお勧めでしょうか? 又、そのシスアドの本外に何かお勧めの本、学習法があればそちらでも構いません。 宜しくお願いします