Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit a9edbba

Browse files
committedOct 28, 2024·
Refactorings based on Steffan153's work
1 parent 4374e99 commit a9edbba

File tree

34 files changed

+145
-314
lines changed

34 files changed

+145
-314
lines changed
 
+1-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
!yamlscript/v0
22

33
defn abbreviate(phrase):
4-
uc(phrase):
5-
.re-seq(/[A-Z']+/)
4+
uc(phrase).re-seq(/[A-Z']+/)
65
.map(first):join
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,9 @@
11
!yamlscript/v0
22

3-
allergen-map =:
4-
zipmap _ range()::
5-
- eggs
6-
- peanuts
7-
- shellfish
8-
- strawberries
9-
- tomatoes
10-
- chocolate
11-
- pollen
12-
- cats
13-
143
defn allergic-to(item score):
15-
bit-test score: allergen-map.$item
4+
list-allergens(score).has?(item)
165

176
defn list-allergens(score):
18-
keep _ allergen-map:
19-
fn([allergen num]):
20-
bit-test(score num) &&& allergen
7+
(0 .. 7).filter(P(bit-test score))
8+
.map(qw(eggs peanuts shellfish strawberries
9+
tomatoes chocolate pollen cats))

‎exercises/practice/anagram/.meta/anagram.ys

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
defn find-anagrams(subject candidates):
44
filter _ candidates:
5-
partial _ subject:
5+
P _ subject:
66
fn(*words):
77
word1 word2 =: words.map(lc)
88
word1 != word2 &&:
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,28 @@
11
!yamlscript/v0
22

3-
account =: atom(nil)
3+
closed =: 'closed'
4+
closed? =: P(== closed)
45

56
defn reset-test-state():
6-
reset! account: nil
77

88
defn bank-account(operations):
9-
last:
10-
for operation operations:
11-
operation
12-
.operation
13-
.str('do-' _)
14-
.call(operation)
15-
16-
defn- do-open(op):
17-
when deref(account):
18-
die: 'account already open'
19-
reset! account: 0
20-
21-
defn- do-close(op):
22-
when-not deref(account):
23-
die: 'account not open'
24-
reset! account: nil
25-
26-
defn- do-balance(op):
27-
balance =: deref(account)
28-
if-not balance:
29-
die: 'account not open'
30-
else: balance
31-
32-
defn- do-deposit(op):
33-
when-not deref(account):
34-
die: 'account not open'
35-
swap! account +: op:get-amount
36-
37-
defn- do-withdraw(op):
38-
balance =: deref(account)
39-
when-not balance:
40-
die: 'account not open'
41-
amount =: op:get-amount
42-
when amount > balance:
43-
die: 'amount must be less than balance'
44-
swap! account -: amount
45-
46-
defn- get-amount(op):
47-
amount =: op.amount
48-
if amount < 0:
49-
die: 'amount must be greater than 0'
50-
else: amount
9+
reduce _ closed operations:
10+
fn(bal op):
11+
case op.operation:
12+
-'open':
13+
if closed?(bal): 0, die('account already open')
14+
-'close':
15+
if closed?(bal): die('account not open'), closed
16+
-'balance':
17+
if closed?(bal): die('account not open'), bal
18+
-'deposit':
19+
cond:
20+
closed?(bal): die('account not open')
21+
op.amount <= 0: die('amount must be greater than 0')
22+
else: bal + op.amount
23+
-'withdraw':
24+
cond:
25+
closed?(bal): die('account not open')
26+
op.amount <= 0: die('amount must be greater than 0')
27+
op.amount > bal: die('amount must be less than balance')
28+
else: bal - op.amount
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
11
!yamlscript/v0
22

33
defn find(array value):
4-
loop low 0, high array.--:
5-
when low > high:
6-
die: 'value not in array'
7-
mid =: (high + low).quot(2)
8-
item =: array.$mid
9-
10-
cond:
11-
value == item : mid
12-
value < item : recur(low mid.--)
13-
else : recur(mid.++ high)
4+
when array.#.!: die('value not in array')
5+
mid =: array.#.--.quot(2)
6+
case compare(array.$mid value):
7+
0: mid
8+
1: find(take(mid array) value)
9+
-1: find(drop(mid.++ array) value) + mid.++

‎exercises/practice/circular-buffer/.meta/circular-buffer.ys

+8-7
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
!yamlscript/v0
22

33
defn run(capacity operations):
4-
buffer =: M(:B V(capacity * [nil]), :P 0)
4+
buffer =: -{:B V(capacity * [nil]), :P 0}
55
reduce _ buffer operations:
66
fn(buffer op):
77
op item pass want =:
@@ -10,14 +10,14 @@ defn run(capacity operations):
1010
args =:
1111
condp eq op:
1212
-'clear' : -[buffer]
13-
-'read' : L(buffer pass want)
14-
-'write' : L(buffer pass item)
15-
-'overwrite' : L(buffer pass item)
13+
-'read' : -[buffer pass want]
14+
-'write' : -[buffer pass item]
15+
-'overwrite' : -[buffer pass item]
1616
value("op-$op"): args*
1717
=>: -{}
1818

1919
defn op-clear(buffer):
20-
M: :B V(buffer.B.# * [nil]) :P 0
20+
hash-map: :B V(buffer.B.# * [nil]) :P 0
2121

2222
defn op-read(buffer pass want):
2323
cell =: buffer.B.nth(buffer.P)
@@ -26,8 +26,9 @@ defn op-read(buffer pass want):
2626
die: S("Can't read:\ " buffer)
2727
when cell != want:
2828
die: "Bad read:\ $cell != $want ($buffer)"
29-
M: :B update-in(buffer.B [buffer.P] constantly(nil))
30-
:P (buffer.P.++ % buffer.B.#)
29+
hash-map:
30+
:B update-in(buffer.B [buffer.P] constantly(nil))
31+
:P (buffer.P.++ % buffer.B.#)
3132

3233
defn op-write(buffer pass item):
3334
B P =: buffer.slice(q(B P))
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
11
!yamlscript/v0
22

33
defn egg-count(number):
4-
loop num number, eggs 0:
5-
if num > 0:
6-
recur: quot(num 2), eggs.add(num % 2)
7-
else: eggs
4+
len: P(bit-test number).filter(0 .. 31)

‎exercises/practice/etl/.meta/etl.ys

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@
33
defn transform(legacy):
44
into {}:
55
for [score letters] legacy, letter letters:
6-
V: lc(letter) score:N
6+
-[lc(letter) score:N]

‎exercises/practice/grains/.meta/grains.ys

+1-2
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,4 @@
33
defn square(square):
44
(1 <= square <= 64) |||:
55
die: 'square must be between 1 and 64'
6-
7-
pow 2: square - 1
6+
2 **: square.--

‎exercises/practice/hamming/.meta/hamming.ys

+1-2
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,4 @@
33
defn distance(strand1 strand2):
44
strand1.# == strand2.# ||:
55
die: 'strands must be of equal length'
6-
7-
len: map(ne strand1 strand2).filter(a)
6+
sum: map(ne strand1 strand2).map(N)
+2-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
11
!yamlscript/v0
22

3-
defn isogram(string):
4-
empty?(string) ||:
5-
lc(string):split \"Want to be case insensitive"
6-
.filter(/^[a-z]$/) \"Keep letters only"
7-
.distinct?(*) \"Check if distinct letters"
3+
defn isogram(phrase):
4+
phrase !~ /(?i)(\w).*\1/

‎exercises/practice/list-ops/.meta/list-ops.ys

+1-7
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,4 @@ defn foldl(list initial function):
1919
list.reduce(function initial)
2020

2121
defn foldr(list initial function):
22-
if len(list) > 0:
23-
function _ list:first:
24-
foldr: rest(list) initial function
25-
else: initial
26-
27-
defn reverse(list):
28-
core/reverse: list
22+
list:reverse.reduce(function initial)

‎exercises/practice/luhn/.meta/luhn.ys

+3-15
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,6 @@
11
!yamlscript/v0
22

33
defn valid(value):
4-
digits =: value.replace(' ')
5-
6-
and:
7-
digits.# >=: 2
8-
digits !~: /[^\d]/
9-
digits:split:
10-
.map(to-num):reverse:V
11-
.conj(0).partition(2)
12-
.map(munge):flat:sum
13-
.mod(10).eq(0)
14-
15-
defn munge([a b]):
16-
b *=: 2
17-
vector a:
18-
if b > 9: (b - 9) b
4+
digits =: value.replace(' ').map(\(_ - \\0)):reverse
5+
digits.#.gt(1) &&: digits.every?(\(0 <= _ <= 9)) &&
6+
map(int.comp(mul) digits [1 2.2]:cycle):sum.mod(10).!
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,8 @@
11
!yamlscript/v0
22

3-
pairs =: reverse('()[]{}'):M
4-
opening =: vals(pairs):set
5-
closing =: keys(pairs):set
6-
73
defn is-paired(value):
8-
loop stack [], [char *chars] value:
9-
cond:
10-
char:nil?: stack:count:zero?
11-
opening(char):
12-
recur: conj(stack char) chars
13-
closing(char):
14-
if peek(stack) == pairs(char):
15-
recur: pop(stack) chars
16-
else: false
17-
else: recur(stack chars)
4+
x =: value.replace(/\[\]|\(\)|\{\}|[^(){}\[\]]/)
5+
cond:
6+
x == '': true
7+
x == value: false
8+
else: is-paired(x)
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,9 @@
11
!yamlscript/v0
22

33
defn prime(number):
4-
lazy-primes().nth(number.--)
5-
6-
defn- lazy-primes(d=2 table={}):
7-
if-let factors table.$d:
8-
recur d.++:
9-
reduce _ table.dissoc(d) factors:
10-
\(update-in(%1 [(%2 + d)] conj %2))
11-
12-
lazy-seq:
13-
cons d:
14-
lazy-primes d.++:
15-
assoc table: sqr(d) [d]
4+
loop n 2, u 0:
5+
cond:
6+
u == number: n.--
7+
range(2 sqrt(n):I.++).every?(\((n % _).?)):
8+
recur(n.++ u.++)
9+
else: recur(n.++ u)
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
!yamlscript/v0
22

3-
nucleotides =: zipmap(qw(A C G T) repeat(0))
4-
53
defn nucleotide-counts(strand):
6-
when strand !~ /^[ACGT]*$/:
4+
when strand =~ /[^ACGT]/:
75
die: 'Invalid nucleotide in strand'
86

9-
reduce-kv _ nucleotides frequencies(strand):
10-
fn(map key val): map.assoc(str(key) val)
7+
into zipmap(qw(A C G T) repeat(0)):
8+
frequencies(strand.map(str))
+1-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
!yamlscript/v0
22

33
defn is-pangram(sentence):
4-
26 ==: lc(sentence)
5-
.replace(/[^a-z]/)
6-
.distinct():len
4+
B: sentence =~ /(?i)(?>.*?(\pL)(?!.*\1)){26}/
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,5 @@
11
!yamlscript/v0
22

33
defn rows(count):
4-
reduce _ [] range(1 count.++):
5-
fn(tri row):
6-
conj tri:
7-
or _ [1]:
8-
when row > 1:
9-
mapv _ (-1 .. row.sub(2)):
10-
\(last(tri).get(_):N.or(0) +
11-
last(tri).get(_.++):N.or(0))
4+
\(mapv + _.cons(0) _.conj(0))
5+
.iterate([1]).take(count)
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
!yamlscript/v0
22

33
defn classify(number):
4-
when number <= 0:
4+
when number < 1:
55
die: 'Classification is only possible for positive integers.'
66

7-
sum-of-divisors =:
8-
sum:
9-
for n range(1 quot(number 2).++) :when (number % n).!: n
7+
nums =:
8+
for n range(1 quot(number 2).++) :when (number % n).!: n
109

11-
case compare(sum-of-divisors, number):
10+
case compare(nums:sum number):
1211
0 :: perfect
1312
1 :: abundant
1413
-1 :: deficient
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,9 @@
11
!yamlscript/v0
22

3-
rules =::
4-
^(?:[aeiou]|yt|xr).*::
5-
\(_ + 'ay')
6-
^(s?qu|thr|sch|[crst]h|[^aeiou])(.*)::
7-
\("$(_.2)$(_.1)ay")
8-
93
defn translate(phrase):
10-
join ' ':
11-
map _ words(phrase):
12-
fn(word):
13-
reduce-kv _ nil rules:
14-
fn(translated regex function):
15-
match =: word =~ qr(regex)
16-
translated ||:
17-
match && function(match)
4+
replace phrase:
5+
/(?x)
6+
([^aeioquxy\s]*
7+
(?:qu|q|x|y)?)
8+
([aeiouxy]\w*)/
9+
"$2$1ay"

‎exercises/practice/prime-factors/.meta/prime-factors.ys

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@ defn factors(value):
44
or _ []:
55
when value >= 2:
66
divisor =: range(2 (value / 2).++)
7-
.filter(\((value % _) == 0)):first || value
7+
.filter(\((value % _).!)).0 || value
88
into [divisor]: factors(quot(value divisor))

‎exercises/practice/protein-translation/.meta/protein-translation.ys

+2-3
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,14 @@
22

33
defn proteins(strand):
44
proteins =:
5-
strand.str('XX').partition(3)
6-
.map(join).map(translate-codon)
5+
strand.re-seq(/.{1,3}/).map(translate)
76
.take-while(ne('STOP'))
87

98
if proteins.has?('INVALID'):
109
die: 'Invalid codon'
1110
else: proteins
1211

13-
defn translate-codon(codon):
12+
defn translate(codon):
1413
case codon:
1514
('AUG' ) :: Methionine
1615
('UUU' 'UUC' ) :: Phenylalanine
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,17 @@
11
!yamlscript/v0
22

33
defn create(queen):
4-
r c =: queen.position.map(qw(row column))
5-
4+
row col =: queen.position.map(qw(row column))
65
cond:
7-
r < 0 : die('row not positive')
8-
r > 7 : die('row not on board')
9-
c < 0 : die('column not positive')
10-
c > 7 : die('column not on board')
11-
else : 0
6+
row < 0 : die('row not positive')
7+
row > 7 : die('row not on board')
8+
col < 0 : die('column not positive')
9+
col > 7 : die('column not on board')
10+
else : 0
1211

1312
defn can-attack(white-queen black-queen):
14-
w-r w-c =: white-queen.position.slice(q(row column))
15-
b-r b-c =: black-queen.position.slice(q(row column))
16-
17-
or:
18-
w-r ==: b-r
19-
w-c ==: b-c
20-
abs(w-r - b-r) ==: abs(w-c - b-c)
13+
x =: white-queen.position.row -
14+
black-queen.position.row
15+
y =: white-queen.position.column -
16+
black-queen.position.column
17+
(x.! || y.!) ||: x:abs == y:abs
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
!yamlscript/v0
22

33
defn convert(number):
4-
ps =: M(3 'Pling' 5 'Plang' 7 'Plong')
5-
words =:
6-
mapcat _ [3 5 7]:
7-
fn(n): number.rem(n).! &&& ps.$n
8-
9-
if words.?: str(words*) str(number)
4+
f =: fn([a b] (number % a).!.when(b))
5+
or?: map(f [3 5 7] qw(Pling Plang Plong)).str(*) number:S
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
11
!yamlscript/v0
22

3-
dna-to-rna =:
4-
map(split ['GCAT' 'CGUA']).zipmap(*)
5-
63
defn to-rna(dna):
7-
split(dna).map(dna-to-rna):join
4+
map(zipmap('GCTA' 'CGAU') dna).str(*)
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,8 @@
11
!yamlscript/v0
22

3-
rules =::
4-
1000: M
5-
900: CM
6-
500: D
7-
400: CD
8-
100: C
9-
90: XC
10-
50: L
11-
40: XL
12-
10: X
13-
9: IX
14-
5: V
15-
4: IV
16-
1: I
17-
183
defn roman(number):
19-
when number > 0:
20-
part letter =:
21-
first:
22-
filter _ rules:
23-
le(number).comp(first)
24-
str letter: roman(number - part)
4+
nums =: qw(I II III IV V VI VII VIII IX).cons('')
5+
reduce _ '' number:S:
6+
fn(roman digit):
7+
roman.map('IVXLC'.zipmap('XLCDM'))
8+
.str(*).str(nums.nth(digit - \\0))
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,6 @@
11
!yamlscript/v0
22

3-
UC =: \\A .. \\Z
4-
LC =: \\a .. \\z
5-
63
defn rotate(text shift-key):
7-
char-map =:
8-
\(zipmap(_ drop(shift-key cycle(_))))
9-
10-
text:
11-
.escape(char-map(UC))
12-
.escape(char-map(LC))
4+
cmap =: \(zipmap(_ drop(shift-key cycle(_))))
5+
text.escape(cmap(\\A .. \\Z)):
6+
.escape(cmap(\\a .. \\z))
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
!yamlscript/v0
22

3-
defn score(word):
4-
uc(word):split.map(
5-
S(1 'AEIOULNRST') + S(2 'DG') + S(3 'BCMP') +
6-
S(4 'FHVWY') + S(5 'K') + S(8 'JX') + S(10 'QZ')
7-
):sum
8-
9-
defn S(score chars):
10-
zipmap: chars:split repeat(score)
3+
scores =: "1332142418513113:11114484:"
4+
defn score(word): !:sum
5+
map _ word:lc:
6+
\((_ - \\a).nth(scores):N - \\0)
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
11
!yamlscript/v0
22

3-
cmds =:: [wink, double blink, close your eyes, jump]
4-
53
defn commands(number):
6-
commands =:
7-
range(cmds.#)
8-
.map(\(number.bit-test(_) && cmds.get(_)))
9-
.filter(a)
10-
11-
if number.bit-test(cmds.#):
12-
commands:reverse
13-
commands
4+
a =: (0 .. 3).filter(bit-test.P(number))
5+
.map(['wink' 'double blink' 'close your eyes' 'jump'])
6+
if number.bit-test(4): a:reverse a
+3-9
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,6 @@
11
!yamlscript/v0
22

33
defn primes(limit):
4-
loop idx 2, primes ([nil nil] + (2 ... limit.++)):
5-
if idx < sqrt(limit):
6-
recur idx.++:
7-
if primes.$idx:
8-
map-indexed _ primes:
9-
fn(a b):
10-
when (a < sqr(idx)) || (a % idx).?: b
11-
else: primes
12-
filter a: primes
4+
nums =: range(2 limit.++)
5+
remove _ nums: !:set
6+
mapcat _ nums: \(range (_ * 2) limit.++ _)
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,16 @@
11
!yamlscript/v0
22

3-
factors =::
4-
Mercury : 0.2408467
5-
Venus : 0.61519726
6-
Earth : 1.0
7-
Mars : 1.8808158
8-
Jupiter : 11.862615
9-
Saturn : 29.447498
10-
Uranus : 84.016846
11-
Neptune : 164.79132
12-
13-
seconds-in-year =: 365.25 * 24 * 60 * 60
3+
s =: 365.25 * 24 * 60 * 60
4+
planets =::
5+
Mercury :: s * 0.2408467
6+
Venus :: s * 0.61519726
7+
Earth :: s * 1.0
8+
Mars :: s * 1.8808158
9+
Jupiter :: s * 11.862615
10+
Saturn :: s * 29.447498
11+
Uranus :: s * 84.016846
12+
Neptune :: s * 164.79132
1413

1514
defn age(planet seconds):
16-
factor =: factors.$planet ||
17-
die('not a planet')
18-
19-
seconds / seconds-in-year / factor:
15+
seconds.div(planets.$planet.or(die('not a planet')))
2016
.format('%.2f'):F
+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
!yamlscript/v0
22

33
defn keep(list predicate):
4-
mapcat \(when(predicate(_) [_])): list
4+
list.filter(predicate)
55

66
defn discard(list predicate):
7-
mapcat \(when-not(predicate(_) [_])): list
7+
list.remove(predicate)
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
!yamlscript/v0
22

33
defn count-words(sentence):
4-
frequencies:
5-
lc(sentence)
6-
.split(/[^a-z0-9']+/)
7-
.map(\(_.replace(/(^'|'$)/)))
8-
.remove(empty?)
4+
frequencies: lc(sentence)
5+
.re-seq(/\w(?:[\w']*\w)?/)
+16-31
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,19 @@
11
!yamlscript/v0
22

33
defn score(dice category):
4-
category.replace(/\ / '-')
5-
.str('do-' _).call(dice).or(0)
6-
7-
defn- do-yacht(dice): eq(dice*) && 50
8-
9-
defn- same-number(n):
10-
fn(dice): dice.filter(eq(n)):sum
11-
12-
do-ones =: same-number(1)
13-
do-twos =: same-number(2)
14-
do-threes =: same-number(3)
15-
do-fours =: same-number(4)
16-
do-fives =: same-number(5)
17-
do-sixes =: same-number(6)
18-
19-
defn- do-full-house(dice):
20-
freqs =: frequencies(dice)
21-
when freqs.#.eq(2) && freqs:vals.has?(2):
22-
sum: dice
23-
24-
defn- do-four-of-a-kind(dice):
25-
freqs =: frequencies(dice):V:reverse:M
26-
mul 4: freqs.get(4) || freqs.get(5) || 0
27-
28-
defn- do-little-straight(dice):
29-
dice:sort == (1 .. 5) &&: 30
30-
31-
defn- do-big-straight(dice):
32-
dice:sort == (2 .. 6) &&: 30
33-
34-
defn- do-choice(dice): sum(dice)
4+
dice-set =: dice:distinct:sort
5+
counts =: dice:frequencies
6+
counts2 =: counts:set/map-invert
7+
case category:
8+
-'yacht': dice-set.#.eq(1).and(50).or(0)
9+
-'choice': dice:sum
10+
-'little straight': dice-set.eq([1 2 3 4 5]).and(30).or(0)
11+
-'big straight': dice-set.eq([2 3 4 5 6]).and(30).or(0)
12+
-'four of a kind': counts2(4 counts2(5 0)) * 4
13+
-'full house': (counts2.2 && counts2.3).and(dice:sum).or(0)
14+
-'ones' : counts(1 0) * 1
15+
-'twos' : counts(2 0) * 2
16+
-'threes': counts(3 0) * 3
17+
-'fours' : counts(4 0) * 4
18+
-'fives' : counts(5 0) * 5
19+
-'sixes' : counts(6 0) * 6

0 commit comments

Comments
 (0)
Please sign in to comment.