6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【電脳少女プログラミング2088 ─壊レタ君を再構築─】「廃マンションの一室」をやってみた。

Last updated at Posted at 2025-01-25

paizaの新作プログラミングゲーム【電脳少女プログラミング2088 ─壊レタ君を再構築─】廃マンションの一室(paizaランク:C相当)をやってみました。


問題


方針
  1. 整数$N$を受け取ります
  2. 配列$A=(a_i)$を作成します(入出力例2より、12桁あれば十分です)
  3. $i=0$とします
  4. 以下、繰り返します
    1. $r=N\%3$とします(言語によっては負の値になります)
      • $r=0$の場合
        • $a_i=0$とします
      • $r=1,-2$の場合
        • $a_i=1$とします
        • $N$から$1$引きます
      • $r=2,-1$の場合
        • $a_i=2$とします
        • $N$に$1$足します
    2. $N$を$3$で割ります(この時点で$N$は$3$の倍数であることが保証されています)
    3. $i$に$1$足します
    4. $N=0$になったら、繰り返しを抜けます
  5. 配列$A$を逆順に出力し、最後に改行を出力します

  • 以下のコードでは、負の剰余も正の剰余となるようにしています
  • 上の方針では余りによって3通りに分けていますが、実は$r=2, -1$とそれ以外の場合に分ければ十分です
  • 前判定ループ(while(){})を使うと$N=0$の場合に何も表示されなくなりますので、後判定ループ(do{}while();)を用います
    • 後判定ループの無い言語では、最初に$N=0$のケースを処理しています

C
#include <stdio.h>

int main() {
	int n;
	scanf("%d", &n);
	int A[12];
	int m = 0;
	do {
		int r = (n % 3 + 3) % 3;
		A[m++] = r;
		if (r == 2) n += 1; else n -= r;
		n /= 3;
	} while (n);
	while (m--) {
		printf("%d", A[m]);
	}
	puts("");
	return 0;
}

C++
#include <iostream>
#include <vector>
using namespace std;

int main() {
	int n;
	cin >> n;
	vector<int> A;
	do {
		int r = (n % 3 + 3) % 3;
		A.push_back(r);
		if (r == 2) n += 1; else n -= r;
		n /= 3;
	} while (n);
	while (!A.empty()) {
		cout << A.back();
		A.pop_back();
	}
	cout << endl;
	return 0;
}

C#
using System;
using System.Collections.Generic;

class Program
{
	public static void Main()
	{
		int n = int.Parse(Console.ReadLine());
		Stack<int> stack = new Stack<int>();
		do {
			int r = (n % 3 + 3) % 3;
			stack.Push(r);
			if (r == 2) n += 1; else n -= r;
			n /= 3;
		} while (n != 0);
		while (stack.Count > 0)
			System.Console.Write(stack.Pop());
		Console.WriteLine();
	}
}

Go
package main
import "fmt"

func main() {
	var n int
	fmt.Scan(&n)
	A := []int{}
	if n == 0 {
		A = append(A, 0)
	}
	for n != 0 {
		r := (n % 3 + 3) % 3
		A = append(A, r)
		if r == 2 {
			n += 1
		} else {
			n -= r
		}
		n /= 3
	}
	for i := len(A) - 1; i >= 0; i-- {
		fmt.Print(A[i])
	}
	fmt.Println()
}

Java
import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		sc.close();
		Stack<Integer> stack = new Stack<Integer>();
		do {
			int r = (n % 3 + 3) % 3;
			stack.push(r);
			if (r == 2) n += 1; else n -= r;
			n /= 3;
		} while (n != 0);
		while (!stack.empty()) {
			System.out.print(stack.pop());
		}
		System.out.println();
	}
}

JavaScript
let n = Number(require("fs").readFileSync("/dev/stdin", "utf8"));
const A = []
do {
	let r = (n % 3 + 3) % 3;
	A.push(r);
	if (r === 2) n += 1; else n -= r;
	n /= 3;
} while (n);
console.log(A.reverse().map(String).join(''));

Kotlin
import java.util.*

fun main() {
	val sc = Scanner(System.`in`)
	var n = sc.nextInt()
	sc.close()
	val stack = Stack<Int>()
	do {
		val r = (n % 3 + 3) % 3
		stack.push(r)
		if (r == 2) n += 1 else n -= r
		n /= 3
	} while (n != 0)
	while (!stack.empty()) {
		print(stack.pop())
	}
	println()
}

PHP
<?php
	$n = intval(fgets(STDIN));
	$A = [];
	do {
		$r = ($n % 3 + 3) % 3;
		$A[] = $r;
		if ($r === 2) $n += 1; else $n -= $r;
		$n /= 3;
	} while ($n);
	while (!empty($A)) {
		echo array_pop($A);
	}
	echo PHP_EOL;
?>

Perl
my $n = int(<STDIN>);
my @A = ();
do {
	my $r = $n % 3;
	push @A, $r;
	if ($r == 2) {
		$n += 1;
	} else {
		$n -= $r;
	}
	$n /= 3;
} while ($n); 
while (@A) {
	print pop @A;
}
print $/;

Python3
n = int(input())
A = []
if n == 0:
	A.append(0)
while n:
	r = n % 3
	A.append(r)
	if r == 2:
		n += 1
	else:
		n -= r
	n //= 3
print(''.join(map(str, reversed(A))))

Ruby
n = gets.to_i
A = []
if n == 0
	A.push(0)
end
while n != 0
	r = n % 3
	A.push(r)
	if r == 2
		n += 1
	else
		n -= r
	end
	n /= 3
end
puts A.reverse.join

Scala
import scala.io.StdIn._
import scala.collection.mutable._

object Main extends App{
	var n = readInt()
	val stack = Stack[Int]()
	do {
		val r = (n % 3 + 3) % 3
		stack.push(r)
		if (r == 2) n += 1 else n -= r
		n /= 3
	} while (n != 0)
	while (stack.nonEmpty) {
		print(stack.pop())
	}
	println()
}

Swift
var n = Int(readLine()!)!
var A = [Int]()
repeat {
	let r = (n % 3 + 3) % 3
	A.append(r)
	if r == 2 {
		n += 1
	} else {
		n -= r
	}
	n /= 3
} while n != 0

print(A.reversed().map { String($0) }.joined())

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?