Skip to content

Instantly share code, notes, and snippets.

@postspectacular
Created April 17, 2023 07:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save postspectacular/3d970e02570b7dfd32d03d43e1e7e3e0 to your computer and use it in GitHub Desktop.
Save postspectacular/3d970e02570b7dfd32d03d43e1e7e3e0 to your computer and use it in GitHub Desktop.
Bubblemania lottery script
import { parseCSVSimple } from "@thi.ng/csv";
import { readText } from "@thi.ng/file-io";
import { XsAdd, pickRandom } from "@thi.ng/random";
import { split } from "@thi.ng/strings";
import {
comp,
distinct,
map,
mapcat,
push,
repeatedly,
run,
take,
trace,
transduce,
} from "@thi.ng/transducers";
const BASE_DIR = "bubblemania/dev";
const RND = new XsAdd(0xdecafbad);
const NUM = 108;
// CSV row format: address,numtokens
const addresses = transduce(
comp(
mapcat((file) => split(readText(`${BASE_DIR}/${file}`))),
parseCSVSimple({ header: false, cols: [true] }),
map(([addr]) => addr)
),
push(),
// CSV files from: https://fxcollectors.xyz/ as of 2023-04-16T13:55Z
[
"ascii-scape.csv",
"c-scape.csv",
"defrag1.csv",
"defrag2.csv",
"defrag3.csv",
"quasiflock.csv",
]
);
console.log(`loaded ${addresses.length} addresses...`);
console.log(`choosing ${NUM} unique:`);
// pick unique winners
run(
// composed transducer:
comp(
// distinct/unique values only
distinct(),
// max number of results
take(NUM),
// side effect: output to console
trace()
),
// an infinite sequence of random samples using seeded PRNG
repeatedly(() => pickRandom(addresses, RND))
);
loaded 1435 addresses...
choosing 108 unique:
tz1XmqF5gnTjgE6Cxu5CzaT5H7vXiFfihe95
tz1VY543f4YJvbCp2QpgvspvRtP5ucQJi4oZ
tz1c7zSkZF4rJg6xtjhVJ49WQYFpRpGxWkJV
tz1aCn4HgS1s1MkdBpN644RLQbZdSqSbNu3P
tz1dWBh6nhVvEeica4rNhPENSXCuaxuD9LXh
tz2Pkr3QLWYxmJDk4EdpYqhPoUHvMaN25MXp
tz1Y9XuoJJqQgNxVVesix1RLvn2k94JxD92Q
tz1XEVbUyNd5RWZxJHSwVvcvnKbJVRay7zdB
tz1MFmLEzepEwK8Pbxtcyqz6BtBiM7b6jzQH
tz1Z1pDsbfuF7t6fHfbVxhjhouRemXuREpH5
tz1NMvVB48fNzrG3rPZS58Eo1nSJ6p3RjRyz
tz1ikMAhZYa5yon9CTwPQQrcPCPfES2d8u7N
tz1hEuD8ecu6iDUQgW5wqHkqnroHZJJne4UT
tz1feMcGwjomdn1mRCpZh9pgjMkBZkRy7jEZ
tz1TndYkrigS6mQYV6nwRn42Ew9rZqqdVYK7
tz1gigsw3HPNSjpRdaZ6QzTUckg48fopSAGj
tz1LBs6MJLsU38oDLjnmiTCBCA5bpnh17vEr
tz1PE415ckPNF9SD9VrxT2MgL8fpwXSk9F1k
tz1hSXo1U3DMHkPcG86BHKVSXDk9VTAPkzrf
tz1X4sxpgg5X6aag4Mf1TmdWTrDbx3jBFwyT
tz1TJeLZPhHFPfZqSFcxQrpbjU8C2SjwYnqF
tz1ZEoCxEKW6fPZv8LZrpu2N6DBZcCCqMS6v
tz1PaRsvHbYqW82KfH5YSVHuZmZRpJag1Xyg
tz1QSZmv3FkzeK89VuomzxSsb1B8FAseVNb6
tz1g8NW3j9Dy7kyPBA2ZdKUictAcJHCETvV8
tz1Zzbvo3oYCCn9AnMZ4S8ap3FKrSuUj1y55
tz1PYVjdNTcb7i3vGjf3G2eKzG91rKyYmhGp
tz1dDSuGcw1YeARWpKaXt3Vp4htD8szbPCdY
tz1cULHeKAcfTUfwGRgrvyXvZyW3kRayfLg5
tz1Xwa4QkJhg89GWeXP3Z67gDLvYe4DzCK8J
tz2UpRogzuwpqwAeUxsG8hFh2Wfj6JRmfTxv
tz1VrXfxvKDt6r59p4jDBTGavQt1XCgi9a6Y
tz1gBXG9fg8RMDH69KfKqwoTH5sFDmzt5yzm
tz1W4KDcPF9QUWow7jUD7v1TeyC2Sq9HRkQm
tz1cbhmVZuFTKHcACSFpg5ER1bGVGkanhrbW
tz1MwgPYtc8uccvYgEH4gixazzLLgayRipze
tz1Vd1H2BP3pg65KM6cgWzNSgWJK4eYqaTpP
tz1QSxDeUy6YQZj9Q9HZ5couvThGX8Qu7RzY
tz1cWmjFkZzKWsuxKvrkLeS2tEVgzfVVC73b
tz1bGbwHUDw5JF16scd8xavRuhVocxDeVN8V
tz1QQSsCrVfUC2MvMnkMqP847YaHiXfj9Q4q
tz1iCi9BdMEE36L8DjaD9dQjwqLnXFALHXeZ
tz1ZVFxUi2J2YitdsaH2VWJkoG9ZieCEzKxf
tz1iCG8Q6HdpoFhpRvHKkRqFJte9Fn5Bm7gY
tz1N41FtehodrnPFjHPp2iFpCa7tSPFAquS5
tz1YxAN3rn85UQxevF7w78v66xHnSQQByo2j
tz1bVngQWmvDEaWUbmaNkYqxk4fgeDSfm25H
tz1ix73da1BjjkwVEDLw5eonwbsvQ2LmVkL7
tz1Ty8m4fYPwP5F6RKdEm6KjvnDb7GGHoFZY
tz1MiouwFnmidkyQfWJhn4LfQjU8WtaVkXBz
tz1MeHjxmikZDV5JDUjrrr8NTnpKDYMiCZ22
tz1U9ZoiU5HRvQD29kjK1roSUiLDamMrjDJ9
tz1ZR5JKcHzU8Xn5m3w3pMGHiYnHwQNPDkSm
tz1Trg6npgauME1Nb8zkkv7xv7sBdboNUFPP
tz1fNGnLA9icwx1GRMfxnNku6F1RNpt8Vdeq
tz1WpEc471abF9hJHxhZ6YMEYaEysKsvenJD
tz1gQyvkV8ofzcRjUhancM47wK8MuHz6Thzf
tz2VD9n4epuHvd1QH46iwBACyPnvHtUqAJG7
tz1hzYoD8rdHurkCqJ1mHre1EN7DDZw7XecH
tz1TtjfHvauZqR5BexqbvVSVvc9XSULsCqds
tz1cyfd8YLyDRBAS7uWYZHXLKnLwpPzoYbmY
tz1d9YQsTwYGwjp7eaL98TJpR5SDunDcGszo
tz1cS7jMUDbHGjzeyJ9tQMkXjWoYvc3qK555
tz1hbMfZUp8rXXcc82a2aB962JoiGJCebNdF
tz1PeYqYxGSWHFTkoJfJ2gBe9Z35D2826QMN
tz1UFjMLHAxZuBWwUq1Y5PM8fmYrJHNSgNMw
tz1UcXyKMh5CB561T7KVVW5HsSfrRGj1DQmT
tz1Roq6end2LFtkpGrmuyRZH82xsWfaRCat1
tz1RxdMQhHoQKxmtwqEC8h5yLHVghHdEPqEk
tz1c9vgUPbLW7Hgw3GE1Hshh5VGtRBJ24vCY
tz1X4WNCUDbNpLv1bkATcrLUUNDhkVRXAuyh
tz1fGiwg6RdPFw4MCo5MJxn3VMBjJd3xXhmS
tz1PZ5ahr8JFLmuvMFzNj72odJ4Ei462ZUip
tz1Z9s59QUmYTs4NKf48uHhcgeY5wimpFWiX
tz1XBCXNbnBXXqk6tfjqrXoHeMZ922vztNr3
tz1bmPatnVaBa8brRzQ15i4vWzcBtdwJAkbn
tz1cujPvmYdXLoB3JavH88Ypo5X9HPu6Dxfn
tz1LtqGNYcjALxQjDRFAT8cMZHQBrDHxNjFo
tz1Sqhrj49cW9aTuwQrDa4mycnA7n5dDd7rF
tz1MxbRDWkwrkkkUDqSbLDKQfB5sbUVoSEnp
tz1VYfWeGazFmBjtAqcfEnRRs5qp8R8YviS6
tz1TLASCmuA2j9QetwZrXoS3H85WHvNNfXJL
tz1WueXAN4aYR1HjZDpEVCVmVcwVaF7pZPw8
tz1fiKY8mPZipHUvxtaHHNGEtVTCJyhWoRE9
tz1ehhHuAQXrdXukswG2PP7TnptsEfHDxbZK
tz1M2BxFFs3mqQecHE576Xy1mJaMAqSaNFn7
tz1Ruop15fjNSfKQx8APjKJgU3ZiEM6887me
tz1X1ZGcEHn57qnTi3YmAZ2LF5XwZm7qQPwT
tz1fo6yuwzjLDnRh5j4bhC9rPMoFWKJTs8ta
tz1TC4jHjVn5M2rwtrxYJJ91i9A3Uou3d5Bi
tz1PoDdN2oyRyF6DA73zTWAWYhNL4UGr3Egj
tz1RpeazvHnwwzny1LsQXd23bZgWqKR9cGdS
tz1bPMztWzs449CuEmVTY3BprhHMtm4NUQPJ
tz1QgjmhrUD3X7kgS9mMHbUz4cS6uDiFGhAU
tz1YHaPUA5eTJq9NAJcDrZRsXhaDxuGsDNYd
tz1WAVHAc2SP6MSTP5UEPv9J2jwLHjwNpLQe
tz1eeATpjgjcoVcAL9dpjUed94tzmnHyiDHT
tz1eiigTzhNQx4LCC11ced993eQS7kDW13gc
tz1SR5dqLZLUTWVtRMEhE2hovoos2Gb7bmPh
tz1hkF3v99zVxna9ChZzcPdG2iaFGbBESym8
tz1VQVTRYijbXCZQ9dukcRhHbVFYepKZwhAR
tz1cdowmr8kiWZpN5cESMw19bx3Gamupvkji
tz1aXGyiGrRMBsax1aTEid7wBCce1YFvvp1q
tz1Zn99fL2u22sdioKZs3GbV2YRP12ktsiDE
tz1VZrkBPdGjdS1mBHnr6Msu61GszRMGXFYf
tz1URh4MsE1Ld6uvM5ADTbB5n2kXxJwx1BGx
tz1PkLH6efZifS8NtKiZBWFWgDoHDmDwN9f1
tz1X3YaY6TW2s34Gao1jQdcEc7LRqyqfDtzf
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment