Cyberという言語、面白いぞ

## Cyberについて

AtCoderの新言語アップデートで使えるようになりました。
個人的な感想ですが、Pythonのような書き心地にC++並の速度が出ます。
↓読んでください。
[公式サイト](https://cyberscript.dev/) [公式ドキュメント](https://fubark.github.io/cyber/)

## AtCoder Beginners Selectionの11問をCyberで解いた

まず最初に一つ言っておきます。
**int型は使えない→number型を使う**
**入力で渡されるrawstring型からint型やnumber型に直接変換ができない**

ということで、rawstring型などの文字列型からnumber型に変換する関数を作りました。
ほとんど使われていない言語なので、シンタックスハイライトが効きません↓

``` cy
-- string型をnumber型に変換。
func ston(s):
  l = s.len()
  n = 0
  for 0..l each i:
    n = n * 10 + number(s[i])
  return n
```

### Welcome to AtCoder

``` cy
-- string型をnumber型に変換。
func ston(s):
  l = s.len()
  n = 0
  for 0..l each i:
    n = n * 10 + number(s[i])
  return n
a = ston(getInput())
t = getInput().split(' ')
b = ston(t[0])
c = ston(t[1])
prints '{a + b + c} '
print getInput()
```
printsは末尾に改行をしない出力です。
多分ですが、以下のように、formatの中に文字列を入れると出力が変わります。
``` cy
print '{getInput()}'
```
``` 入力
abcde
```
``` 出力
rawstring (5)
```

### Product

``` cy
-- string型をnumber型に変換。
func ston(s):
  l = s.len()
  n = 0
  for 0..l each i:
    n = n * 10 + number(s[i])
  return n
t = getInput().split(' ')
a = ston(t[0])
b = ston(t[1])
if a * b % 2 == 0:
  print 'Even'
else:
  print 'Odd'
```

### Placing Marbles

``` cy
-- string型をnumber型に変換。
func ston(s):
  l = s.len()
  n = 0
  for 0..l each i:
    n = n * 10 + number(s[i])
  return n
t = getInput()
c = 0
if t[0] == '1':
  c += 1
if t[1] == '1':
  c += 1
if t[2] == '1':
  c += 1
print '{c}'
```
文字列についてはPythonとほぼ同じです。

### Shift Only

``` cy
-- string型をnumber型に変換。
func ston(s):
  l = s.len()
  n = 0
  for 0..l each i:
    n = n * 10 + number(s[i])
  return n
-- string型をnumber型のlistに変換。
func stoln(s):
  a = []
  for s.split(' ') each i:
    a.append ston(i)
  return a
n = ston(getInput())
a = stoln(getInput())
ans = 30
for a each i:
  c = 0
  while i % 2 == 0:
    c += 1
    i /= 2
  if c < ans:
    ans = c
print ans
```
除算はPythonとは違い、/ (スラッシュ1つ)です。

### Coins

``` cy
-- string型をnumber型に変換。
func ston(s):
  l = s.len()
  n = 0
  for 0..l each i:
    n = n * 10 + number(s[i])
  return n
a = ston(getInput())
b = ston(getInput())
c = ston(getInput())
x = ston(getInput())
ans = 0
for 0..a+1 each i:
  for 0..b+1 each j:
    for 0..c+1 each k:
      if 500 * i + 100 * j + 50 * k == x:
        ans += 1
print ans
```

### Some Sums

``` cy
-- string型をnumber型に変換。
func ston(s):
  l = s.len()
  n = 0
  for 0..l each i:
    n = n * 10 + number(s[i])
  return n
t = getInput().split(' ')
n = ston(t[0])
a = ston(t[1])
b = ston(t[2])
c = 0
for 1..n+1 each i:
  j = i
  s = 0
  while j > 0:
    s += j % 10
    j /= 10
    j = number(int(j))
  if a <= s and s <= b:
    c += i
print c
```
切り捨てがよく分からなかったので、<code>j = number(int(j))</code>としました。

### Card Game for Two

``` cy
-- string型をnumber型に変換。
func ston(s):
  l = s.len()
  n = 0
  for 0..l each i:
    n = n * 10 + number(s[i])
  return n
-- string型をnumber型のlistに変換。
func stoln(s):
  a = []
  for s.split(' ') each i:
    a.append ston(i)
  return a
n = ston(getInput())
a = stoln(getInput())
a.sort((i, j) => i > j)
x = 0
for 0..n each i:
  if i % 2 == 0:
    x += a[i]
  else:
    x -= a[i]
print x
```
昇順ソート…<code>a.sort((i, j) => i < j)</code>
降順ソート…<code>a.sort((i, j) => i > j)</code>

### Kagami Mochi

``` cy
-- string型をnumber型に変換。
func ston(s):
  l = s.len()
  n = 0
  for 0..l each i:
    n = n * 10 + number(s[i])
  return n
-- string型をnumber型のlistに変換。
func stoln(s):
  a = []
  for s.split(' ') each i:
    a.append ston(i)
  return a
cnt = []
for 0..101 each i:
  cnt.append 0
n = ston(getInput())
for 0..n each i:
  a = ston(getInput())
  cnt[a] += 1
ans = 0
for 0..101 each i:
  if cnt[i] > 0:
    ans += 1
print ans
```

### Otoshidama

``` cy
-- string型をnumber型に変換。
func ston(s):
  l = s.len()
  n = 0
  for 0..l each i:
    n = n * 10 + number(s[i])
  return n
t = getInput().split(' ')
n = ston(t[0])
y = ston(t[1])
for 0..n+1 each i:
  for 0..n+1 each j:
    k = n - i - j
    if k >= 0:
      if 10000 * i + 5000 * j + 1000 * k == y:
        print '{i} {j} {k}'
        exit(0)
print '-1 -1 -1'
```
<code>exit(0)</code>も使えます。

### 白昼夢

```
s = getInput()
n = s.len()
dp = []
for 0..n+1 each i:
  dp.append 0
dp[0] = 1
for 0..n+1 each i:
  if i >= 5 and dp[i - 5] == 1 and s[i - 5..i] == 'erase':
    dp[i] = 1
  if i >= 6 and dp[i - 6] == 1 and s[i - 6..i] == 'eraser':
    dp[i] = 1
  if i >= 5 and dp[i - 5] == 1 and s[i - 5..i] == 'dream':
    dp[i] = 1
  if i >= 7 and dp[i - 7] == 1 and s[i - 7..i] == 'dreamer':
    dp[i] = 1
if dp[n] == 1:
  print 'YES'
else:
  print 'NO'
```

部分列は<code>s[i..j]</code>でPythonの<code>s[i:j]</code>の意味になります。

### Traveling

```
-- string型をnumber型に変換。
func ston(s):
  l = s.len()
  n = 0
  for 0..l each i:
    n = n * 10 + number(s[i])
  return n
n = ston(getInput())
nt = 0
nx = 0
ny = 0
for 0..n each i:
  a = getInput().split(' ')
  t = ston(a[0])
  x = ston(a[1])
  y = ston(a[2])
  s = 0
  if x - nx > 0:
    s += x - nx
  else:
    s += nx - x
  if y - ny > 0:
    s += y - ny
  else:
    s += ny - y
  if s % 2 != (t - nt) % 2 or s > t - nt:
    print 'No'
    exit(0)
  nt = t
  nx = x
  ny = y
print 'Yes'
```
absがないのでこうしました。