为什么现在很难看到一个温柔安静不虚荣不花里胡哨单纯有灵气的姑娘?
刚看到个贴子,网友问:“为什么现在那么难遇到温柔安静、不虚荣、单纯有灵气的姑娘?”这问题挺戳心的。
网友有人说,是因为现在的社会太浮躁了,也有人感叹“好姑娘都被现实磨没了”。但我觉得,关键还在“土壤”不同。
温柔安静的姑娘,多半出自情绪稳定的家庭;不虚荣,要靠从小的眼界和见识;不花里胡哨,是因为审美被熏陶过;单纯有灵气,则要有被善意保护的童年。可现实是,大多数人生活在焦虑、内卷、压力的环境里——父母忙生计、社会比浮华,想长成那样的性子,几乎不可能。
所以,与其感叹“遇不到”,不如先问问自己:你有没有让一个人安然做自己的环境?说到底,真正的温柔不是天生的,而是被温柔对待后才会长出来的。【备注:文末可领最新资料】
面试题:输出比赛匹配对
你们别笑,我真的是昨天晚上十一点多,在公司楼下吹风,手里那杯凉了的美式…脑子里还转着“怎么把一堆选手——奇数也行——配成一轮比赛对儿”。就是那个…怎么说呢…就是把名单变成“A 对 B,C 对 D”,多一个人的给个轮空。顺带我又想起上周羽毛球群赛,一上来就强打强被打懵了,所以我这里顺便加了点“种子靠边、同队尽量别碰”这种小心思,尽量人话讲清楚,别搞学术腔,对吧。
输入是选手列表,可以带可选信息:种子等级、所属队伍。输出一轮“配对表”。如果你要整一整个循环赛(人人都打到),也给你个“圆桌算法”版本。奇数个?插个“BYE”当轮空位,别纠结。
先随机(可设种子,复现用),再把高种子两侧摆,像左右手穿插那种排法,降低强强第一轮硬碰的概率。然后从头到尾两两成对;如果发现“同队内战”,就和后面最近的非同队位置对调一下,别过度追求最优,能躲则躲。循环赛就用经典“轮转法”:固定一个人,其他人像转盘一样转,每一圈就是一轮对阵。这个方法稳、代码也短。
Python我就直接甩了
import random
from typing import List, Dict, Tuple
Player = Dict[str, str] # {"name": "张三", "team": "A", "seed": 1/2/3... 可缺省}
defone_round_pairs(players: List[Player],
seed: int = None) -> List[Tuple[str, str]]:
"""输出一轮配对,尽量避免同队,种子穿插,奇数自动轮空"""
ps = players[:]
rng = random.Random(seed)
# 补一个轮空
if len(ps) % 2 == 1:
ps.append({"name": "BYE", "team": "_", "seed": 10**9})
# 按种子(小优先,缺省当大)+ 随机打散
for p in ps:
p.setdefault("seed", 10**6)
p.setdefault("team", "_")
rng.shuffle(ps)
ps.sort(key=lambda x: x["seed"])
# 种子穿插:前半和后半交叉
mid = len(ps)//2
arranged = []
for a, b in zip(ps[:mid], ps[mid:]):
arranged.extend([a, b])
# 简单避同队:发现同队就和后面最近的不同队换位
defswap_to_avoid(arr):
n = len(arr)
for i in range(0, n, 2):
if arr[i]["team"] == arr[i+1]["team"] and arr[i]["name"] != "BYE"and arr[i+1]["name"] != "BYE":
j = i+2
while j < n:
if arr[j]["team"] != arr[i]["team"] and arr[j]["name"] != "BYE":
arr[i+1], arr[j] = arr[j], arr[i+1]
break
j += 1
return arr
arranged = swap_to_avoid(arranged)
return [(arranged[i]["name"], arranged[i+1]["name"]) for i in range(0, len(arranged), 2)]
defround_robin(players: List[Player]) -> List[List[Tuple[str, str]]]:
"""圆桌法生成全循环赛程(若奇数自动加BYE)"""
names = [p["name"] for p in players]
if len(names) % 2 == 1:
names.append("BYE")
n = len(names)
left = names[:n//2]
right = names[n//2:][::-1]
rounds = []
for _ in range(n-1):
rounds.append(list(zip(left, right)))
# 轮转
pivot_left = left[0]
moved = [left[1]] + [right[0]] + right[1:] + [left[-1]]
left = [pivot_left] + moved[:-n//2]
right = moved[-n//2:][::-1]
return rounds
# 小例子
if __name__ == "__main__":
players = [
{"name": "阿强", "team": "红", "seed": 1},
{"name": "小李", "team": "蓝", "seed": 2},
{"name": "小王", "team": "红"},
{"name": "小赵", "team": "蓝"},
{"name": "阿美", "team": "绿"},
]
print("一轮配对:", one_round_pairs(players, seed=42))
print("循环赛:")
for i, r in enumerate(round_robin(players), 1):
print(f"第{i}轮:", r)
坑
那个…两点说完我就去热饭:第一,避同队这个是启发式,别奢望全局最优,但一般够用;第二,循环赛里有“BYE”的轮次就表示那位休息,计分时别忘了按规矩加分或不加。哦对了,随机种子 seed 要记下来,不然复盘吵不清。行了我先去接个电话…
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领