{ }codelper
文字型改行なし出力P0045

文字の鎖

英字二つ a と b が空白一つをはさんで一行で与えられる。
二つとも小文字か、二つとも大文字である。
a から b までアルファベット順に一文字ずつ、間に "-" を入れて一行に出力せよ。
a が b より後ろの文字なら逆向きに(b の方へ)進む。
a と b が同じならその一文字だけを書く。
先頭と末尾には "-" を書かない。

入力
a, b:英字一つずつ、大文字小文字は同じ
出力
文字と "-" からなる一行
例 1 · stdin
c g
stdout
c-d-e-f-g
例 2 · stdin
E B
stdout
E-D-C-B
main.py
入力(stdin)

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

$ 準備完了

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

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

文字を「数のように」扱う方法は言語ごとに違います。
C の char は小さな整数なので c + 1 がそのまま次の文字で、putchar(c) で出力します。
C++・Java・C# にも文字型がありますが、char + int の結果は int なので、Java System.out.print('c' + 1) と C++ std::cout << 'c' + 1 は "100" を出します — (char)(c + 1) で戻すか、char 変数に入れ直します。
ループ変数を int にしてそのまま出しても "99-100-101" になります。
Python・JS・TS には文字型がなく一文字の文字列だけなので、コードと行き来します:Python ord("a")・chr(97)、JS・TS "a".charCodeAt(0)・String.fromCharCode(97)、Craykon 文字.コード("a")・文字.コードから(97)。
これを忘れると JS の "c" + 1 は黙って "c1" になり、Python は TypeError で止まります。
改行せずに続けて書く:Python print(x, end="")、JS・TS process.stdout.write(console.log は必ず改行します)、Java System.out.print、C# Console.Write、C putchar・printf、C++ std::cout << x、Craykon コンソール.続けて書く。
よくある落とし穴は文字ごとに後ろへ "-" を付けて最後に "-" が一つ残ること — 最初の文字以外の前に付けるか、リストに集めて "-".join・join("-") でつなぎます。
最後の改行一つも忘れずに。
そして a > b の逆向きの場合もあります。

Pythonmain.py · 8 行
a, b = input().split()# 글자 ↔ 코드: ord("a") == 97, chr(97) == "a"step = 1 if a <= b else -1for code in range(ord(a), ord(b) + step, step):    if code != ord(a):        print("-", end="")    print(chr(code), end="")print()
JavaScriptmain.js · 10 行
const [a, b] = require("fs").readFileSync(0, "utf8").trim().split(/\s+/);// 글자 ↔ 코드: "a".charCodeAt(0) === 97, String.fromCharCode(97) === "a"const from = a.charCodeAt(0);const to = b.charCodeAt(0);const step = from <= to ? 1 : -1;for (let code = from; code !== to + step; code += step) {  if (code !== from) process.stdout.write("-");  process.stdout.write(String.fromCharCode(code));}process.stdout.write("\n");
TypeScriptmain.ts · 11 行
import { readFileSync } from "node:fs";const [a, b]: string[] = readFileSync(0, "utf8").trim().split(/\s+/);// 글자 ↔ 코드: "a".charCodeAt(0) === 97, String.fromCharCode(97) === "a"const from: number = a.charCodeAt(0);const to: number = b.charCodeAt(0);const step: number = from <= to ? 1 : -1;for (let code = from; code !== to + step; code += step) {  if (code !== from) process.stdout.write("-");  process.stdout.write(String.fromCharCode(code));}process.stdout.write("\n");
JavaMain.java · 17 行
import java.util.Scanner; public class Main {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        char a = sc.next().charAt(0);        char b = sc.next().charAt(0);        int step = a <= b ? 1 : -1;        StringBuilder out = new StringBuilder();        // char + int 는 int 가 되므로 (char)로 되돌린다        for (char c = a; c != b + step; c = (char) (c + step)) {            if (c != a) out.append('-');            out.append(c);        }        System.out.println(out);    }}
C#Main.cs · 19 行
using System; class Program{    static void Main()    {        string[] parts = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries);        char a = parts[0][0];        char b = parts[1][0];        int step = a <= b ? 1 : -1;        // char + int 는 int 가 되므로 (char)로 되돌린다        for (char c = a; c != b + step; c = (char)(c + step))        {            if (c != a) Console.Write('-');            Console.Write(c);        }        Console.WriteLine();    }}
C++main.cpp · 13 行
#include <iostream> int main() {    char a, b;    std::cin >> a >> b;    int step = a <= b ? 1 : -1;    // c + step 은 int 라서 char 변수에 다시 담아야 글자로 찍힌다    for (char c = a; c != b + step; c += step) {        if (c != a) std::cout << '-';        std::cout << c;    }    std::cout << '\n';}
Cmain.c · 14 行
#include <stdio.h> int main(void) {    char a, b;    scanf(" %c %c", &a, &b);    int step = a <= b ? 1 : -1;    /* C의 char는 작은 정수라 c + step 이 곧 다음 글자다 */    for (char c = a; c != b + step; c += step) {        if (c != a) putchar('-');        putchar(c);    }    putchar('\n');    return 0;}
Craykonmain.cray · 19 行
글자들 = コンソール.行読み().分ける(" ");처음 = 文字.コード(글자들[0]);끝 = 文字.コード(글자들[1]);걸음 = 1;もし (처음 > 끝){    걸음 = -1;}코드 = 처음;間 (코드 != 끝 + 걸음){    もし (코드 != 처음)    {        コンソール.続けて書く("-");    }    コンソール.続けて書く(文字.コードから(코드));    코드 += 걸음;}コンソール.書く("");