YAPC::EU 2018 Glasgow Update!
This commit is contained in:
parent
22f33d4004
commit
4e2d22a71d
1170 changed files with 15042 additions and 3047 deletions
|
|
@ -1,5 +1,7 @@
|
|||
var doors = falses(100)
|
||||
|
||||
for a in 1..100: for b in a..a..100:
|
||||
doors[b] = not doors[b]
|
||||
|
||||
for a in 1..100:
|
||||
print "Door $a is $((doors[a]) ? 'open.': 'closed.')"
|
||||
print "Door $a is ${(doors[a]) ? 'open.': 'closed.'}"
|
||||
|
|
|
|||
125
Task/100-doors/C++/100-doors-4.cpp
Normal file
125
Task/100-doors/C++/100-doors-4.cpp
Normal file
|
|
@ -0,0 +1,125 @@
|
|||
#include <iostream> // compiled with clang (tags/RELEASE_600/final)
|
||||
#include <type_traits> // or g++ (GCC) 7.3.1 20180406 -- from hare1039
|
||||
namespace functional_list // basic building block for template meta programming
|
||||
{
|
||||
struct NIL
|
||||
{
|
||||
using head = NIL;
|
||||
using tail = NIL;
|
||||
friend std::ostream& operator << (std::ostream& os, NIL const) { return os; }
|
||||
};
|
||||
|
||||
template <typename H, typename T = NIL>
|
||||
struct list
|
||||
{
|
||||
using head = H;
|
||||
using tail = T;
|
||||
};
|
||||
|
||||
template <int i>
|
||||
struct integer
|
||||
{
|
||||
static constexpr int value = i;
|
||||
friend std::ostream& operator << (std::ostream& os, integer<i> const) { os << integer<i>::value; return os;}
|
||||
};
|
||||
|
||||
template <typename L, int nTH> constexpr
|
||||
auto at()
|
||||
{
|
||||
if constexpr (nTH == 0)
|
||||
return (typename L::head){};
|
||||
else if constexpr (not std::is_same_v<typename L::tail, NIL>)
|
||||
return at<typename L::tail, nTH - 1>();
|
||||
else
|
||||
return NIL{};
|
||||
}
|
||||
template <typename L, int nTH>
|
||||
using at_t = decltype(at<L, nTH>());
|
||||
|
||||
template <typename L, typename elem> constexpr
|
||||
auto prepend() { return list<elem, L>{}; }
|
||||
|
||||
template <typename L, typename elem>
|
||||
using prepend_t = decltype(prepend<L, elem>());
|
||||
|
||||
template <int Size, typename Dat = integer<0>> constexpr
|
||||
auto gen_list()
|
||||
{
|
||||
if constexpr (Size == 0)
|
||||
return NIL{};
|
||||
else
|
||||
{
|
||||
using next = decltype(gen_list<Size - 1, Dat>());
|
||||
return prepend<next, Dat>();
|
||||
}
|
||||
}
|
||||
template <int Size, typename Dat = integer<0>>
|
||||
using gen_list_t = decltype(gen_list<Size, Dat>());
|
||||
|
||||
} namespace fl = functional_list;
|
||||
|
||||
constexpr int door_amount = 101; // index from 1 to 100
|
||||
|
||||
template <typename L, int current, int moder> constexpr
|
||||
auto construct_loop()
|
||||
{
|
||||
using val_t = fl::at_t<L, current>;
|
||||
if constexpr (std::is_same_v<val_t, fl::NIL>)
|
||||
return fl::NIL{};
|
||||
else
|
||||
{
|
||||
constexpr int val = val_t::value;
|
||||
using val_add_t = fl::integer<val + 1>;
|
||||
using val_old_t = fl::integer<val>;
|
||||
|
||||
if constexpr (current == door_amount)
|
||||
{
|
||||
if constexpr(current % moder == 0)
|
||||
return fl::list<val_add_t>{};
|
||||
else
|
||||
return fl::list<val_old_t>{};
|
||||
}
|
||||
else
|
||||
{
|
||||
using sub_list = decltype(construct_loop<L, current + 1, moder>());
|
||||
if constexpr(current % moder == 0)
|
||||
return fl::prepend<sub_list, val_add_t>();
|
||||
else
|
||||
return fl::prepend<sub_list, val_old_t>();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template <int iteration> constexpr
|
||||
auto construct()
|
||||
{
|
||||
if constexpr (iteration == 1) // door index = 1
|
||||
{
|
||||
using l = fl::gen_list_t<door_amount>;
|
||||
return construct_loop<l, 0, iteration>();
|
||||
}
|
||||
else
|
||||
{
|
||||
using prev_iter_list = decltype(construct<iteration - 1>());
|
||||
return construct_loop<prev_iter_list, 0, iteration>();
|
||||
}
|
||||
}
|
||||
|
||||
template <typename L, int pos> constexpr
|
||||
void show_ans()
|
||||
{
|
||||
if constexpr (std::is_same_v<typename L::head, fl::NIL>)
|
||||
return;
|
||||
else
|
||||
{
|
||||
if constexpr (L::head::value % 2 == 1)
|
||||
std::cout << "Door " << pos << " is opened.\n";
|
||||
show_ans<typename L::tail, pos + 1>();
|
||||
}
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
using result = decltype(construct<100>());
|
||||
show_ans<result, 0>();
|
||||
}
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
import system'routines.
|
||||
import extensions.
|
||||
|
||||
public program =
|
||||
public program
|
||||
[
|
||||
var Doors := Array new:100; populate(:n)( false ).
|
||||
|
||||
|
|
@ -19,4 +19,4 @@ public program =
|
|||
].
|
||||
|
||||
console readChar.
|
||||
].
|
||||
]
|
||||
|
|
|
|||
|
|
@ -1,40 +1,10 @@
|
|||
class Door
|
||||
attr_reader :state
|
||||
|
||||
def initialize
|
||||
@state = :closed
|
||||
end
|
||||
|
||||
def close
|
||||
@state = :closed
|
||||
end
|
||||
|
||||
def open
|
||||
@state = :open
|
||||
end
|
||||
|
||||
def closed?
|
||||
@state == :closed
|
||||
end
|
||||
|
||||
def open?
|
||||
@state == :open
|
||||
end
|
||||
|
||||
def toggle
|
||||
if closed? then open else close end
|
||||
end
|
||||
|
||||
def to_s
|
||||
@state.to_s
|
||||
end
|
||||
end
|
||||
|
||||
doors = Array.new(100) { Door.new }
|
||||
1.upto(100) do |multiplier|
|
||||
doors.each_with_index do |door, i|
|
||||
door.toggle if (i + 1) % multiplier == 0
|
||||
end
|
||||
end
|
||||
|
||||
doors.each_with_index { |door, i| puts "Door #{i+1} is #{door}." }
|
||||
doors = Array.new(101,0)
|
||||
print "Open doors "
|
||||
(1..100).step(){ |i|
|
||||
(i..100).step(i) { |d|
|
||||
doors[d] = doors[d]^= 1
|
||||
if i == d and doors[d] == 1 then
|
||||
print "#{i} "
|
||||
end
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,18 +1,40 @@
|
|||
n = 100
|
||||
Open = "open"
|
||||
Closed = "closed"
|
||||
def Open.toggle
|
||||
Closed
|
||||
end
|
||||
def Closed.toggle
|
||||
Open
|
||||
end
|
||||
doors = [Closed] * (n + 1)
|
||||
for mul in 1..n
|
||||
for x in (mul..n).step(mul)
|
||||
doors[x] = doors[x].toggle
|
||||
class Door
|
||||
attr_reader :state
|
||||
|
||||
def initialize
|
||||
@state = :closed
|
||||
end
|
||||
|
||||
def close
|
||||
@state = :closed
|
||||
end
|
||||
|
||||
def open
|
||||
@state = :open
|
||||
end
|
||||
|
||||
def closed?
|
||||
@state == :closed
|
||||
end
|
||||
|
||||
def open?
|
||||
@state == :open
|
||||
end
|
||||
|
||||
def toggle
|
||||
if closed? then open else close end
|
||||
end
|
||||
|
||||
def to_s
|
||||
@state.to_s
|
||||
end
|
||||
end
|
||||
doors.each_with_index do |b, i|
|
||||
puts "Door #{i} is #{b}" if i > 0
|
||||
|
||||
doors = Array.new(100) { Door.new }
|
||||
1.upto(100) do |multiplier|
|
||||
doors.each_with_index do |door, i|
|
||||
door.toggle if (i + 1) % multiplier == 0
|
||||
end
|
||||
end
|
||||
|
||||
doors.each_with_index { |door, i| puts "Door #{i+1} is #{door}." }
|
||||
|
|
|
|||
|
|
@ -1,4 +1,18 @@
|
|||
n = 100
|
||||
(1..n).each do |i|
|
||||
puts "Door #{i} is #{i**0.5 == (i**0.5).round ? "open" : "closed"}"
|
||||
Open = "open"
|
||||
Closed = "closed"
|
||||
def Open.toggle
|
||||
Closed
|
||||
end
|
||||
def Closed.toggle
|
||||
Open
|
||||
end
|
||||
doors = [Closed] * (n + 1)
|
||||
for mul in 1..n
|
||||
for x in (mul..n).step(mul)
|
||||
doors[x] = doors[x].toggle
|
||||
end
|
||||
end
|
||||
doors.each_with_index do |b, i|
|
||||
puts "Door #{i} is #{b}" if i > 0
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,7 +1,4 @@
|
|||
doors = [false] * 100
|
||||
100.times do |i|
|
||||
(i ... doors.length).step(i + 1) do |j|
|
||||
doors[j] = !doors[j]
|
||||
end
|
||||
n = 100
|
||||
(1..n).each do |i|
|
||||
puts "Door #{i} is #{i**0.5 == (i**0.5).round ? "open" : "closed"}"
|
||||
end
|
||||
puts doors.map.with_index(1){|d,i| "Door #{i} is #{d ? 'open' : 'closed'}."}
|
||||
|
|
|
|||
7
Task/100-doors/Ruby/100-doors-5.rb
Normal file
7
Task/100-doors/Ruby/100-doors-5.rb
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
doors = [false] * 100
|
||||
100.times do |i|
|
||||
(i ... doors.length).step(i + 1) do |j|
|
||||
doors[j] = !doors[j]
|
||||
end
|
||||
end
|
||||
puts doors.map.with_index(1){|d,i| "Door #{i} is #{d ? 'open' : 'closed'}."}
|
||||
28
Task/100-doors/VAX-Assembly/100-doors.vax
Normal file
28
Task/100-doors/VAX-Assembly/100-doors.vax
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
00000064 0000 1 n = 100
|
||||
0000 0000 2 .entry doors, ^m<>
|
||||
26'AF 9F 0002 3 pushab b^arr ; offset signed byte
|
||||
50 64 8F 9A 0005 4 movzbl #n, r0
|
||||
50 DD 0009 5 pushl r0 ; (sp) -> .ascid arr
|
||||
000B 6 10$:
|
||||
51 50 D0 000B 7 movl r0, r1 ; step = start index
|
||||
000E 8 20$:
|
||||
25'AF41 01 8C 000E 9 xorb2 #^a"0" \^a"1", b^arr-1[r1] ; \ xor toggle "1"<->"0"
|
||||
FFF5 51 50 6E F1 0013 10 acbl (sp), r0, r1, 20$ ; limit, step, index
|
||||
EF 50 F5 0019 11 sobgtr r0, 10$ ; n..1
|
||||
001C 12
|
||||
5E DD 001C 13 pushl sp ; descriptor by reference
|
||||
00000000'GF 01 FB 001E 14 calls #1, g^lib$put_output ; show result
|
||||
04 0025 15 ret
|
||||
0026 16
|
||||
30'30'30'30'30'30'30'30'30'30'30'30' 0026 17 arr: .byte ^a"0"[n]
|
||||
30'30'30'30'30'30'30'30'30'30'30'30' 0032
|
||||
30'30'30'30'30'30'30'30'30'30'30'30' 003E
|
||||
30'30'30'30'30'30'30'30'30'30'30'30' 004A
|
||||
30'30'30'30'30'30'30'30'30'30'30'30' 0056
|
||||
30'30'30'30'30'30'30'30'30'30'30'30' 0062
|
||||
30'30'30'30'30'30'30'30'30'30'30'30' 006E
|
||||
30'30'30'30'30'30'30'30'30'30'30'30' 007A
|
||||
30'30'30'30' 0086
|
||||
008A 18 .end doors
|
||||
$ run doors
|
||||
1001000010000001000000001000000000010000000000001000000000000001000000000000000010000000000000000001
|
||||
Loading…
Add table
Add a link
Reference in a new issue