🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

670閲覧

0と1の並びで1の両端だけを0にしたい

hacch

総合スコア15

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2021/01/19 08:59

編集2021/01/19 11:13

0と1のn個の配列があるとき、1の並びの両端を0にするプログラムを書きたいのですが、ルールに乗っ取って考えるとかけないです。。
1の並びは一度しか出現しない。
1が0個からn個のケースまで対応できるようにする。

入力
標準入力。初めに0も1の並びの数n。その次に空白で区切られた0と1のn個の並び。

出力
標準出力。1の両端が0に変更された並び。

ルール
変数は配列を除いて三つまで。配列は一つまで。forやwhileは三つまで。if文、三項演算子の使用禁止。ソースコードはカッコだけやコメントアウトを除いて18行以内で収められる。

実行例はこんな感じです。
[入力]
5
0 1 1 1 0
[出力]
0 0 1 0 0

ルールがヒントになるみたいですが、どのような考え方でできるのでしょうか??
もしわかる方いらっしゃいましたら教えていただけると嬉しいです。
以下のソースコードならifは利用していないですが、これも無しで考えたいです。

C

1#include <stdio.h> 2int main(){ 3 int b[256]; 4 int i, n; 5 scanf("%d", &n); 6 for(i=0; i<n; i++) scanf("%d", &b[i]); 7 for(i=0; i<n; i++) printf("%d ", i>0&&i<n-1&&b[i-1]+b[i]+b[i+1]>2); 8} 9

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2021/01/19 10:45

> 空白で区切られた0と1のn個の並び。 とありますが、例示では"01110"となっており、空白がありません。例示が間違いでしょうか。 コードは18行以内とありますが、C言語の場合いくらでも1行に詰め込めますが良いのでしょうか。 int i, n; は1行ですが、愚直にint i;(改行) int n; とすると2行になってしまいます。
hacch

2021/01/19 11:17

申し訳ございません。訂正致しました。 普段は、ソースコードが字下げなど整理されて綺麗に見える範囲で書いています。 forの後に1つしか無ければfor() scanf();と書くような感じです。
guest

回答3

0

ベストアンサー

これはチューリングマシンを作りなさいという主旨の問題だと思います。

そうすると、以下のようなコードになります。

C

1#include <stdio.h> 2 3int main() { 4 int state[] = {0, 0, 0}; 5 int n, i; 6 int j = 1; 7 8 scanf("%d", &n); 9 scanf("%d", &state[0]); 10 for (i=0; i<n-1; i++) { 11 scanf("%d", &state[j]); 12 printf("%d ", (state[0]+state[1]+state[2])/3); 13 j = (j + 1)%3; 14 } 15 state[j] = 0; 16 printf("%d ", (state[0]+state[1]+state[2])/3); 17}

投稿2021/01/19 23:40

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

C

1#include <stdio.h> 2 3int main(void) 4{ 5 int b[1024] = { 0 }; 6 for (scanf("%d%d",b+1,b+3); ++*b<b[1]; printf("%d ",b[*b+1]+b[*b+2]+b[*b+3]>2)) 7 scanf("%d",b+*b+3); 8 puts("0"); 9}

追記
「0と1のn個の配列」の n の制限をもっと緩くしたいと思います。

C

1#include <stdio.h> 2 3int main(void) 4{ 5 int b[5] = { 0 }; 6 for (scanf("%d%d", b+1, b+3); ++*b < b[1]; b[2] = b[3], b[3] = b[4]) 7 scanf("%d", b+4), printf("%d ", b[2]+b[3]+b[4] > 2); 8 puts("0"); 9}

投稿2021/01/19 13:22

編集2021/01/19 15:41
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

  • 出力の最初と最後は必ず0です.
  • それ以外の箇所に関しては, (b[i-1] + b[i] + b[i+1])/3を出力すれば良いのではないでしょうか.

投稿2021/01/19 09:16

fana

総合スコア11985

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2021/01/19 09:50

実装に際しては, [ 0, 入力n個, 0 ] という感じで,配列の先頭側と末尾側に番兵として0を入れてやれば良いですね.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問