1. Python의 상위 호환(superset)이다. 2. AI 프로그래밍의 불편함을 해소하고자 시작된 프로젝트이다. 3. C++, Rust 등 low 언어 문법과 (high) Python 문법이 혼합되어 있으며(let, var, struct, 메모리 관리 기법 등), 아직 Python 문법을 100% 지원하지는 않는다. 4. Python에서 함수 정의를 위해 사용하는 def 대신 좀더 strict한 fn을 제공한다. 서로 기능은 동일하나, fn 이 def보다 좀 더 limited, controlled 하다고 한다. input, output의 타입은 필수로 명시하는 등.
struct Complex:
var re: Float32
var im: Float32
fn __init__(inout self, x: Float32):
"""Construct a complex number given a real number."""
self.re = x
self.im = 0.0
fn __init__(inout self, r: Float32, i: Float32):
"""Construct a complex number given its real and imaginary components."""
self.re = r
self.im = i
5. Python 대표 모듈은 당연히 사용가능하게끔 지원한다. NumPy, Pandas 등
문서에 나온 예제를 보면 언뜻 다음 느낌을 받을 수 있는데, 물론 자세한 것은 아니고 느낌이 그렇다는 ㅇ 파이썬이 가지고 있는 강점은 살리면서, - 쉬운 문법, 사용자를 바라보는 철학, 다른 라이브러리와의 비교적 쉬운 혼합(binding) ㅇ 파이썬에 존재하는 본질적인 단점을 해결하는 느낌이다. - 시스템 프로그래밍, 타언어에 비해 불안정적인 배포
Docs에 매우 자세하게 많은 것들이 설명돼있으니 시간을 가지고 천천히 전부 읽어보면 도움이 많이 될 것 같다.
물론 아직 신규 언어라 다른 언어 문서에 비하면 내용이 적다고 생각할 수 있지만 기본적으로 파이썬과 C 언어를 읽을 수 있으면, 전부 이해할 수 있을정도로 쉽게 설명해놓았다.
뭔가 다른 언어에 파이썬이 겹쳐있는 느낌이라 매우 흥미롭게 느껴진다. 시간이 지날수록 Mojo가 어떻게 될지, Python은 어떻게 반응할지 엄청 궁금해지는 바이다.
def queensAttack(n, k, r_q, c_q, obstacles):
# Write your code here
if n == 0:
return 0
# Timeout 방지
obs = dict()
if(obstacles):
for ob in obstacles:
obs[ob[0],ob[1]] = 1
row_move = [1, -1, 0, 0, 1, -1, 1, -1]
col_move = [0, 0, -1, 1, -1, -1, 1, 1]
tot_attack = 0
for r_m, c_m in zip(row_move, col_move):
r = r_q + r_m
c = c_q + c_m
while True:
if (r, c) in obs:
break
if r < 1 or r > n or c < 1 or c > n:
break
r += r_m
c += c_m
tot_attack += 1
return tot_attack
def jumpingOnClouds(c):
# Write your code here
current = 0
needed_jump = 0
while current < len(c):
p = current + 1
pp = current + 2
if pp < len(c) and c[pp] != 1:
current = pp
elif p < len(c) and c[p] != 1:
current = p
else:
break
needed_jump += 1
return needed_jump
def repeatedString(s, n):
# Write your code here
s_len = len(s)
if s_len == 1 and s == 'a':
return n
else:
a_num = 0
for i in s:
if i == 'a':
a_num +=1
a_num = a_num * (n // s_len)
if n % s_len != 0:
for i in range(n % s_len):
if s[i] == 'a':
a_num += 1
return a_num
1. K로 나눠지는지를 볼때 두 수의 합은 두 수의 나머지의 합을 봐도 무방함 2. 두 수의 합이므로 K // 2 의 범위에서 떨어지지 않는 수를 찾고, count가 더 많은 수를 더해줌 3. 짝수인 경우엔 하나만 고려해서 더해줌
def nonDivisibleSubset(k, s):
# Write your code here
r = [0] * k
cnt = 0
for i in s:
r[i % k] += 1
for i in range(k//2 + 1):
if i == 0 or k == i * 2:
cnt += bool(r[i])
else:
cnt += max(r[i], r[k - i])
return cnt