{ }codelper
do-while ループP0255

ユッかモが出たらもう一回

韓国のすごろく遊びユンノリでは、一回の番に棒(ユッカラ)を少なくとも一回投げる。
投げた結果がユッかモならもう一回投げ、ト・ケ・コルならその番は終わる。
結果は数で書く。
トは 1、ケは 2、コルは 3、ユッは 4、モは 5 で、駒はこの数だけ進む。
一人が何回かの番にわたって投げた結果が、投げた順にすべて与えられる。
一行目に投げた回数 n が、二行目に結果 n 個が空白一つずつで区切って与えられる。
最後の結果は 1、2、3 のどれかなので、最後の番も終わりまで与えられる。
番ごとに、その番に投げた結果をすべて足した値(その番に駒が進むマスの数)を順に一行に一つずつ出力せよ。

入力
1 ≤ n ≤ 1,000。
結果は 1〜5 の整数で、最後の結果は 1、2、3 のどれか
出力
番の数だけの行、各行にその番に進むマスの数
例 1 · stdin
6
4 2 3 5 4 1
stdout
6
3
10
main.py
入力(stdin)

実行すると、これらの行が順に input()・標準入力に渡されます(実行中に入力を求めません)。

$ 準備完了

コードを入力して解くにはパソコンで開いてください。モバイルでは問題と解答を見られます。

ほかの言語では?言語別の解答を見る · 8 言語の解答

一回の番は「先に投げて、投げたあとでもう一度投げるか聞く」ループなので do-while がぴったりです:do { t = a[i++]; total += t; } while (t >= 4);。
do-while がある言語は C・C++・Java・C#・JS・TS です。
C・C++・Java・C# は while (…) のあとにセミコロンがないとコンパイルできません。
JS・TS は省いても自動で補われますが、ふつうは書いておきます。
Python と Craykon には do-while がないので、while True:(Craykon 間 (真))で入り、本体のいちばん最後で if t < 4: break(Craykon 抜ける;)として「少なくとも一回」を作ります。
このとき聞く行を足す行より前に置くと、番を終わらせたト・ケ・コルが抜けて、4 2 が 6 ではなく 4 になります。
ふつうの while で書くには一回目をループの外で投げることになりますが、その一回目の結果を足し忘れがちです。
境界にも注意します。
ユッ(4)ももう一回投げるので t >= 4(または t > 3)で、t > 4 や t == 5 と書くとユッで番が終わってしまいます。

Pythonmain.py · 13 行
n = int(input())throws = list(map(int, input().split()))i = 0while i < n:    total = 0    # 파이썬에는 do-while이 없다: while True로 들어가 끝에서 물어 "적어도 한 번" 던진다    while True:        t = throws[i]        i += 1        total += t        if t < 4:   # 도·개·걸이면 차례가 끝난다(더한 뒤에 묻는다)            break    print(total)
JavaScriptmain.js · 14 行
const [n, ...throws] = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number);const out = [];let i = 0;while (i < n) {  let total = 0;  let t;  // 한 번은 던지고, 윷(4)·모(5)가 나왔으면 다시 던진다  do {    t = throws[i++];    total += t;  } while (t >= 4);  out.push(total);}console.log(out.join("\n"));
TypeScriptmain.ts · 14 行
import { readFileSync } from "node:fs";const [n, ...throws]: number[] = readFileSync(0, "utf8").trim().split(/\s+/).map(Number);const out: number[] = [];let i = 0;while (i < n) {  let total = 0;  let t: number;  do {    t = throws[i++];    total += t;  } while (t >= 4);  out.push(total);}console.log(out.join("\n"));
JavaMain.java · 22 行
import java.util.Scanner; public class Main {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        int n = sc.nextInt();        int[] throwsList = new int[n];        for (int k = 0; k < n; k++) throwsList[k] = sc.nextInt();        StringBuilder out = new StringBuilder();        int i = 0;        while (i < n) {            int total = 0;            int t;            do {                t = throwsList[i++];                total += t;            } while (t >= 4);   // do-while은 세미콜론으로 끝난다            out.append(total).append('\n');        }        System.out.print(out);    }}
C#Main.cs · 26 行
using System;using System.Linq;using System.Text; class Program{    static void Main()    {        int n = int.Parse(Console.ReadLine().Trim());        int[] throws = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray();        var sb = new StringBuilder();        int i = 0;        while (i < n)        {            int total = 0;            int t;            do            {                t = throws[i++];                total += t;            } while (t >= 4);            sb.Append(total).Append('\n');        }        Console.Write(sb);    }}
C++main.cpp · 18 行
#include <iostream>#include <vector> int main() {    int n;    std::cin >> n;    std::vector<int> a(n);    for (auto &x : a) std::cin >> x;    int i = 0;    while (i < n) {        int total = 0, t;        do {            t = a[i++];            total += t;        } while (t >= 4);        std::cout << total << "\n";    }}
Cmain.c · 17 行
#include <stdio.h> int main(void) {    int n, a[1000];    scanf("%d", &n);    for (int k = 0; k < n; k++) scanf("%d", &a[k]);    int i = 0;    while (i < n) {        int total = 0, t;        do {            t = a[i++];            total += t;        } while (t >= 4);   /* 윷(4)·모(5)면 한 번 더 */        printf("%d\n", total);    }    return 0;}
Craykonmain.cray · 19 行
n = コンソール.行読み().数に();던짐 = コンソール.数読み();i = 0;間 (i < n){    합 = 0;    // 크레이콘에는 do-while이 없다: 동안 (참)으로 들어가 끝에서 물어 그만    間 (真)    {        t = 던짐[i];        i++;        합 = 합 + t;        もし (t < 4)        {            抜ける;        }    }    コンソール.書く(합);}