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

paizaの新作プログラミングゲーム【電脳少女プログラミング2088 ─壊レタ君を再構築─】[廃マンションの一室（paizaランク：C相当）](https://ppg.paiza.jp/denno2088/areas/3)をやってみました。
- - -
###### 問題
https://ppg.paiza.jp/denno2088/challenges/denno2088_c_c_02
- - -
###### 方針
1. 整数$N$を受け取ります
1. 配列$A=\(a_i\)$を作成します（入出力例2より、12桁あれば十分です）
1. $i=0$とします
1. 以下、繰り返します
	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$足します
	1. $N$を$3$で割ります（この時点で$N$は$3$の倍数であることが保証されています）
	1. $i$に$1$足します
	1. $N=0$になったら、繰り返しを抜けます
1. 配列$A$を逆順に出力し、最後に改行を出力します
- - -
- 以下のコードでは、負の剰余も正の剰余となるようにしています
- 上の方針では余りによって3通りに分けていますが、実は$r=2, -1$とそれ以外の場合に分ければ十分です
- 前判定ループ（`while(){}`）を使うと$N=0$の場合に何も表示されなくなりますので、後判定ループ（`do{}while();`）を用います
    - 後判定ループの無い言語では、最初に$N=0$のケースを処理しています
- - -
###### C
```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++
```cpp
#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#
```cs
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
```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
```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
```js
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
```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
<?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
```pl
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
```py
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
```rb
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
```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
```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())
```
- - -