- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我不确定如何为我的代码中的特定问题创建算法,所以我创建了这个谜题
.
// A cookie maker for good measure:
function cookieMaker(quant) {
// Fill in your own flavours...
const flavours = [...]
const cookies = []
for(let i = 0; i < quant; i++) {
cookies.push(flavours[Math.floor(Math.random() * flavours.length)])
}
return cookies
}
// This is our function
function pickCookies(monsters) {
...
}
pickCookies([
{
name: 'Fluffy',
cookies: ['choco', 'vanilla', 'blueberry']
},
{
name: 'Pillowpants',
cookies: ['choco', 'vanilla']
},
{
name: 'Pinky',
cookies: ['choco']
}
])
// Should return:
[
{
name: 'Fluffy',
eat: 'blueberry'
},
{
name: 'Pillowpants',
eat: 'vanilla'
},
{
name: 'Pinky',
eat: 'choco'
}
]
// Note, that it should also work if you shuffle the list.
我做了一个list of flavours为您提供 json 格式:
你会如何解决这个难题?
我似乎遗漏了至少一个细节,所以如果您已经开始研究它,我将在此处添加对拼图的任何更改,以免突然更改规则而混淆任何人:
最佳答案
我觉得你的问题很有趣,所以我通过创建这个算法来试一试:
第一枪
var monsters = [{name:'Fluffy'}, {name:'Pillowpants'}, {name:'Pinky'}],
flavors = ['choco', 'vanilla', 'blueberry', 'peanut butter'],
maxNumberOfCookies = 6;
$('#generateBtn').click(generateExample);
generateExample();
function generateExample() {
// Fill each monster's bag
for(var i=0; i<monsters.length; i++) monsters[i].cookies = cookieMaker();
// 3, 2, 1, bon appetit!
var res = pickCookies(monsters);
displayResults(monsters, res);
}
function cookieMaker() {
var cookies = [],
// The quantity is random for each monster
quant = Math.floor(Math.random() * maxNumberOfCookies);
for(var i=0; i<quant; i++) {
cookies.push(flavors[Math.floor(Math.random() * flavors.length)])
}
return cookies;
}
function pickCookies(monsters) {
var res = [];
// List flavors available for each monster
for(var i=0; i<monsters.length; i++) {
var m = monsters[i],
flavorsInBag = [];
for(var j=0; j<m.cookies.length; j++) {
if(flavorsInBag.indexOf(m.cookies[j]) < 0) {
flavorsInBag.push(m.cookies[j]);
}
}
res.push({name: m.name, flavors: flavorsInBag, eat: false});
}
while(!allMonstersAte(res) && !noMoreFlavors(res)) {
// Take the monster with the smallest number of options
var monsterWithLeastFlavors = false;
for(var i=0; i<res.length; i++) {
if(!res[i].flavors.length) continue;
if(!monsterWithLeastFlavors
|| res[i].flavors.length < monsterWithLeastFlavors.flavors.length) {
monsterWithLeastFlavors = res[i];
}
}
// Select the flavor owned by the fewest monsters
var flavorWithLeastOwners = monsterWithLeastFlavors.flavors[0],
fewestNbOfOwners = res.length;
for(var i=0; i<monsterWithLeastFlavors.flavors.length; i++) {
var nbOfOwners = getNbOfOwners(monsterWithLeastFlavors.flavors[i], res);
if(nbOfOwners < fewestNbOfOwners) {
flavorWithLeastOwners = monsterWithLeastFlavors.flavors[i];
fewestNbOfOwners = nbOfOwners;
}
}
makeMonsterEat(monsterWithLeastFlavors, flavorWithLeastOwners, res);
}
return res;
}
// Returns true if all monsters have a property "eat" != false
function allMonstersAte(res) {
return !res.some(function(monster){ return !monster.eat; });
}
// Returns true if all monsters have no flavor left to choose from
function noMoreFlavors(res) {
return !res.some(function(monster){ return monster.flavors.length; });
}
// Returns the number of monsters who have that flavor
function getNbOfOwners(flavor, monsters) {
return monsters.filter(function(monster){
monster.flavors.indexOf(flavor)>-1;
}).length;
}
function makeMonsterEat(monster, flavor, res) {
monster.flavors = [];
monster.eat = flavor;
for(var i=0; i<res.length; i++) {
res[i].flavors = res[i].flavors.filter(function(fl){ return fl != flavor; });
}
}
function displayResults(monsters, res) {
var initial = "";
for(var i=0; i<monsters.length; i++) {
initial += '<b>' + monsters[i].name + '\'s bag contains:</b> '
+ (monsters[i].cookies.length ? monsters[i].cookies.join(', ') : '<span style="color:red">NOTHING</span>') + '<br>';
}
var result = "";
for(var i=0; i<res.length; i++) {
result += '<b>' + res[i].name + ' ate:</b> '
+ (res[i].eat ? res[i].eat : '<span style="color:red">NOTHING</span>')
+ '<br>';
}
$('#result').html('<h2>Initial state</h2>'
+ initial
+ '<h2>Result</h2>'
+ result
);
}
*{margin: 0; padding: 0}
body{font-family: Arial, Helvetica, sans-serif; padding: 1em; font-size: 14px}
h2{font-size: 18px; margin: .3em 0}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="generateBtn">Generate new example</button>
<div id="result"></div>
更实用的方法
我不知道那是不是你想要的,但我试过了......
var monsters = [{name:'Fluffy'}, {name:'Pillowpants'}, {name:'Pinky'}],
flavors = ['choco', 'vanilla', 'blueberry', 'peanut butter'],
maxNumberOfCookies = 6;
$.getJSON('https://cdn.rawgit.com/demux/ad32c612b303aa12d1cdf043225fa1d2/raw/3a037fb7ad30d8a383526ebc62b3671a1656c06d/flavours.json')
.done(init);
function init(data) {
flavors = data;
$('body').html('<button id="generateBtn">Generate new example</button><div id="result"></div>');
$('#generateBtn').click(generateExample);
generateExample();
}
function generateExample() {
// Fill each monster's bag
for (var i = 0; i < monsters.length; i++)
monsters[i].cookies = cookieMaker(Math.floor(Math.random() * maxNumberOfCookies));
// 3, 2, 1, bon appetit!
var res = pickCookies(monsters);
displayResults(monsters, res);
}
function cookieMaker(quant) {
var cookies = [];
for (var i = 0; i < quant; i++) {
cookies.push(flavors[Math.floor(Math.random() * flavors.length)])
}
return cookies;
}
/*
* Returns a new Array of monsters who ate unique cookies
*/
function pickCookies(monsters) {
var res = getMonstersWithFlavors(monsters);
while (!allMonstersAte(res) && !noMoreFlavors(res)) {
var monsterIndex = indexOfMonsterWithLeastFlavors(res),
flavor = flavorWithLeastOwners(res[monsterIndex].flavors, res);
for (var i = 0; i < res.length; i++) {
if (i == monsterIndex) res[i] = makeMonsterEat(res[i], flavor);
else res[i] = removeFlavor(res[i], flavor);
}
}
return res;
}
/*
* Returns a new Array of monsters with their flavors
*/
function getMonstersWithFlavors(monsters) {
return monsters.map(function(monster) {
return {
name: monster.name,
flavors: removeDuplicates(monster.cookies),
eat: false
};
});
}
/*
* Returns a new Array without duplicates
*/
function removeDuplicates(arr) {
return Array.from(new Set(arr));
}
/*
* Returns the index of the monster with least flavors
*/
function indexOfMonsterWithLeastFlavors(monsters) {
var tmp = { monsterIndex: -1, count: false };
for (var i = 0; i < monsters.length; i++) {
if (!monsters[i].flavors.length) continue;
if (!tmp.count || monsters[i].flavors.length < tmp.count) {
tmp = { monsterIndex: i, count: monsters[i].flavors.length };
}
}
return tmp.monsterIndex;
}
/*
* Returns the flavor owned by least monsters
*/
function flavorWithLeastOwners(flavors, monsters) {
var tmp = { flavor: '', count: false };
for (var i = 0; i < flavors.length; i++) {
var nbOfOwners = getNbOfOwners(flavors[i], monsters);
if (!tmp.count || nbOfOwners < tmp.count) {
tmp = { flavor: flavors[i], count: nbOfOwners };
}
}
return tmp.flavor;
}
/*
* Checks if all monsters have a property "eat" != false
*/
function allMonstersAte(res) {
return !res.some(function(monster) {
return !monster.eat;
});
}
/*
* Checks if all monsters have no flavor left to choose from
*/
function noMoreFlavors(res) {
return !res.some(function(monster) {
return monster.flavors.length;
});
}
/*
* Returns the number of monsters who have that flavor
*/
function getNbOfOwners(flavor, monsters) {
return monsters.filter(function(monster) {
monster.flavors.indexOf(flavor) > -1;
}).length;
}
/*
* Returns a new monster Object with the cookie they ate
*/
function makeMonsterEat(monster, flavor) {
return {
name: monster.name,
flavors: [],
eat: flavor
};
}
/*
* Returns a new monster Object without the cookie flavor
*/
function removeFlavor(monster, flavor) {
return {
name: monster.name,
flavors: monster.flavors.filter(function(fl) {
return fl != flavor
}),
eat: monster.eat
};
}
function displayResults(monsters, res) {
var initial = "";
for (var i = 0; i < monsters.length; i++) {
initial += '<b>' + monsters[i].name + '\'s bag contains:</b> ' +
(monsters[i].cookies.length ? monsters[i].cookies.join(', ') : '<span style="color:red">NOTHING</span>') + '<br>';
}
var result = "";
for (var i = 0; i < res.length; i++) {
result += '<b>' + res[i].name + ' ate:</b> ' +
(res[i].eat ? res[i].eat : '<span style="color:red">NOTHING</span>') +
'<br>';
}
$('#result').html('<h2>Initial state</h2>' +
initial +
'<h2>Result</h2>' +
result
);
}
*{margin: 0; padding: 0}
body{font-family: Arial, Helvetica, sans-serif; padding: 1em; font-size: 14px}
h2{font-size: 18px; margin: .3em 0}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<h2>Loading...</h2>
关于javascript - 创建用于分配唯一项目的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38906344/
我有一个应用程序,它会抛出 GKSession 并在各种条件下(连接超时、 session 失败等)创建一个新的 GKSession。不过,我遇到了内存泄漏问题,并且有时会在重新连接几次循环后崩溃。
比如我在宿主代码中有一个浮点指针 float *p 是否可以确定他指向的内存类型(设备/主机)? 最佳答案 在 UVA system 中, 运行时 API 函数 cudaPointerGetAttri
我已将项目转换为 .Net 4.0 并且以下代码不起作用: typeof(RuntimeTypeHandle).GetMethod("Allocate", BindingFlags.Instance
当我声明 char ch = 'ab' 时,ch 只包含 'b',为什么它不存储 'a'? #include int main() { char ch = 'ab'; printf("%c"
我对 Disk Sector 和 Block 有疑问。扇区是一个单位,通常为 512 字节或 1k、2k、4k 等取决于硬件。文件系统 block 大小是一组扇区大小。 假设我正在存储一个 5KB 的
假设我有 8 个人和5000 个苹果。 我想将所有苹果分发给所有 8 个人,这样我就没有苹果了。 但每个人都应该得到不同数量 将它们全部分发出去的最佳方式是什么? 我是这样开始的: let peopl
我正在构建的网站顶部有一个搜索栏。与 Trello 或 Gmail 类似,我希望当用户按下“/”键时,他们的焦点就会转到该搜索框。 我的 JavaScript 看起来像这样: document.onk
我有一小段代码: if (PZ_APP.dom.isAnyDomElement($textInputs)){ $textInputs.on("focus", function(){
我观察到以下行为。 接受了两个属性变量。 @property (nonatomic, retain) NSString *stringOne; @property (nonatomic, assign
我正在解决这样的问题 - 实现一个计算由以下内容组成的表达式的函数以下操作数:“(”、“)”、“+”、“-”、“*”、“/”。中的每个数字表达式可能很大(与由字符串表示的一样大)1000 位)。 “/
我有一组主机和一组任务。 每个主机都有 cpu、mem 和任务容量,每个任务都有 cpu、mem 要求。 每个主机都属于一个延迟类别,并且可以与具有特定延迟值的其他主机通信。 每个任务可能需要以等于或
该程序的作用:从文件中读取一个包含 nrRows 行和 nrColomns 列的矩阵(二维数组)。矩阵的所有元素都是 [0,100) 之间的整数。程序必须重新排列矩阵内的所有元素,使每个元素等于其所在
世界!我有个问题。今天我尝试创建一个代码,它可以找到加泰罗尼亚语号码。但是在我的程序中可以是长数字。我找到了分子和分母。但我不能分割长数字!此外,只有标准库必须在此程序中使用。请帮帮我。这是我的代码
我确定我遗漏了一些明显的东西,但我想在 Objective C 中创建一个 NSInteger 指针的实例。 -(NSInteger*) getIntegerPointer{ NSInteger
这个问题在这里已经有了答案: Difference between self.ivar and ivar? (4 个答案) 关闭 9 年前。
我如何将 v[i] 分配给一系列整数(v 的类型是 vector )而无需最初填充 最佳答案 你的意思是将 std::vector 初始化为一系列整数? int i[] = {1, 2, 3, 4,
我想寻求分配方面的帮助....我把这个作业带到了学校......我必须编写程序来加载一个 G 矩阵和第二个 G 矩阵,并搜索第二个 G 矩阵以获取存在数第一个 G 矩阵的......但是,当我尝试运行
我必须管理资源。它基本上是一个唯一的编号,用于标识交换机中的第 2 层连接。可以有 16k 个这样的连接,因此每次用户希望配置连接时,他/她都需要分配一个唯一索引。同样,当用户希望删除连接时,资源(号
是否有任何通用的命名约定来区分已分配和未分配的字符串?我正在寻找的是希望类似于 us/s 来自 Making Wrong Code Look Wrong ,但我宁愿使用常见的东西也不愿自己动手。 最佳
我需要读取一个 .txt 文件并将文件中的每个单词分配到一个结构中,该结构从结构 vector 指向。我将在下面更好地解释。 感谢您的帮助。 我的程序只分配文件的第一个字... 我知道问题出在函数 i
我是一名优秀的程序员,十分优秀!