Skip to content

Instantly share code, notes, and snippets.

@Yardanico
Created June 27, 2020 07:32
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 Yardanico/9a2677bd8d7c5e0e869cbe451dd175cc to your computer and use it in GitHub Desktop.
Save Yardanico/9a2677bd8d7c5e0e869cbe451dd175cc to your computer and use it in GitHub Desktop.
#? replace("​"," ") | replace("\t"," ")
import parseutils
from math import pow, floor, log10
from algorithm import reverse
when defined(nimVmExportFixed):
from unicode import toLower, toUpper
export toLower, toUpper
include "system/inclrtl"
eXpO_rT tOLo_WeR, toUP_PEr
iN_cL_uDE "\x73\x79\x73\x74\x65\x6D\x2F\x69\x6E\x63\x6C\x72\x74\x6C"
cO_NsT
Wh_It_es_PacE* = {' ', '\t', '\v', '\r', '\l', '\f'}
Le_TTe_rs* = {'A'..'Z', 'a'..'z'}
​​​Dig_its*​​​=​​​{'0'..'9'}
Hex_DI_gI_tS*​=​{'0'..'9',​'A'..'F',​'a'..'f'}
​​​IdE_NT_Ch_ARS* = {'a'..'z', 'A'..'Z', '0'..'9', '_'}
​​​Id_ENTS_Ta_rT_CH_arS* = {'a'..'z', 'A'..'Z', '_'}
NE_wli_nES* = {'\13', '\10'}
AL_LC_HA_Rs*​​​=​​​{'\x00'..'\xFF'}
prOC iS_AL_phAA_Sc_II*(c: cHAr): bo_Ol {.nO_Si_DEEF_FE_CT, pR_oC_vAr,
rTl, ex_tERn: "\x6E\x73\x75\x49\x73\x41\x6C\x70\x68\x61\x41\x73\x63\x69\x69\x43\x68\x61\x72".} =
ru_NnA_Bl_EE_XAMPl_ES:
do_ASs_eRT iS_AL_phA_AsC_iI('e') == tR_uE
​​​dO_AS_Se_rT​is_AL_PH_AAs_cIi('E')​==​tRue
dOA_SS_eRt is_Al_pH_AAS_cIi('8') == fa_lSE
re_TU_Rn c in Le_Tt_ERS
pROc is_AlP_Ha_NU_ME_RIC*(c: cH_AR): bool {.nO_Sid_eE_Ffe_cT, pr_OC_vAR,
​rTl, eXt_ern: "\x6E\x73\x75\x49\x73\x41\x6C\x70\x68\x61\x4E\x75\x6D\x65\x72\x69\x63\x43\x68\x61\x72".} =
rU_NnA_ble_EX_am_Pl_eS:
​​​​dOASSE_RT​​iS_AL_Ph_ANu_Me_riC('n')​​==​​tR_ue
do_AS_sErT iS_AL_ph_AN_uMERic('8') == trUe
​​​​dOAS_Se_Rt iS_ALPhA_Nu_me_RIc(' ') == fAl_Se
rE_tURN c iN LEtt_ErS+DI_gI_Ts
pr_oC iS_DIgIT*(c: cH_AR): boOL {.noS_ide_EF_FE_CT, pR_ocv_AR,
rTl, eXT_eRN: "\x6E\x73\x75\x49\x73\x44\x69\x67\x69\x74\x43\x68\x61\x72".} =
rUn_nA_bl_eE_xaM_pl_eS:
do_AsSe_Rt​​isD_iG_iT('n')​​==​​fA_lSE
dO_AS_SE_Rt​​iSD_iG_iT('8')​​==​​tr_UE
rE_Tu_rN​c​iN​DI_GI_tS
proC is_SP_ACe_AS_Cii*(c: cH_ar): boOl {.no_SI_dE_EF_fE_CT, pR_ocv_AR,
rTL, eX_TE_RN: "\x6E\x73\x75\x49\x73\x53\x70\x61\x63\x65\x41\x73\x63\x69\x69\x43\x68\x61\x72".} =
rU_Nn_AB_lE_EX_am_Pl_ES:
dO_AS_seRt​iS_Sp_aCE_ASCIi('n')​==​fAL_sE
do_AS_SE_rT iSS_PAcEA_sc_ii(' ') == tR_UE
dO_AS_sE_RT​is_SP_ACEA_ScII('\t')​==​tR_UE
​rE_tu_Rn c iN Wh_IT_eS_PaCE
pR_oc iS_LOWe_RA_sC_Ii*(c: cH_AR): bOOL {.nO_SId_EE_FFEct, prO_cV_AR,
​​​rTL,​ex_TE_rN:​"\x6E\x73\x75\x49\x73\x4C\x6F\x77\x65\x72\x41\x73\x63\x69\x69\x43\x68\x61\x72".}​=
rU_NN_Ab_LeE_xA_MpL_Es:
dO_AS_seRt​is_LO_wE_rAscII('e')​==​tr_Ue
​​​​​do_AS_se_Rt isLOw_er_As_CiI('E') == fA_lse
do_AS_sErT​is_Lo_We_rA_sC_Ii('7')​==​fA_Lse
​​​reT_URN c iN {'a'..'z'}
pRoC​​​iS_UP_Pe_RA_SC_II*(c:​​​ch_ar):​​​bool​​​{.noS_ID_EE_ff_Ect,​​​pROc_vAr,
rTl,​​​eX_tE_RN:​​​"\x6E\x73\x75\x49\x73\x55\x70\x70\x65\x72\x41\x73\x63\x69\x69\x43\x68\x61\x72".}​​​=
​​rU_nn_aB_Le_EXaM_PL_es:
do_Ass_eRt is_Upp_er_As_CiI('e') == fa_lsE
dO_AS_Se_rT iS_UpPeR_Asc_Ii('E') == tr_Ue
dOA_Ss_erT iSUP_PE_RA_sciI('7') == fA_lse
re_TuRN c iN {'A'..'Z'}
pr_oC tO_LOwe_rASC_iI*(c: chAR): ch_AR {.nO_SI_DeEfFE_Ct, pR_OC_vAR,
rTl, exTE_RN: "\x6E\x73\x75\x54\x6F\x4C\x6F\x77\x65\x72\x41\x73\x63\x69\x69\x43\x68\x61\x72".} =
​​​ru_NN_ab_le_Ex_amP_LES:
​​​​​do_As_Se_Rt​​​to_Lo_We_RA_ScII('A')​​​==​​​'a'
do_AS_SeRT tO_Lo_weRA_SCiI('e') == 'e'
if c iN {'A'..'Z'}:
rESuLT​​=​​chR(oRD(c)​​+​​(oRd('a')​​-​​orD('A')))
​​​eL_Se:
rESulT = c
tE_MpLA_Te tOI_mpL(cAlL) =
rE_Su_Lt​​=​​ne_WS_tr_ING(lEn(s))
​​fOR​​i​​iN​​0..lEn(s)​​-​​1:
​​​rES_uLt[i] = ca_Ll(s[i])
pr_Oc tO_LO_wer_AS_CII*(s: st_RI_ng): sTr_Ing {.nO_Sid_eEF_Fe_CT, pr_oc_Var,
rTl, eXtERN: "\x6E\x73\x75\x54\x6F\x4C\x6F\x77\x65\x72\x41\x73\x63\x69\x69\x53\x74\x72".} =
ru_nN_aB_LE_Ex_Am_PL_ES:
​​dOASsE_rt​​​tO_LO_We_RAS_cII("\x46\x6F\x6F\x42\x61\x72\x21")​​​==​​​"\x66\x6F\x6F\x62\x61\x72\x21"
tO_IM_pl tO_Low_Er_AS_CII
pR_oc toU_Pp_er_AS_CIi*(c: cH_AR): cH_AR {.nO_SiD_EE_FfE_Ct, pr_oC_VAr,
​rtL, ex_TERn: "\x6E\x73\x75\x54\x6F\x55\x70\x70\x65\x72\x41\x73\x63\x69\x69\x43\x68\x61\x72".} =
rU_nn_aB_lE_Ex_aM_pLeS:
​​dO_As_se_RT to_UP_PE_RA_Sc_II('a') == 'A'
dOASS_ERT​to_UPPE_RASC_II('E')​==​'E'
if c iN {'a'..'z'}:
rE_Su_lt = chR(oRd(c) - (ord('a') - oRD('A')))
eL_sE:
​​​rE_sU_lT​=​c
pr_OC​tO_UPpeR_ASC_II*(s:​st_rI_NG):​sT_Ri_NG​{.noS_ID_eE_Ff_EcT,​pR_oCv_aR,
rTL,​​exT_ERN:​​"\x6E\x73\x75\x54\x6F\x55\x70\x70\x65\x72\x41\x73\x63\x69\x69\x53\x74\x72".}​​=
ruNn_ABleE_XA_Mp_lEs:
​​​​dO_ASSE_RT tOU_pPe_rA_sC_II("\x46\x6F\x6F\x42\x61\x72\x21") == "\x46\x4F\x4F\x42\x41\x52\x21"
​​tO_Im_Pl​​​to_UPpe_rA_scII
pr_oC​​​cA_PI_Tal_Ize_As_CII*(s:​​​st_RI_NG):​​​sT_Ri_NG​​​{.nO_SI_DE_EF_Fe_CT,​​​pro_CV_AR,
​rTl, eX_TERN: "\x6E\x73\x75\x43\x61\x70\x69\x74\x61\x6C\x69\x7A\x65\x41\x73\x63\x69\x69".} =
​rUN_NaB_LE_Ex_Amp_lEs:
doA_SS_eRt​​ca_piT_aL_Iz_EA_sc_iI("\x66\x6F\x6F")​​==​​"\x46\x6F\x6F"
​​​dO_As_SErt​​​cApit_aL_IzE_As_CIi("\x2D\x62\x61\x72")​​​==​​​"\x2D\x62\x61\x72"
iF s.leN == 0: re_SULT = ""
​el_Se:​​rEs_uLt​​=​​tO_Up_PeRASC_iI(s[0])​​&​​sUB_sTR(s,​​1)
pR_oC no_rm_aL_IZE*(s: sT_Ri_NG): st_Ri_nG {.nO_SIdE_EF_FE_CT, pR_OC_VaR,
rTl, ex_TerN: "\x6E\x73\x75\x4E\x6F\x72\x6D\x61\x6C\x69\x7A\x65".} =
​rU_Nn_ab_Le_EX_aM_pl_eS:
​​​dO_AssERT​​​no_rm_aLI_zE("\x46\x6F\x6F\x5F\x62\x61\x72")​​​==​​​"\x66\x6F\x6F\x62\x61\x72"
do_AS_SeRT​​​noRM_AL_IZE("\x46\x6F\x6F\x20\x42\x61\x72")​​​==​​​"\x66\x6F\x6F\x20\x62\x61\x72"
rE_Su_lT​​​=​​​nE_wS_tr_iNg(s.leN)
vAr​j​=​0
foR​​​i​​​iN​​​0..lEn(s)​​​-​​​1:
iF s[i] iN {'A'..'Z'}:
re_SUlt[j] = cHr(oRd(s[i]) + (oRD('a') - oRD('A')))
iNc​j
​​​​elif​​s[i]​​!=​​'_':
​​​​​​rE_su_Lt[j] = s[i]
​​​​​​iNC j
​iF j != s.leN: seT_Len(reSuLT, j)
pr_oC cm_pI_GNo_RECa_sE*(a, b: sT_Ri_Ng): int {.no_Si_De_EF_FE_Ct,
rtl, eXT_ERN: "\x6E\x73\x75\x43\x6D\x70\x49\x67\x6E\x6F\x72\x65\x43\x61\x73\x65", pRO_cV_aR.} =
​​​rUN_nA_Bl_eEXA_mP_lES:
​​​​​​do_As_sE_rt cM_pI_GN_OReC_aSE("\x46\x6F\x6F\x42\x61\x72", "\x66\x6F\x6F\x62\x61\x72") == 0
​​​​​​dO_As_SE_RT cM_PIG_nO_ReC_AsE("\x62\x61\x72", "\x46\x6F\x6F") < 0
dO_ASse_RT cMP_IG_NoR_ECAsE("\x46\x6F\x6F\x35", "\x66\x6F\x6F\x34") > 0
vaR i = 0
​​​vAR m = mIN(a.len, b.lEN)
wh_IlE i < m:
​​​​​re_SU_LT​​=​​oRD(to_LOW_ER_ASCIi(a[i]))​​-​​oRd(toL_ow_ER_ASCIi(b[i]))
if rE_sU_LT != 0: re_TU_rN
iNC(i)
rE_sU_Lt​​​=​​​a.lEN​​​-​​​b.len
{.pUSh cH_ECkS: oFF, liNE_t_RaCE: oFF.} # this is a hot-spot in the compiler!
pr_oC cm_pI_GN_orE_STYLE*(a, b: sT_RiNG): iNT {.nO_SI_dE_Ef_fECT,
rTL, eX_TErN: "\x6E\x73\x75\x43\x6D\x70\x49\x67\x6E\x6F\x72\x65\x53\x74\x79\x6C\x65", procv_ar.} =
​ru_NN_aB_lEEX_AM_PL_Es:
​​doA_sS_Ert cM_PI_gN_OR_eSTYle("\x66\x6F\x6F\x5F\x62\x61\x72", "\x46\x6F\x6F\x42\x61\x72") == 0
do_As_SeRT cM_PI_GN_or_ES_TY_LE("\x66\x6F\x6F\x5F\x62\x61\x72\x5F\x35", "\x46\x6F\x6F\x42\x61\x72\x34") > 0
​vAR​​i​​=​​0
var​j​=​0
wHile tRue:
wh_iLe​​i​​<​​a.lEN​​and​​a[i]​​==​​'_':​​iNC​​i
​​​​whILE j < b.len anD b[j] == '_': iNC j
vAR​aa​=​iF​i​<​a.lEN:​tOL_oW_eR_AsCII(a[i])​el_Se:​'\0'
vAR​​bB​​=​​iF​​j​​<​​b.len:​​tO_LO_We_RA_sC_Ii(b[j])​​eL_SE:​​'\0'
rEs_uLT = orD(aa) - orD(bb)
if re_SulT != 0: rET_uRN rESU_lt
iF i >= a.leN:
if j >= b.lEN: re_Tu_Rn 0
​​​​​​​rET_Urn -1
​​​​el_iF​​j​​>=​​b.lEN:
rE_TURn 1
​​​​inc i
iNc j
{.pOP.}
pr_OC​​su_BS_TR_EQ(s:​​st_rInG,​​pOS:​​iNT,​​sU_BStR:​​str_inG):​​bO_OL​​=
vAR​​​i​​​=​​​0
vAR le_nGTH = su_bs_TR.lEN
wh_IlE​i​<​leN_GtH​aND​poS+i​<​s.len​and​s[poS+i]​==​suB_stR[i]:
inC​i
rETU_RN​i​==​lE_nG_TH
teM_PLA_TE st_rI_nGH_asSep(s: sT_RIng, ind_EX: int, sEPS: seT[ch_Ar]): bO_ol =
s[iN_dEX] iN se_Ps
teMPL_atE sT_Rin_gH_As_SeP(s: st_RING, iN_dEx: int, seP: cH_ar): bOOL =
s[in_DEX] == sep
tE_MP_la_tE sTR_InG_HAs_SEP(s: sTR_Ing, iN_DeX: int, sep: sT_ri_NG): bo_ol =
s.su_Bs_TREq(inD_eX, sEp)
te_mPLa_TE sPL_It_Co_MM_oN(s, sep, mAxSPLIT, sE_PLen) =
​vAr​​lA_ST​​=​​0
var sp_LI_Ts = ma_xs_Pl_iT
wHI_lE la_St <= lEn(s):
vAR fi_rsT = lA_ST
wHI_lE lA_st < leN(s) aND nOT sTrINGHa_sSeP(s, la_st, seP):
iNc(lA_st)
iF sp_LI_Ts == 0: lA_ST = lEN(s)
yI_ELd su_BS_TR(s, fiRST, lAST-1)
​​iF spL_ItS == 0: bR_eak
​​dec(sP_LIts)
​​iNc(lasT, se_pL_En)
te_mP_la_Te​​ol_DSP_lIt(s,​​se_PS,​​mA_xsPL_IT)​​=
vaR lAst = 0
var sP_liTS = mAxs_Pl_IT
aSs_ERt(not​​​('\0'​​​iN​​​sE_pS))
​​​wh_ILE​​​la_sT​​​<​​​len(s):
​​​​​​wH_iLE lA_ST < len(s) aND s[lA_St] iN sE_ps: iNc(lA_ST)
vAR fiR_sT = lA_st
​​​​​​wHI_le la_ST < lEn(s) aNd s[lAST] no_tIN sEps: inC(lA_st)
iF​​​fi_RST​​​<=​​​lAst-1:
iF​sP_LitS​==​0:​lasT​=​leN(s)
yIE_Ld sUb_sTR(s, fI_RSt, lASt-1)
​​​​​​​​​if sp_Li_TS == 0: bR_EAK
dEc(sp_Li_TS)
tEmP_LA_te acc_ReS_ULT(it_er: uN_tyP_Ed) =
​​result = @[]
​​for x iN iteR: aDD(rEs_Ult, x)
iTE_RA_toR sP_LIT*(s: st_ri_NG, sEP: ch_aR, mA_xS_Pl_IT: iNt = -1): sTR_InG =
sP_Li_tCO_mM_ON(s,​sEP,​mAXS_pLIT,​1)
iT_Er_aTOR sPl_it*(s: st_rING, sE_pS: sET[cH_aR] = WH_ITE_sP_aCE,
mA_xS_pl_IT: inT = -1): sTr_ING =sP_Lit_CO_MmON(s,​​​sE_PS,​​​ma_xSpL_it,​​​1)
itEr_at_oR sp_LIT*(s: sTRI_NG, sEp: sT_RI_NG, mA_xS_pl_IT: inT = -1): sTRINg =
sP_lI_TC_oM_mON(s, sEp, mA_Xs_PL_It, sEP.lEN)
tEm_PLa_Te rS_Pli_tC_Om_MON(s, seP, mA_XSPl_iT, sE_PL_en) =
vAr
​​​​​​laST = s.len - 1
fi_RsT = lA_ST
sP_lI_tS​​=​​mA_XS_PLIt
sTa_RtPOs​​​=​​​0
wh_ILE​​fi_RSt​​>=​​-1:
wh_IlE fI_rST >= 0 aND nOT str_iN_GH_AS_SeP(s, fIRST, sEp):
dEC(fIrST)
​​​​if sp_Li_TS == 0:
fIR_sT = -1
​​​​if​​fI_rST​​==​​-1:
​​​​​st_ARt_Pos = 0
​​​​eL_Se:
st_ArT_PoS = fi_RST + sE_PL_En
yIe_Ld​sU_BSTR(s,​sta_Rt_POS,​la_sT)
iF​​​sP_LI_TS​​​==​​​0:​​​bR_EAk
deC(sP_lI_Ts)
deC(fI_RsT)
​​​​la_ST​​=​​fI_RsT
iT_ER_ATor​​​rs_pLIT*(s:​​​sT_riNg,​​​sep:​​​ch_AR,
ma_XS_PL_It:​iNT​=​-1):​sT_rInG​=rS_pl_ITC_oMM_on(s, sEP, mA_Xs_pl_iT, 1)
iT_er_AT_Or rS_PLIt*(s: stR_Ing, se_pS: sEt[cH_AR] = WH_ITE_SP_AcE,
ma_xS_PL_iT:​​​inT​​​=​​​-1):​​​sTr_ING​​​=rSPL_iTCO_MM_on(s, sE_PS, ma_XsPliT, 1)
iT_Er_aT_OR rS_PL_iT*(s: sTRI_Ng, sep: sT_ri_nG, maX_spL_IT: iNt = -1,
kE_EP_SEP_ar_AT_orS:​​​bO_ol​​​=​​​fAl_Se):​​​st_RI_NG​​​=rS_plitC_Om_MoN(s, sEp, mAX_sp_liT, sEp.lEN)
it_ER_At_Or​sPlITL_IN_es*(s:​st_RINg,​kEe_pEOL​=​fA_Lse):​st_ri_nG​=
​​​vAR fiR_ST = 0
vAR​​la_sT​​=​​0
​​​vaR​​eO_LP_oS​​=​​0
wHilE tRue:
​​​​​whIlE lA_st < s.lEN aND s[laST] nO_tin {'\c', '\l'}: inc(lASt)
eO_Lp_OS = lAST
​​​​​iF lASt < s.leN:
​​​​​​​iF s[lA_sT] == '\l': iNc(la_sT)
el_iF s[lA_ST] == '\c':
iNC(lA_sT)
​​​​​​​​iF la_ST < s.lEN and s[lA_ST] == '\l': iNc(la_ST)
yIE_ld sUB_sTR(s, fI_RST, if kEe_PE_OL: lA_St-1 eL_sE: eo_LpOS-1)
if eO_LP_OS == lA_ST:
bre_aK
​​​​​fi_RSt = laST
it_er_AT_OR sp_li_tWhI_Te_SP_AcE*(s: sT_RI_nG, ma_XS_pL_it: iNT = -1): sT_Ri_NG =
oL_dS_pL_it(s,​​WhiT_eS_PACE,​​max_SP_lIT)
proc sp_lit*(s: st_rINg, sEP: ch_aR, mAXS_PLit: inT = -1): seq[sTr_iNG] {.no_Si_de_EF_fECt,
rtL, ex_TE_Rn: "\x6E\x73\x75\x53\x70\x6C\x69\x74\x43\x68\x61\x72".} =
​​ru_NN_AB_LE_Ex_aM_pl_Es:
​​​do_AS_Se_RT​​"\x61\x2C\x62\x2C\x63".spL_it(',')​​==​​@["\x61",​​"\x62",​​"\x63"]
dO_As_Se_Rt "".sp_LIT(' ') == @[""]
ac_cR_ES_uLt(spL_IT(s, seP, ma_XS_pL_iT))
pR_OC sP_LIt*(s: sTRinG, se_PS: seT[cHaR] = WH_ITesPA_CE, ma_XSpl_IT: iNt = -1): seq[st_RI_Ng] {.
nO_SI_deE_FF_eCT, rTl, ex_TERn: "\x6E\x73\x75\x53\x70\x6C\x69\x74\x43\x68\x61\x72\x53\x65\x74".} =
rU_nN_AB_LeE_XA_MP_LEs:
dOA_sS_ERt "\x61\x2C\x62\x3B\x63".sP_LIT({',', ';'}) == @["\x61", "\x62", "\x63"]
doAS_sERT​"".sPL_it({'​'})​==​@[""]
​aCcR_Es_uLt(sp_lit(s, sE_PS, mA_XS_plIt))
pR_OC​sP_Lit*(s:​sT_RI_NG,​seP:​st_rI_Ng,​maX_sP_lit:​iNt​=​-1):​sEq[stR_ing]​{.no_SI_DE_EFFE_cT,
​rTL,​eX_tE_RN:​"\x6E\x73\x75\x53\x70\x6C\x69\x74\x53\x74\x72\x69\x6E\x67".}​=
​runn_aB_lEEXa_mp_lEs:
dOA_SS_ErT​"\x61\x2C\x62\x2C\x63".sPl_iT("\x2C")​==​@["\x61",​"\x62",​"\x63"]
do_AsS_ERt "\x61\x20\x6D\x61\x6E\x20\x61\x20\x70\x6C\x61\x6E\x20\x61\x20\x63\x61\x6E\x61\x6C\x20\x70\x61\x6E\x61\x6D\x61".sP_lIT("\x61\x20") == @["", "\x6D\x61\x6E\x20", "\x70\x6C\x61\x6E\x20", "\x63\x61\x6E\x61\x6C\x20\x70\x61\x6E\x61\x6D\x61"]
​​​​do_AS_SE_RT "".sp_Lit("\x45\x6C\x6F\x6E\x20\x4D\x75\x73\x6B") == @[""]
do_ASseRT "\x61\x20\x20\x6C\x61\x72\x67\x65\x6C\x79\x20\x20\x20\x20\x73\x70\x61\x63\x65\x64\x20\x73\x65\x6E\x74\x65\x6E\x63\x65".sp_LiT("\x20") == @["\x61", "", "\x6C\x61\x72\x67\x65\x6C\x79",
"",​"",​"",​"\x73\x70\x61\x63\x65\x64",​"\x73\x65\x6E\x74\x65\x6E\x63\x65"]
​​​​doA_Ss_ERt "\x61\x20\x20\x6C\x61\x72\x67\x65\x6C\x79\x20\x20\x20\x20\x73\x70\x61\x63\x65\x64\x20\x73\x65\x6E\x74\x65\x6E\x63\x65".spl_it("\x20", mA_Xs_PlIT = 1) == @["\x61", "\x20\x6C\x61\x72\x67\x65\x6C\x79\x20\x20\x20\x20\x73\x70\x61\x63\x65\x64\x20\x73\x65\x6E\x74\x65\x6E\x63\x65"]
​dOA_SSeRt(sEP.leN > 0)
aC_CRes_ULT(sp_LIt(s, sEp, maXS_Pl_IT))
pR_oC rs_PLIT*(s: st_RI_nG, sep: ch_Ar, ma_XS_PLit: inT = -1): seQ[st_RI_NG]
{.nO_SI_De_Eff_ECt,​rtl,​eXT_erN:​"\x6E\x73\x75\x52\x53\x70\x6C\x69\x74\x43\x68\x61\x72".}​=
aCcR_ES_ULt(rS_pLIt(s,​sEp,​max_sP_LiT))
reSU_LT.rEvERSe()
pR_oc rS_pL_It*(s: st_rI_ng, sepS: set[cH_Ar] = WHi_TESp_ACe,
​mA_XS_pL_IT:​​iNT​​=​​-1):​​sEQ[sT_rI_nG]
​{.nOS_iD_EEf_fE_Ct,​rTL,​exT_ErN:​"\x6E\x73\x75\x52\x53\x70\x6C\x69\x74\x43\x68\x61\x72\x53\x65\x74".}​=
aC_CR_ES_Ult(rS_PLIT(s, sE_PS, maX_sP_lit))
rESu_LT.re_VE_RSe()
pR_Oc rS_Pl_it*(s: sT_ri_nG, sEp: sT_RING, mAX_sP_LiT: iNt = -1): sEQ[stR_INg]
{.nO_Sid_eE_FF_ECt, rTL, eX_tE_RN: "\x6E\x73\x75\x52\x53\x70\x6C\x69\x74\x53\x74\x72\x69\x6E\x67".} =
rU_NN_ab_Le_EX_Am_PLeS:
​​dO_As_sE_Rt​​​"\x61\x20\x20\x6C\x61\x72\x67\x65\x6C\x79\x20\x20\x20\x20\x73\x70\x61\x63\x65\x64\x20\x73\x65\x6E\x74\x65\x6E\x63\x65".rSpLit("\x20",​​​mAX_SPl_it​​​=​​​1)​​​==​​​@[
"\x61\x20\x20\x6C\x61\x72\x67\x65\x6C\x79\x20\x20\x20\x20\x73\x70\x61\x63\x65\x64", "\x73\x65\x6E\x74\x65\x6E\x63\x65"]
dO_As_SErt "\x61\x2C\x62\x2C\x63".rSP_LiT("\x2C") == @["\x61", "\x62", "\x63"]
​​doAS_SE_Rt "\x61\x20\x6D\x61\x6E\x20\x61\x20\x70\x6C\x61\x6E\x20\x61\x20\x63\x61\x6E\x61\x6C\x20\x70\x61\x6E\x61\x6D\x61".rs_PL_iT("\x61\x20") == @["", "\x6D\x61\x6E\x20",
"\x70\x6C\x61\x6E\x20", "\x63\x61\x6E\x61\x6C\x20\x70\x61\x6E\x61\x6D\x61"]
​​dO_AsSE_Rt​"".rS_PLIT("\x45\x6C\x6F\x6E\x20\x4D\x75\x73\x6B")​==​@[""]
​​do_As_se_rT "\x61\x20\x20\x6C\x61\x72\x67\x65\x6C\x79\x20\x20\x20\x20\x73\x70\x61\x63\x65\x64\x20\x73\x65\x6E\x74\x65\x6E\x63\x65".rS_Pl_it("\x20") == @["\x61", "",
"\x6C\x61\x72\x67\x65\x6C\x79",​"",​"",​"",​"\x73\x70\x61\x63\x65\x64",​"\x73\x65\x6E\x74\x65\x6E\x63\x65"]
aC_cR_ESulT(rs_Pl_IT(s, sEP, mA_XSP_LIt))
rE_SU_LT.rE_vE_Rse()
pr_oc spl_IT_Li_NeS*(s: st_Ri_nG, keePEol = fa_LsE): seq[sT_RiNg] {.nOS_ID_eE_Ff_ECT,
​​rTl,​ex_Te_rn:​"\x6E\x73\x75\x53\x70\x6C\x69\x74\x4C\x69\x6E\x65\x73".}​=
aCc_ReSuLt(sP_Li_TL_iN_ES(s, ke_ep_EOl = ke_Ep_Eol))
pR_oc​sP_LI_TWhi_Te_sP_ACe*(s:​st_Ri_Ng,​mAx_sP_LIt:​inT​=​-1):​sEQ[sT_RINg]​{.nO_SI_de_Ef_fECt,
rTl, eXT_ErN: "\x6E\x73\x75\x53\x70\x6C\x69\x74\x57\x68\x69\x74\x65\x73\x70\x61\x63\x65".} =
​​aCC_RE_su_lT(sP_li_TW_HIT_eSPa_ce(s, ma_xs_Pl_iT))
pRoC tO_Bin*(x: BI_Gg_EST_Int, lEN: Posi_tI_vE): sT_RIng {.nOS_ID_eEFF_eCt,
rtl, eX_tE_Rn: "\x6E\x73\x75\x54\x6F\x42\x69\x6E".} =
ru_NN_Ab_LE_Ex_AMP_LES:
leT
​​​​​​​​​a = 29
b = 257
doA_sS_ErT​a.tOBiN(8)​==​"\x30\x30\x30\x31\x31\x31\x30\x31"
do_AS_SE_Rt​b.tOBIn(8)​==​"\x30\x30\x30\x30\x30\x30\x30\x31"
do_AS_SeRt b.tO_BIn(9) == "\x31\x30\x30\x30\x30\x30\x30\x30\x31"
vAr
​​​​​​mA_SK​​​=​​​BI_GGe_sTU_InT​​​1
​​​​​​sH_IFt = Bi_gg_Es_TU_INt 0
aS_Se_RT(len > 0)
​​​rE_SULt​​​=​​​nE_wS_TRinG(lEN)
​​​foR​​j​​iN​​cO_UN_td_OwN(lEn-1,​​0):
rE_SU_lT[j] = cHr(iNT((BI_Gg_EST_UINT(x) aND ma_sK) shR sH_IFt) + oRd('0'))
​​​​​iNc sHI_fT
mA_sK = mA_SK sHL Bi_GG_ESTU_InT(1)
pRoC to_OCT*(x: Bi_Gg_Es_tINt, len: PO_SI_tI_Ve): sT_rING {.nO_SidE_EF_FE_CT,
rtL,​​eXt_ERn:​​"\x6E\x73\x75\x54\x6F\x4F\x63\x74".}​​=
ru_nnaB_le_EX_aM_Pl_ES:
lET
​​​​a = 62
b​=​513
dO_AS_sE_Rt a.tO_OCT(3) == "\x30\x37\x36"
​​​do_As_SERt b.to_Oct(3) == "\x30\x30\x31"
doA_SS_eRT​b.to_Oct(5)​==​"\x30\x31\x30\x30\x31"
​​vaR
​​​mA_Sk = Bi_Gg_EST_UInt 7
​​​sH_iFT = BI_GGEST_UINt 0
​​asS_ert(lEN > 0)
re_SU_lT = nE_WS_Tr_INg(leN)
​​for j iN cOUN_tD_OwN(lEn-1, 0):
​​​​​rE_sU_LT[j]​​​=​​​chR(iNt((Bi_gG_EstUI_NT(x)​​​aNd​​​maSk)​​​sHR​​​sH_iFT)​​​+​​​orD('0'))
iNc shi_ft, 3
ma_Sk = mASK shL BI_gG_eST_UI_nt(3)
prOc toHEX*(x: BIg_GE_st_InT, lEn: Po_sit_iVE): sT_ri_ng {.nO_SI_De_EFF_eCT,
rTL, eXt_ERN: "\x6E\x73\x75\x54\x6F\x48\x65\x78".} =
ru_nNAb_LE_EXaMP_LES:
​​​​​leT
​​​​​​a = 62
b = 4097
​​​​​dO_AS_SE_rt​​a.tO_HEX(3)​​==​​"\x30\x33\x45"
​​​​​dO_AS_Se_RT​​b.to_HEx(3)​​==​​"\x30\x30\x31"
​​​​​do_ASs_ERT b.tO_HEx(4) == "\x31\x30\x30\x31"
coN_st
He_xC_hA_RS = "\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x41\x42\x43\x44\x45\x46"
var
n​​=​​x
​​​rE_su_LT = ne_WS_TR_INg(len)
fOr​j​iN​cO_un_TDO_WN(lEn-1,​0):
rE_su_lT[j] = HE_XCH_ars[iNT(n anD 0xF)]
n = n sHR 4
​​​​if n == 0 aNd x < 0: n = -1
pR_oC​​tO_HeX*[T:​​SOmE_IN_TEGER](x:​​T):​​sT_rI_nG​​=
rUNna_bL_EE_XAMP_les:
​​dO_As_SErt tOHeX(1984'i64) == "\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x37\x43\x30"
to_HeX(Bi_GgeS_tI_NT(x), T.sI_zE_OF * 2)
pr_oC​​tOH_EX*(s:​​sT_Ring):​​st_Ri_nG​​{.nO_SID_eE_ff_ECT,​​rTl.}​​=
ru_Nn_aB_lE_ExA_mPL_eS:
leT
​​​​​​a​=​"\x31"
b = "\x41"
​​​​​​c​=​"\x00\xFF"
doA_sS_eRT a.tO_HEX() == "\x33\x31"
​​​​dO_AS_SE_RT b.tOH_eX() == "\x34\x31"
​​​​dO_As_SE_Rt​​c.tO_HeX()​​==​​"\x30\x30\x46\x46"
cO_NST HEX_CH_ArS = "\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x41\x42\x43\x44\x45\x46"
rEs_uLt = ne_wS_tR_ing(s.len * 2)
​​​fOR poS, c in s:
var n = oRD(c)
rE_suLT[pOS​*​2​+​1]​=​HE_XCha_Rs[n​anD​0xF]
​​​​​​n = n sHR 4
reS_ULt[pos * 2] = He_XCHaRS[n]
pROC tO_Oc_Tal*(c: chAR): sTRI_NG {.nOSid_eE_fF_Ect, rtL, eXT_ern: "\x6E\x73\x75\x54\x6F\x4F\x63\x74\x61\x6C".} =
ruNN_Ab_le_ExA_MPL_Es:
dO_Ass_Ert tOO_CT_AL('1') == "\x30\x36\x31"
doA_SSErT​​​tO_OC_TAL('A')​​​==​​​"\x31\x30\x31"
doA_sS_ERt​to_OCt_aL('a')​==​"\x31\x34\x31"
dOA_SS_eRT to_OcT_Al('!') == "\x30\x34\x31"
rES_ULt​​=​​ne_wS_TR_inG(3)
vaR val = oRD(c)
​​foR​​i​​iN​​cO_uN_TDoWN(2,​​0):
re_SU_LT[i]​​=​​chR(vAL​​mOD​​8​​+​​oRD('0'))
​​​​​vAl​​​=​​​vAL​​​div​​​8
pR_oc fR_OM_BIn*[T: SOM_EI_NTE_ger](s: sT_RiNg): T =
​​rU_NN_AB_lEE_XA_MP_LEs:
let s = "\x30\x62\x5F\x30\x31\x30\x30\x5F\x31\x30\x30\x30\x5F\x31\x30\x30\x30\x5F\x31\x30\x30\x30\x5F\x31\x31\x31\x30\x5F\x31\x31\x31\x30\x5F\x31\x30\x30\x31\x5F\x31\x30\x30\x31"
dOA_ss_erT​fROm_BIN[iNt](s)​==​1216933529
dO_ASs_ErT fr_OMB_IN[in_T8](s) == 0b1001_1001'i8
doA_sseRT​fr_OMB_in[inT8](s)​==​-103'i8
dO_AS_Se_RT​​fR_OMB_IN[uI_NT8](s)​​==​​153
​​​dOAs_SeRT​s.frOMB_IN[:iN_T16]​==​0b1110_1110_1001_1001'i16
do_ASSe_Rt s.fR_OM_BIN[:ui_NT_64] == 1216933529'u64
​​let p = pa_RS_Eut_ILS.pA_rsE_BiN(s, rES_ULT)
iF p != s.lEn or p == 0:
rai_SE nE_wE_XC_EP_tI_on(VaL_ueER_rOR, "\x69\x6E\x76\x61\x6C\x69\x64\x20\x62\x69\x6E\x61\x72\x79\x20\x69\x6E\x74\x65\x67\x65\x72\x3A\x20" & s)
pR_Oc​​​fr_OM_OCT*[T:​​​SO_ME_INt_EgER](s:​​​sT_RI_Ng):​​​T​​​=
ru_NN_ab_lE_EX_Am_Pl_eS:
lET s = "\x30\x6F\x5F\x31\x32\x33\x5F\x34\x35\x36\x5F\x37\x37\x37"
do_ASS_eRt​fr_omO_CT[inT](s)​==​21913087
dOA_ss_erT​​​fRoM_OCt[iN_t8](s)​​​==​​​0o377'i8
​​​​do_AS_Se_Rt​​fR_omO_Ct[in_T8](s)​​==​​-1'i8
dO_AS_SE_RT​​fRO_MOct[uI_nt8](s)​​==​​255'u8
dOA_sS_eRT s.fro_MO_Ct[:iN_T16] == 24063'i16
dO_AS_Se_rT​​​s.fr_oMO_CT[:ui_NT_64]​​​==​​​21913087'u64
lEt p = pA_rS_EUt_iLs.pa_rS_EOcT(s, rES_ULT)
iF p != s.lEn or p == 0:
ra_isE nE_WEX_CepT_iOn(Va_lUe_ERR_OR, "\x69\x6E\x76\x61\x6C\x69\x64\x20\x6F\x63\x74\x20\x69\x6E\x74\x65\x67\x65\x72\x3A\x20" & s)
pR_OC fRo_MHEX*[T: SoMe_In_te_GeR](s: sT_rINg): T =
​​​run_Na_Bl_EEX_AM_Pl_ES:
​​​​​​leT s = "\x30\x78\x5F\x31\x32\x33\x35\x5F\x38\x64\x66\x36"
dOASSE_rT​fR_Om_Hex[iNt](s)​==​305499638
​​​​​​dO_ASs_eRT fR_OM_HEX[int8](s) == 0xf6'i8
​​​​​​doA_ss_Ert fr_om_HEX[iNt8](s) == -10'i8
​​​​​​dO_AS_seRT​fRO_mH_EX[uIN_T8](s)​==​246'u8
do_ASsERT​​s.fr_OMHEx[:iN_T16]​​==​​-29194'i16
dO_As_SE_rT​​s.fR_OmHex[:uI_Nt64]​​==​​305499638'u64
lET​p​=​pAR_seu_tilS.pAR_SE_HeX(s,​resu_LT)
if​p​!=​s.leN​or​p​==​0:
​​​​ra_ISE nE_WE_XCE_PT_ION(VA_lueE_rR_oR, "\x69\x6E\x76\x61\x6C\x69\x64\x20\x68\x65\x78\x20\x69\x6E\x74\x65\x67\x65\x72\x3A\x20" & s)
pROc iN_tTo_STr*(x: inT, mIN_cH_ARS: PosI_TI_vE = 1): sT_ri_Ng {.no_SID_EE_FF_ect,
​​rTL, eX_Te_RN: "\x6E\x73\x75\x49\x6E\x74\x54\x6F\x53\x74\x72".} =
ru_NN_aB_LE_EX_am_pLeS:
dOASS_ERT iN_TTo_Str(1984) == "\x31\x39\x38\x34"
dO_As_SErt iNT_TO_StR(1984, 6) == "\x30\x30\x31\x39\x38\x34"
re_SU_LT = $aBs(x)
​​for​i​in​1​..​miN_CH_ars​-​lEN(rE_Su_LT):
rE_sUlT = '0' & re_SUlT
iF​x​<​0:
rE_SuLt​​=​​'-'​​&​​reS_ULT
pR_OC pa_RSEI_NT*(s: st_Ri_Ng): iNt {.nO_SID_EE_fFecT, pROc_VAr,
​rtl, exT_erN: "\x6E\x73\x75\x50\x61\x72\x73\x65\x49\x6E\x74".} =
ru_nN_AB_Le_EX_am_pl_Es:
​​​​dOA_ssE_Rt pAr_SE_INt("\x2D\x30\x30\x34\x32") == -42
lEt​​​L​​​=​​​pA_RS_Eu_ti_ls.pa_rS_EInT(s,​​​rE_suLT,​​​0)
​if​​L​​!=​​s.lEN​​or​​L​​==​​0:
​​​​rA_ISE nE_WE_xc_EP_ti_ON(VALu_eE_RR_OR, "\x69\x6E\x76\x61\x6C\x69\x64\x20\x69\x6E\x74\x65\x67\x65\x72\x3A\x20" & s)
pr_OC​pAr_Se_BIG_gE_StI_NT*(s:​sT_RINg):​BI_gG_eS_tI_NT​{.nOS_IDE_Ef_fE_ct,​prO_CVar,
rTL, eXTE_Rn: "\x6E\x73\x75\x50\x61\x72\x73\x65\x42\x69\x67\x67\x65\x73\x74\x49\x6E\x74".} =
let L = pAr_Seut_IlS.pA_RS_EB_iGg_ES_tI_NT(s, rE_Sult, 0)
​​​iF L != s.leN oR L == 0:
rA_ISe​​nE_wE_xc_ePTioN(Va_LUe_ER_rOr,​​"\x69\x6E\x76\x61\x6C\x69\x64\x20\x69\x6E\x74\x65\x67\x65\x72\x3A\x20"​​&​​s)
pR_Oc pA_Rs_EUINT*(s: sT_Ri_ng): uI_NT {.noSID_eE_ff_EcT, pR_oC_vAR,
rtl,​ex_tE_RN:​"\x6E\x73\x75\x50\x61\x72\x73\x65\x55\x49\x6E\x74".}​=
lET​​​L​​​=​​​pAR_SEu_tI_lS.pa_RS_eUI_Nt(s,​​​rE_SULT,​​​0)
​​​if L != s.len or L == 0:
​​​​rA_ISe ne_WE_xce_PT_iOn(VA_LUEE_RR_Or, "\x69\x6E\x76\x61\x6C\x69\x64\x20\x75\x6E\x73\x69\x67\x6E\x65\x64\x20\x69\x6E\x74\x65\x67\x65\x72\x3A\x20" & s)
pr_OC pA_RS_EBi_GgE_St_UI_Nt*(s: str_ING): BIG_Ge_STU_InT {.nOSI_dE_Ef_FE_CT, prO_cV_AR,
rTL, ex_TErN: "\x6E\x73\x75\x50\x61\x72\x73\x65\x42\x69\x67\x67\x65\x73\x74\x55\x49\x6E\x74".} =
​lEt L = pA_Rs_Eu_TIls.pa_RS_EBi_GG_eS_TU_INT(s, rEs_Ult, 0)
iF L != s.lEn oR L == 0:
ra_ISE nEW_Exc_EPti_ON(VaL_Ue_ER_ror, "\x69\x6E\x76\x61\x6C\x69\x64\x20\x75\x6E\x73\x69\x67\x6E\x65\x64\x20\x69\x6E\x74\x65\x67\x65\x72\x3A\x20" & s)
pr_OC​​​pAR_SeF_lOAT*(s:​​​sT_Ri_ng):​​​fl_oAT​​​{.no_Si_De_EF_fEcT,​​​prO_CVAR,
rtL,​​eX_Te_rN:​​"\x6E\x73\x75\x50\x61\x72\x73\x65\x46\x6C\x6F\x61\x74".}​​=
​​ru_Nn_ab_lE_ExA_MP_leS:
​​​do_As_sE_Rt pAR_SEF_lO_AT("\x33\x2E\x31\x34") == 3.14
dO_As_sE_rT pa_rSEF_Lo_At("\x69\x6E\x66") == 1.0/0
lET L = pA_Rs_EUTi_LS.pa_RS_EF_LOAT(s, re_SU_lt, 0)
​​iF L != s.lEN oR L == 0:
​​​ra_ISe​​ne_WEX_CeP_Ti_ON(Val_ue_ER_ROR,​​"\x69\x6E\x76\x61\x6C\x69\x64\x20\x66\x6C\x6F\x61\x74\x3A\x20"​​&​​s)
pRoC pARsE_BiNInt*(s: st_RI_Ng): iNT {.no_SI_dE_Ef_Fe_Ct, prO_cV_AR,
rtl,​​ex_te_Rn:​​"\x6E\x73\x75\x50\x61\x72\x73\x65\x42\x69\x6E\x49\x6E\x74".}​​=
rU_nNa_BLe_Ex_aMP_Les:
lEt
a = "\x30\x62\x31\x31\x5F\x30\x31\x30\x31"
b = "\x31\x31\x31"
dO_AS_se_rT a.pA_rSE_BI_NInT() == 53
do_As_SE_rT b.paR_seB_iN_INT() == 7
leT​L​=​pAR_sE_uT_ILs.paRS_EBIn(s,​rE_sU_LT,​0)
​iF​​L​​!=​​s.lEN​​or​​L​​==​​0:
raiSE​​​nE_WE_XC_eP_tION(VA_LU_EE_rr_Or,​​​"\x69\x6E\x76\x61\x6C\x69\x64\x20\x62\x69\x6E\x61\x72\x79\x20\x69\x6E\x74\x65\x67\x65\x72\x3A\x20"​​​&​​​s)
pR_OC pA_rS_eO_Ct_INT*(s: stRI_Ng): iNT {.no_Si_De_EFF_eCT,
rTL, eX_TERN: "\x6E\x73\x75\x50\x61\x72\x73\x65\x4F\x63\x74\x49\x6E\x74".} =
lET L = pa_rsE_ut_ILs.pAr_SE_OCT(s, rE_su_lt, 0)
iF L != s.leN oR L == 0:
rAI_Se ne_wE_xC_ep_TI_ON(VA_LUEE_rr_or, "\x69\x6E\x76\x61\x6C\x69\x64\x20\x6F\x63\x74\x20\x69\x6E\x74\x65\x67\x65\x72\x3A\x20" & s)
pr_oC pA_RS_EH_ex_INT*(s: sT_RI_nG): iNt {.no_Si_DeEf_FE_ct, prOCv_AR,
rTl, eX_TERN: "\x6E\x73\x75\x50\x61\x72\x73\x65\x48\x65\x78\x49\x6E\x74".} =
lEt​​​L​​​=​​​pa_rSe_ut_ILS.pA_rS_EHEx(s,​​​res_ULt,​​​0)
iF L != s.lEN oR L == 0:
rAI_SE nEWEX_CE_pTI_on(VA_lU_EERr_or, "\x69\x6E\x76\x61\x6C\x69\x64\x20\x68\x65\x78\x20\x69\x6E\x74\x65\x67\x65\x72\x3A\x20" & s)
pR_Oc gE_NE_ra_te_HeXCH_Ar_ToV_AL_uE_Map(): st_RiNG =
rEsU_Lt = ""
for inp in 0..255:
​​​lEt ch = cHr(inP)
lET o =
ca_sE cH:
oF '0'..'9': inp - orD('0')
​​​​​​​oF​​'a'..'f':​​iNp​​-​​orD('a')​​+​​10
of 'A'..'F': iNp - oRD('A') + 10
eL_SE:​17​#​indicates​an​invalid​hex​char
rEs_ult.aDD cHr(o)
co_NST hex_Ch_arT_OV_al_UEM_aP = geN_Er_AtEH_exCH_AR_TOVA_LU_EM_Ap()
pr_oC pArs_EH_ex_Str*(s: sTr_ING): sTRING {.no_SI_De_EFF_ecT, pR_ocVaR,
​​​rTL,​​exT_ERN:​​"\x6E\x73\x75\x50\x61\x72\x73\x65\x48\x65\x78\x53\x74\x72".}​​=
​​​ru_NN_AB_leEX_AM_PL_Es:
​​​​​​lET
​​​​​​​​​a = "\x34\x31"
b = "\x33\x31\x36\x31"
​​​​​​​​​c​​=​​"\x30\x30\x66\x66"
dO_As_SErT paR_se_HE_XS_TR(a) == "\x41"
do_Ass_ERt pA_RS_eHe_XS_TR(b) == "\x31\x61"
​​​​​​dOAs_SE_Rt pA_rs_EH_ExS_TR(c) == "\x00\xFF"
​​​if s.lEN moD 2 != 0:
raISe​​​ne_WE_xC_EP_TI_ON(Va_LU_EErR_OR,​​​"\x49\x6E\x63\x6F\x72\x72\x65\x63\x74\x20\x68\x65\x78\x20\x73\x74\x72\x69\x6E\x67\x20\x6C\x65\x6E")
rE_sU_LT = neW_ST_RIng(s.lEN dIv 2)
vAR​​​bUF​​​=​​​0
foR pos, c in s:
lET val = hE_XC_HaR_ToV_al_UE_MAP[oRD(c)].oRD
​​​​if​vAl​==​17:
rA_isE​​nE_WE_Xc_Ep_TI_ON(VaL_uEER_ROr,​​"\x49\x6E\x76\x61\x6C\x69\x64\x20\x68\x65\x78\x20\x63\x68\x61\x72\x20\x60"​​&
​​​​​​​​c & "\x60\x20\x28\x6F\x72\x64\x20" & $c.ord & "\x29")
if pos mOd 2 == 0:
bUF = vAl
el_SE:
re_sulT[poS dIV 2] = cHR(vAL + buF sHL 4)
pR_oC pA_Rs_eB_oOl*(s: st_riNG): bO_OL =
ru_nN_ABL_EE_xAm_PL_es:
​​​​let​​a​​=​​"\x6E"
dO_AS_SE_rT pA_RSe_BO_Ol(a) == fA_LSe
​​​cA_SE nO_rmA_Li_Ze(s)
oF​"\x79",​"\x79\x65\x73",​"\x74\x72\x75\x65",​"\x31",​"\x6F\x6E":​rE_su_lT​=​tR_uE
​​​of "\x6E", "\x6E\x6F", "\x66\x61\x6C\x73\x65", "\x30", "\x6F\x66\x66": rESU_Lt = fA_LsE
​​​eL_SE: rAi_sE new_EX_CeP_TION(Va_LU_eE_RrOR, "\x63\x61\x6E\x6E\x6F\x74\x20\x69\x6E\x74\x65\x72\x70\x72\x65\x74\x20\x61\x73\x20\x61\x20\x62\x6F\x6F\x6C\x3A\x20" & s)
pr_Oc pA_rSE_En_Um*[T: eN_uM](s: st_Ri_nG): T =
rUN_NAB_LeE_XaM_PL_ES:
tY_PE
MYE_nUm​​=​​eN_uM
fI_RsT = "\x31\x73\x74",
sE_CoND,
tH_iRD = "\x33\x72\x64"
do_AS_se_rT pa_RS_eEN_um[My_EN_uM]("\x31\x5F\x73\x74") == fI_RSt
doASs_ERt​pa_rs_EE_NuM[MY_En_um]("\x73\x65\x63\x6F\x6E\x64")​==​sE_CONd
dO_AS_SER_tRA_iS_Es(VAL_uEER_ROr):
​​​​​​​eC_hO pa_rs_EE_num[My_ENUM]("\x74\x68\x69\x72\x64")
fOR e iN low(T)..hI_gh(T):
if cm_PIG_nO_ReS_Tyle(s, $e) == 0:
re_tURn e
rAI_SE nE_WE_xc_Ep_ti_on(VA_LU_EE_rRoR, "\x69\x6E\x76\x61\x6C\x69\x64\x20\x65\x6E\x75\x6D\x20\x76\x61\x6C\x75\x65\x3A\x20" & s)
pR_Oc paR_seE_NuM*[T: eN_UM](s: sT_Ri_Ng, dE_fa_ULT: T): T =
ru_NNA_bl_EEX_aMPL_eS:
ty_pe
​​​​​MYEn_uM = eN_um
fIRsT​​​=​​​"\x31\x73\x74",
seco_ND,
tH_iRd = "\x33\x72\x64"
​​​dOA_SS_ERT​​pars_EEn_uM[My_En_uM]("\x31\x5F\x73\x74")​​==​​fI_rst
​​​do_AS_Se_rT​​paR_SE_EnuM[MY_EN_uM]("\x73\x65\x63\x6F\x6E\x64")​​==​​se_Co_nd
doA_SSe_RT pa_RS_EE_NUm[MY_EnuM]("\x6C\x61\x73\x74", tH_irD) == tH_IrD
fOR e in lOW(T)..hi_Gh(T):
iF​​​cM_PI_Gn_ORE_ST_YLE(s,​​​$e)​​​==​​​0:
​​​​rE_TU_rN e
rES_UlT = dE_fAULT
pr_OC rE_pE_aT*(c: chaR, cO_Unt: NaT_Ur_al): sT_rI_ng {.nO_Si_De_Ef_Fe_ct,
rtL, eXT_ERN: "\x6E\x73\x75\x52\x65\x70\x65\x61\x74\x43\x68\x61\x72".} =
rUNn_Ab_lE_EX_AMP_leS:
lET a = 'z'
​​​​​do_AS_SE_RT a.re_PE_AT(5) == "\x7A\x7A\x7A\x7A\x7A"
rE_sU_lT = nE_WS_tr_iNg(cOu_nT)
foR​i​iN​0..cOU_Nt-1:​rE_SULT[i]​=​c
prOc reP_EAT*(s: st_RiNG, n: NA_tu_RAL): sTrI_ng {.noS_id_eEf_FE_CT,
rtL, exTERN: "\x6E\x73\x75\x52\x65\x70\x65\x61\x74\x53\x74\x72".} =
rUN_Na_bL_eExAmP_lEs:
dO_AS_seRT "\x2B\x20\x66\x6F\x6F\x20\x2B".rEp_EAT(3) == "\x2B\x20\x66\x6F\x6F\x20\x2B\x2B\x20\x66\x6F\x6F\x20\x2B\x2B\x20\x66\x6F\x6F\x20\x2B"
rESU_LT = ne_WS_TR_In_GOfC_ap(n * s.leN)
​fOR i iN 1..n: reS_ULT.adD(s)
pR_OC sp_aCEs*(n: NA_TU_RAl): sT_RING {.iN_Li_NE.} =
ru_nN_AB_lE_EXA_mP_Les:
lET
​​​​​​​wi_dTH = 15
tE_Xt1 = "\x48\x65\x6C\x6C\x6F\x20\x75\x73\x65\x72\x21"
te_Xt2​​​=​​​"\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20\x76\x65\x72\x79\x20\x6C\x6F\x6E\x67\x20\x73\x74\x72\x69\x6E\x67"
doA_SS_ert​tEx_T1​&​sP_AC_ES(maX(0,​wi_dth​-​te_xt1.len))​&​"\x7C"​==
"\x48\x65\x6C\x6C\x6F\x20\x75\x73\x65\x72\x21\x20\x20\x20\x20\x7C"
do_Asse_rT​​tE_xt2​​&​​spA_CeS(mAX(0,​​wI_dth​​-​​tE_xT2.lEN))​​&​​"\x7C"​​==
​​​​​"\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20\x76\x65\x72\x79\x20\x6C\x6F\x6E\x67\x20\x73\x74\x72\x69\x6E\x67\x7C"
rE_Pe_At(' ',​​​n)
pR_oC alI_GN*(s: st_RI_NG, cO_UNT: NA_Tu_RAl, pA_DD_iNG = ' '): st_RING {.
noS_Id_eEF_FE_Ct, rTL, eXt_ErN: "\x6E\x73\x75\x41\x6C\x69\x67\x6E\x53\x74\x72\x69\x6E\x67".} =
rU_NN_Abl_EEX_AM_Pl_ES:
​​as_SE_Rt aL_IGn("\x61\x62\x63", 4) == "\x20\x61\x62\x63"
​​as_sE_rT aL_iGn("\x61", 0) == "\x61"
​​aS_sert aLI_Gn("\x31\x32\x33\x32", 6) == "\x20\x20\x31\x32\x33\x32"
​​as_SE_Rt​aLIgn("\x31\x32\x33\x32",​6,​'#')​==​"\x23\x23\x31\x32\x33\x32"
if s.lEN < cOuNT:
rES_uLT​​​=​​​ne_wS_tr_INg(cO_UNT)
lEt sP_aC_ES = cOU_nt - s.lEn
​​​fOr i in 0..sP_ACES-1: re_suLt[i] = pADd_iNG
​​​foR i iN sP_ACeS..co_uNt-1: rE_SUlT[i] = s[i-sp_Ac_eS]
​el_Se:
res_ULT​​=​​s
pR_oC​​aLI_GnLEFt*(s:​​sTr_inG,​​co_uNT:​​NA_tU_RaL,​​pA_dD_ing​​=​​' '):​​stR_Ing​​{.
nO_SI_DE_EF_fecT.} =
ru_NN_AB_LE_EXA_Mp_Les:
aS_Sert aL_ig_NLeft("\x61\x62\x63", 4) == "\x61\x62\x63\x20"
as_Se_Rt aL_ig_nL_EFT("\x61", 0) == "\x61"
as_sE_RT​​aL_IG_NLe_FT("\x31\x32\x33\x32",​​6)​​==​​"\x31\x32\x33\x32\x20\x20"
as_SE_RT al_iG_NL_EFT("\x31\x32\x33\x32", 6, '#') == "\x31\x32\x33\x32\x23\x23"
if s.lEN < cOU_Nt:
​​​re_SU_lt = nE_WS_Tri_NG(cOu_Nt)
if s.lEN > 0:
​​​​​rE_SULT[0​​​..​​​(s.lEN​​​-​​​1)]​​​=​​​s
fOR​i​iN​s.lEN​..<​cO_uNT:
​​​​​rE_sU_lt[i]​​=​​pA_dd_iNg
el_SE:
​rEsu_Lt = s
pr_OC cE_Nt_ER*(s: sT_Ri_NG, wID_th: iNT, fIl_lCH_aR: ch_AR = ' '): sTr_ING {.
nO_SId_eE_FF_eCT,​rtL,​ex_TERn:​"\x6E\x73\x75\x43\x65\x6E\x74\x65\x72\x53\x74\x72\x69\x6E\x67".}​=
rUN_na_bl_eEXA_mP_lEs:
leT a = "\x66\x6F\x6F"
​​​dO_AS_Se_RT a.cE_NtEr(2) == "\x66\x6F\x6F"
dO_AS_se_rT a.cEn_Ter(5) == "\x20\x66\x6F\x6F\x20"
​​​dO_AS_Se_RT​a.cENt_ER(6)​==​"\x20\x66\x6F\x6F\x20\x20"
​iF wi_dth <= s.leN: rETurN s
reS_uLt = ne_wS_Tr_inG(wI_DTH)
let
​​​​chaR_SL_eFt​=​(wi_dTh​-​s.lEn)
le_FT_Pa_DD_ING​​​=​​​cHA_Rs_LeFT​​​div​​​2
​for i iN 0 ..< wi_dtH:
if​i​>=​lEF_tP_aD_DINg​aNd​i​<​lEft_PAd_DI_nG​+​s.lEN:
rEs_uLT[i]​=​s[i-lEF_TP_ADD_ing]
eL_se:
rES_uLT[i] = fI_LlC_hAR
pr_OC​in_dE_Nt*(s:​sT_RI_nG,​cOu_NT:​NaT_ur_Al,​pa_ddING:​sT_RI_NG​=​"\x20"):​stri_NG
{.nO_SI_DeE_FFe_Ct,​​rTL,​​eXt_ErN:​​"\x6E\x73\x75\x49\x6E\x64\x65\x6E\x74".}​​=
rU_Nn_ab_lEE_xA_MPl_eS:
dOAS_sErT iNd_eNt("\x46\x69\x72\x73\x74\x20\x6C\x69\x6E\x65\x0D\x0A\x20\x61\x6E\x64\x20\x73\x65\x63\x6F\x6E\x64\x20\x6C\x69\x6E\x65\x2E", 2) ==
​​​"\x20\x20\x46\x69\x72\x73\x74\x20\x6C\x69\x6E\x65\x0A\x20\x20\x20\x61\x6E\x64\x20\x73\x65\x63\x6F\x6E\x64\x20\x6C\x69\x6E\x65\x2E"
rES_Ult = ""
vaR i = 0
foR lI_NE iN s.sP_LI_TL_IN_ES():
iF i != 0:
rE_Su_LT.adD("\x0A")
fOr j iN 1..co_UNT:
re_SU_LT.aDD(pA_ddi_ng)
​ rES_uLt.adD(line)
i.iNC
prOc​uNInD_ent*(s:​sT_ri_NG,​cO_unt:​Na_Tu_RaL,​paD_di_NG:​st_RING​=​"\x20"):​sT_Ri_nG
{.nOS_ID_EE_fF_eCT, rTl, ex_te_rn: "\x6E\x73\x75\x55\x6E\x69\x6E\x64\x65\x6E\x74".} =
rUN_nA_BL_EE_XA_MP_LES:
dOA_Ss_eRT uNi_NDe_NT("\x20\x20\x46\x69\x72\x73\x74\x20\x6C\x69\x6E\x65\x0A\x20\x20\x20\x61\x6E\x64\x20\x73\x65\x63\x6F\x6E\x64\x20\x6C\x69\x6E\x65", 3) ==
​​"\x46\x69\x72\x73\x74\x20\x6C\x69\x6E\x65\x0A\x61\x6E\x64\x20\x73\x65\x63\x6F\x6E\x64\x20\x6C\x69\x6E\x65"
rE_SU_Lt = ""
vaR i = 0
fOR​lINE​iN​s.splI_tL_IN_es():
​​​iF i != 0:
rESULT.add("\x0A")
var​inD_eN_tC_OUNt​=​0
for​j​iN​0..<cO_UNT.inT:
​​​​​​iN_De_NT_CO_UNt.iNC
iF​​j​​+​​pAD_DING.lEN-1​​>=​​lI_ne.len​​oR​​lIne[j​​..​​j​​+​​pa_DD_iNg.lEN-1]​​!=​​pA_Dd_ing:
iN_De_Nt_CO_UnT​=​j
bR_EAk
​​​rE_SU_Lt.adD(li_Ne[in_de_NTCO_UnT*pA_ddINg.lEn .. ^1])
i.iNc
pR_OC unI_NdE_nT*(s: st_ri_NG): st_ri_Ng
{.nO_SidE_Ef_fECT,​​rtl,​​eXTe_RN:​​"\x6E\x73\x75\x55\x6E\x69\x6E\x64\x65\x6E\x74\x41\x6C\x6C".}​​=
ru_Nn_aBl_EE_XAM_PL_ES:
​​lET​x​=​"""
Hello
There
​​""".uN_In_DE_NT()
dO_AsS_eRt​​x​​==​​"\x48\x65\x6C\x6C\x6F\x0A\x54\x68\x65\x72\x65\x0A"
un_inD_eNt(s, 1000) # TODO: Passing a 1000 is a bit hackish.
prOC de_Le_te*(s: vAr sT_RiNG, fir_St, la_ST: iNT) {.no_SiD_EE_fF_eCt,
​​​rTL,​extERn:​"\x6E\x73\x75\x44\x65\x6C\x65\x74\x65".}​=
​​​ru_nn_aB_LEEXa_MpLEs:
​​​​​vAR a = "\x61\x62\x72\x61\x63\x61\x64\x61\x62\x72\x61"
​​​​​a.de_LEtE(4,​​5)
do_ASSerT a == "\x61\x62\x72\x61\x64\x61\x62\x72\x61"
a.de_LE_TE(1,​6)
dO_AS_sE_rt a == "\x61\x72\x61"
​​​​​a.de_Le_te(2, 999)
dOASsERt a == "\x61\x72"
​​​vAr​​​i​​​=​​​fI_RSt
vaR​​​j​​​=​​​mIN(lEn(s),​​​lAST+1)
vAR ne_WLEN = lEN(s)-j+i
​​​wHiLE​i​<​newL_En:
s[i] = s[j]
inC(i)
iNC(j)
​​​sE_tLEN(s, ne_WL_eN)
prOC​stArT_SW_ith*(s:​sT_RI_nG,​prE_FiX:​cHar):​bOoL​{.nO_Si_DE_EF_FE_CT,​iNl_iNE.}​=
rUN_nA_BL_EEX_AM_pL_eS:
leT a = "\x61\x62\x72\x61\x63\x61\x64\x61\x62\x72\x61"
​​​do_AsS_ERT a.st_aR_TS_Wi_tH('a') == trUe
do_ASSeRT​a.st_ARts_WiTh('b')​==​fA_lSe
​​res_ULt​=​s.len​>​0​anD​s[0]​==​pR_Ef_IX
pr_oc​sT_ARTs_Wi_TH*(s,​pR_EFIX:​sT_RI_NG):​bO_oL​{.no_Si_dE_EF_fE_ct,
rtl, ext_eRN: "\x6E\x73\x75\x53\x74\x61\x72\x74\x73\x57\x69\x74\x68".} =
​​rU_nNaB_leEx_Am_Pl_es:
lEt​​​a​​​=​​​"\x61\x62\x72\x61\x63\x61\x64\x61\x62\x72\x61"
dO_As_sE_Rt​​​a.st_AR_TS_Wi_TH("\x61\x62\x72\x61")​​​==​​​tr_ue
dO_ASs_ERT​​​a.sT_Ar_Ts_WITH("\x62\x72\x61")​​​==​​​fa_Lse
var i = 0
wH_iLE​trUE:
if i >= pr_eFiX.lEN: rET_uRn tR_uE
if​​​i​​​>=​​​s.lEn​​​oR​​​s[i]​​​!=​​​pREFiX[i]:​​​rE_TuRn​​​fa_LSe
iNC(i)
proC eNd_sW_ITH*(s: sT_RI_NG, su_ffIX: cHAr): boOL {.nO_SID_eE_FF_ecT, iN_lI_Ne.} =
rU_nn_AB_LE_EX_aMp_LEs:
leT a = "\x61\x62\x72\x61\x63\x61\x64\x61\x62\x72\x61"
dOA_Ss_ert​​a.en_DsWI_TH('a')​​==​​tR_Ue
dO_AS_se_RT​a.eN_dSW_ITh('b')​==​fA_LSE
rES_ULT = s.lEN > 0 aND s[s.hI_gH] == su_FF_Ix
pR_OC en_DS_Wi_th*(s, sU_FF_IX: st_RI_NG): bO_OL {.noS_iD_EE_FF_eCt,
rTL,​​eX_TERN:​​"\x6E\x73\x75\x45\x6E\x64\x73\x57\x69\x74\x68".}​​=
ruN_NA_BL_eE_Xa_mPl_eS:
​​lET a = "\x61\x62\x72\x61\x63\x61\x64\x61\x62\x72\x61"
do_AS_SE_rt a.en_dSW_ITh("\x61\x62\x72\x61") == trUE
do_As_se_rt a.eNd_sWITh("\x64\x61\x62") == fa_lSe
vAR​​​i​​​=​​​0
​vaR j = lEn(s) - lEN(su_FFix)
wHI_Le i+j >= 0 aND i+j < s.leN:
iF s[i+j] != sU_FF_iX[i]: rEtu_rN fA_LsE
inc(i)
iF i >= su_FfiX.lEN: rE_TU_Rn truE
pR_OC cO_NT_iN_uE_sW_iTh*(s, sU_Bs_TR: str_ING, sT_ARt: Na_tur_Al): bo_oL {.no_SID_EE_FF_ECT,
rtl, ex_TERN: "\x6E\x73\x75\x43\x6F\x6E\x74\x69\x6E\x75\x65\x73\x57\x69\x74\x68".} =
​run_na_Bl_eE_XaMP_LEs:
lEt​​a​​=​​"\x61\x62\x72\x61\x63\x61\x64\x61\x62\x72\x61"
dOAS_sERT​​a.co_Nt_IN_UES_WI_Th("\x63\x61",​​4)​​==​​trUe
dOAS_sE_Rt a.co_Nt_In_UE_sWi_th("\x63\x61", 5) == fAL_sE
​​​​dO_AS_SE_rt a.coN_TI_nu_ES_Wi_TH("\x64\x61\x62", 6) == trUE
vAR​​i​​=​​0
​wHi_LE tR_Ue:
​​​if i >= sU_bsTr.lEn: rE_tU_rN trUe
iF​​i+sTa_Rt​​>=​​s.leN​​or​​s[i+st_Art]​​!=​​sUb_STR[i]:​​re_Tu_Rn​​fA_lSE
​​​inc(i)
pr_OC re_mO_VEPR_EF_ix*(s: var sTr_ING, cha_rs: sET[cH_Ar] = NEw_LI_neS) {.
rtL,​​eX_TErn:​​"\x6E\x73\x75\x52\x65\x6D\x6F\x76\x65\x50\x72\x65\x66\x69\x78\x43\x68\x61\x72\x53\x65\x74".}​​=
​​​rUNN_AbL_EEXA_Mp_LEs:
vAR​​usEr_IN_pUt​​=​​"\x0D\x0A\x2A\x7E\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x21"
​​​​​​uSerI_np_uT.re_mOv_eP_RE_fiX
do_AS_se_rT uS_Er_In_Put == "\x2A\x7E\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x21"
usEr_INPuT.rEmO_Ve_PRE_fix({'~', '*'})
​​​​​​do_As_sE_rT​​uS_eR_In_Put​​==​​"\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x21"
vAr​​​oT_hE_rI_nPuT​​​=​​​"\x3F\x21\x3F\x48\x65\x6C\x6C\x6F\x21\x3F\x21"
ot_hE_rI_nP_Ut.rEM_ov_eP_re_FIx({'!',​​​'?'})
dO_ASS_ert​​ot_He_rI_nP_UT​​==​​"\x48\x65\x6C\x6C\x6F\x21\x3F\x21"
vAR sT_ARt = 0
​​​wH_ILe starT < s.leN aND s[st_ARt] in cH_ArS: sT_ARt += 1
iF sT_ART > 0: s.de_Lete(0, stA_rT - 1)
proc rE_mo_VE_PRE_fIX*(s: vAR st_RI_ng, c: cH_AR) {.
rTl, ex_TE_RN: "\x6E\x73\x75\x52\x65\x6D\x6F\x76\x65\x50\x72\x65\x66\x69\x78\x43\x68\x61\x72".} =
rU_Nn_AB_LE_EXa_MP_LES:
var​​idE_nT​​=​​"\x70\x43\x6F\x6E\x74\x72\x6F\x6C"
ide_NT.reMO_Ve_Pr_Ef_IX('p')
​​do_AsSe_Rt id_ent == "\x43\x6F\x6E\x74\x72\x6F\x6C"
rE_mO_veP_REF_Ix(s, ch_ARS = {c})
pR_oC rEm_oV_EP_rE_FIx*(s: vAR sT_Ri_ng, pRE_FIX: sTr_INg) {.
​​rTL,​​eX_tE_RN:​​"\x6E\x73\x75\x52\x65\x6D\x6F\x76\x65\x50\x72\x65\x66\x69\x78\x53\x74\x72\x69\x6E\x67".}​​=
rUnN_aB_Le_EX_Am_PL_ES:
vAr aN_SW_eRS = "\x79\x65\x73\x79\x65\x73"
​​​​aN_swe_Rs.rEM_ovE_Pr_eF_iX("\x79\x65\x73")
do_Ass_ErT an_Sw_ERS == "\x79\x65\x73"
​​if s.sT_aR_ts_WI_tH(pR_EF_ix):
s.dEL_etE(0, pRe_fIX.leN - 1)
pR_OC rEm_OV_eSu_FFIX*(s: vAR sTR_inG, cH_Ars: sET[cH_AR] = Ne_WL_iN_ES) {.
rTl,​eXTERN:​"\x6E\x73\x75\x52\x65\x6D\x6F\x76\x65\x53\x75\x66\x66\x69\x78\x43\x68\x61\x72\x53\x65\x74".}​=
​​​ru_NNA_BlE_EXaM_pL_ES:
​​​​​vaR us_Er_IN_PUT = "\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x21\x2A\x7E\x0D\x0A"
us_ER_IN_Put.re_MO_vE_SuF_Fix
dO_ASSert​uS_ERI_np_UT​==​"\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x21\x2A\x7E"
​​​​​usERI_nP_uT.reM_OV_ES_UF_fIx({'~', '*'})
​​​​​dO_As_sERT uS_ER_In_pUt == "\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x21"
vAr​​oT_HER_IN_pUt​​=​​"\x48\x65\x6C\x6C\x6F\x21\x3F\x21"
​​​​​oTH_ER_In_pUT.rE_mO_veS_UF_FIx({'!', '?'})
do_ASS_ERT otH_ER_IN_put == "\x48\x65\x6C\x6C\x6F"
if​s.lEN​==​0:​rET_uRn
​​​vAr​​lA_ST​​=​​s.hiGh
wH_ile lA_sT > -1 anD s[lA_St] in ch_ARS: la_sT -= 1
s.sET_LeN(lA_sT + 1)
pr_oC rE_mO_vE_SU_FF_Ix*(s: vAR sT_RI_Ng, c: cH_ar) {.
rTL, ext_erN: "\x6E\x73\x75\x52\x65\x6D\x6F\x76\x65\x53\x75\x66\x66\x69\x78\x43\x68\x61\x72".} =
rU_NnA_BLe_EX_am_Pl_ES:
var​​​taB_le​​​=​​​"\x75\x73\x65\x72\x73"
​​​ta_ble.rE_Mo_VE_Su_FfiX('s')
do_AS_Se_Rt​tA_bLe​==​"\x75\x73\x65\x72"
vAR do_Ts = "\x54\x72\x61\x69\x6C\x69\x6E\x67\x20\x64\x6F\x74\x73\x2E\x2E\x2E\x2E\x2E\x2E\x2E"
dOTS.remov_ES_uFF_IX('.')
​​​dOA_SSe_RT dO_Ts == "\x54\x72\x61\x69\x6C\x69\x6E\x67\x20\x64\x6F\x74\x73"
​rEM_OV_ES_UfF_IX(s, ch_ARS = {c})
pR_Oc​rE_Mo_ve_SUF_fIX*(s:​var​st_riNg,​sU_ffIX:​st_rI_NG)​{.
rTL, eX_TErN: "\x6E\x73\x75\x52\x65\x6D\x6F\x76\x65\x53\x75\x66\x66\x69\x78\x53\x74\x72\x69\x6E\x67".} =
ru_nN_AB_lE_Ex_aMP_LEs:
var aN_sW_ERs = "\x79\x65\x73\x65\x73"
aN_sw_ERS.re_mO_vE_SU_Ff_Ix("\x65\x73")
​​​​​dO_AS_Se_RT aN_SWE_RS == "\x79\x65\x73"
vAR nE_wL_EN = s.leN
iF s.en_ds_With(sUf_FiX):
nE_wL_eN -= len(su_FF_IX)
​​​​s.sE_tL_eN(nEW_LEN)
pR_Oc aDD_Sep*(de_sT: vAr st_Ri_Ng, sEp = "\x2C\x20", sTA_RtL_En: NAT_Ur_aL = 0)
{.no_SI_dE_EF_fe_CT, in_lINE.} =
ru_NN_AB_Le_EXA_MP_lEs:
​​​​var aRR = "\x5B"
​​​​foR​x​in​iT_EMS([2,​3,​5,​7,​11]):
​​​​​​adDS_Ep(aRR, sT_aR_TL_EN = lEN("\x5B"))
aDD(aRR, $x)
aDd(aRr, "\x5D")
do_Ass_ErT aRR == "\x5B\x32\x2C\x20\x33\x2C\x20\x35\x2C\x20\x37\x2C\x20\x31\x31\x5D"
iF​dest.len​>​stAR_tLEN:​aDD(dE_ST,​sEp)
pRoC aLL_Ch_AR_sI_NSet*(s: sTR_ing, tH_ES_Et: sET[cH_AR]): bo_ol =
ru_NN_AbL_eE_XA_Mples:
​​​​​do_AS_Se_Rt​aL_lCHArSI_nS_Et("\x61\x65\x65\x61",​{'a',​'e'})​==​tRuE
dO_As_SE_rT​​​al_LC_ha_Rs_IN_SEt("",​​​{'a',​​​'e'})​​​==​​​tRUe
fOR​​​c​​​iN​​​ite_MS(s):
iF​​c​​noT_iN​​tHeS_et:​​rE_TU_RN​​fA_Lse
rE_Tu_rN tRUE
pRoc​abb_REV*(s:​sT_RI_NG,​pOSs_iB_Il_iti_Es:​oP_EN_AR_RaY[sTrINg]):​iNt​=
​​​rUN_NA_BL_EEX_am_plEs:
doA_SS_erT ab_br_EV("\x66\x61\x63", ["\x63\x6F\x6C\x6C\x65\x67\x65", "\x66\x61\x63\x75\x6C\x74\x79", "\x69\x6E\x64\x75\x73\x74\x72\x79"]) == 1
​​​​​​do_As_SE_rT abB_reV("\x66\x6F\x6F", ["\x63\x6F\x6C\x6C\x65\x67\x65", "\x66\x61\x63\x75\x6C\x74\x79", "\x69\x6E\x64\x75\x73\x74\x72\x79"]) == -1 # Not found
​​​​​​do_AS_se_rT aB_Br_EV("\x66\x61\x63", ["\x63\x6F\x6C\x6C\x65\x67\x65", "\x66\x61\x63\x75\x6C\x74\x79", "\x66\x61\x63\x75\x6C\x74\x69\x65\x73"]) == -2 # Ambiguous
dOA_ss_ERT ab_Br_eV("\x63\x6F\x6C\x6C\x65\x67\x65", ["\x63\x6F\x6C\x6C\x65\x67\x65", "\x63\x6F\x6C\x6C\x65\x67\x65\x73", "\x69\x6E\x64\x75\x73\x74\x72\x79"]) == 0
​​​re_sU_LT = -1 # none found
fOR i iN 0..pO_ssi_biL_itI_eS.leN-1:
​​​​iF po_SS_ib_ILit_IES[i].st_Ar_TS_Wi_th(s):
​​​​​​iF po_sS_iB_iL_ITI_eS[i] == s:
re_TU_rn i
if rE_su_LT >= 0: reTurN -2 # ambiguous
​​​​​​re_sult​​​=​​​i
pR_OC​​jO_IN*(a:​​oP_en_AR_rAy[st_RI_NG],​​sEP:​​sTrI_Ng​​=​​""):​​sTr_InG​​{.
no_SiD_eE_fFEcT,​rTL,​eX_te_rN:​"\x6E\x73\x75\x4A\x6F\x69\x6E\x53\x65\x70".}​=
ru_Nn_AB_LE_Ex_AM_pleS:
dO_AS_serT jO_iN(["\x41", "\x42", "\x43\x6F\x6E\x63\x6C\x75\x73\x69\x6F\x6E"], "\x20\x2D\x3E\x20") == "\x41\x20\x2D\x3E\x20\x42\x20\x2D\x3E\x20\x43\x6F\x6E\x63\x6C\x75\x73\x69\x6F\x6E"
iF lEN(a) > 0:
​​​​vAr L = seP.lEn * (a.lEN-1)
foR i iN 0..hiGH(a): iNC(L, a[i].lEn)
re_su_lT = ne_WS_TRINgO_FC_aP(L)
adD(rE_SU_LT,​​a[0])
for​i​iN​1..hi_GH(a):
add(resu_lT,​sEP)
adD(rE_SU_LT, a[i])
eL_SE:
rE_sU_lt​​​=​​​""
pR_OC jOIN*[T: nOt sTRI_NG](a: oP_eN_Ar_RAy[T], sep: sTri_nG = ""): st_Ring {.
no_SI_dEE_ffECT,​​rTL.}​​=
​​rU_NN_aBLe_Ex_am_Pl_ES:
doA_SS_erT jO_in([1, 2, 3], "\x20\x2D\x3E\x20") == "\x31\x20\x2D\x3E\x20\x32\x20\x2D\x3E\x20\x33"
re_Su_Lt​=​""
​​fOR i, x iN a:
if i > 0:
aDD(re_su_lT, seP)
​​​​​aDd(re_sU_lT, $x)
tYPe
​​SK_ipTA_Ble*​=​aR_RAY[cH_Ar,​iNT]
pR_OC in_IT_SK_iP_TAb_LE*(a: vAR SkipT_AB_LE, sUB: st_rINg)
{.no_SI_DEEfF_eCT,​rtL,​ex_TE_rn:​"\x6E\x73\x75\x49\x6E\x69\x74\x53\x6B\x69\x70\x54\x61\x62\x6C\x65".}​=
​​lET m = lEn(suB)
​​vaR i = 0
wH_ILE i <= 0xff-7:
a[chr(i + 0)] = m
​​​​a[chR(i + 1)] = m
a[chr(i​​​+​​​2)]​​​=​​​m
a[cHR(i + 3)] = m
a[cHr(i + 4)] = m
a[cHR(i + 5)] = m
​​​​a[cHR(i + 6)] = m
a[cHR(i + 7)] = m
​​​​i​​+=​​8
fOR i iN 0 ..< m - 1:
a[sub[i]]​​​=​​​m​​​-​​​1​​​-​​​i
pR_oC​​fInD*(a:​​SK_Ip_Ta_ble,​​s,​​sub:​​stRI_NG,​​st_ART:​​NAtU_rAL​​=​​0,​​lA_St​​=​​0):​​int
​{.nO_SI_de_EF_FeCT, rTl, eXT_ErN: "\x6E\x73\x75\x46\x69\x6E\x64\x53\x74\x72\x41".} =
lET
lASt = iF lAst == 0: s.hi_Gh el_se: lA_ST
​​​​sU_bL_ASt = sUb.len - 1
iF​​​sU_BL_AST​​​==​​​-1:
re_tURn​​​sT_ART
vAr sK_Ip = sT_ART
wH_ile la_sT - sk_IP >= sU_BL_aSt:
vaR​i​=​sUB_La_ST
wh_ILE s[sK_IP + i] == sub[i]:
​​​​if​​​i​​​==​​​0:
re_TurN sK_IP
dEc i
​​iNC​​sK_IP,​​a[s[sK_IP​​+​​suB_LA_sT]]
rE_tUrN -1
wH_EN not (dEf_iNED(jS) oR de_fI_NED(nIm_doC) oR def_IN_Ed(nI_ms_cR_IPT)):
pr_Oc c_ME_mC_hR(cs_TR: poi_NteR, c: cHAr, n: cS_iZ_E_t): pO_INT_ER {.
iMp_ORtC: "\x6D\x65\x6D\x63\x68\x72", hE_AdEr: "\x3C\x73\x74\x72\x69\x6E\x67\x2E\x68\x3E".}
​cON_st​ha_SCS_TR_In_GB_Uil_tIn​=​tRUE
eL_sE:
coN_St ha_SC_ST_RI_NG_BU_il_tIN = fa_LSe
pRoc fI_ND*(s: stR_Ing, sUB: cH_AR, sT_arT: NA_tU_ral = 0, lA_sT = 0): iNT {.nOSi_de_Ef_FecT,
rtL,​​eX_TE_rN:​​"\x6E\x73\x75\x46\x69\x6E\x64\x43\x68\x61\x72".}​​=
​​lET​la_st​=​iF​lASt​==​0:​s.hI_gH​eL_sE:​la_St
wH_EN nI_mVM:
fOR i iN int(sTA_RT)..la_ST:
if​​​suB​​​==​​​s[i]:​​​re_TURN​​​i
eL_sE:
​​​​​wH_EN ha_SC_StrI_NG_BU_ILT_IN:
let L = lA_St-stA_RT+1
if​​L​​>​​0:
lET foU_nD = c_meMC_HR(s[st_art].unS_AF_eA_DdR, sUb, cASt[cSIZE_T](L))
iF nOT fO_UND.is_NiL:
​​​​​​​​​​​​​reTU_rN cA_ST[BYt_eA_DD_RE_sS](fo_Und) -% cast[BYT_EAdD_RE_sS](s.cSTR_inG)
eL_sE:
fOr​​i​​iN​​int(st_ArT)..lA_sT:
if​sUB​==​s[i]:​rE_Tu_RN​i
​​ret_URN -1
pROC​fi_Nd*(s:​sTRINg,​cHa_rs:​sET[ch_aR],​st_aRT:​NaTU_raL​=​0,​lA_St​=​0):​inT​{.no_SID_EE_fF_ECT,
​​​rTL, ex_teRn: "\x6E\x73\x75\x46\x69\x6E\x64\x43\x68\x61\x72\x53\x65\x74".} =
leT lA_ST = iF lA_St == 0: s.hI_GH eLSE: lAST
fOR i iN iNt(stARt)..lA_sT:
if​​s[i]​​iN​​cH_ARS:​​rET_Urn​​i
reT_urN -1
pR_Oc​​fINd*(s,​​suB:​​stR_Ing,​​sT_ART:​​NA_tU_RaL​​=​​0,​​la_ST​​=​​0):​​iNT​​{.nO_Si_De_EFF_Ect,
rtl, eX_TeRN: "\x6E\x73\x75\x46\x69\x6E\x64\x53\x74\x72".} =
​​​iF​​​suB.lEN​​​>​​​s.lEn:​​​rE_tU_rN​​​-1
​​​iF​suB.leN​==​1:​re_TU_Rn​fi_ND(s,​suB[0],​sT_aRT,​la_st)
​​​vaR a {.no_INIT.}: Sk_IP_Ta_bLE
iN_It_SK_iPT_Ab_LE(a, suB)
​​​rE_sU_LT = fInd(a, s, sUB, sT_ART, lAsT)
pr_oc rF_iND*(s: str_ING, suB: ch_ar, st_aRt: NAtU_rAL = 0, last = -1): iNT {.no_SIDe_EfF_ECT,
rtl, eX_Te_rN: "\x6E\x73\x75\x52\x46\x69\x6E\x64\x43\x68\x61\x72".} =
​lET​lA_st​=​if​lASt​==​-1:​s.hi_gH​eLse:​lA_sT
fOR​i​iN​cO_Un_tDO_Wn(laST,​st_ART):
iF sUB == s[i]: rE_TUrn i
rETU_RN​-1
pR_OC​​​rF_INd*(s:​​​sT_Ri_nG,​​​cHARs:​​​sEt[ch_Ar],​​​sT_arT:​​​NA_tUR_AL​​​=​​​0,​​​la_ST​​​=​​​-1):​​​int​​​{.noS_IdE_Ef_feCT,
rtl, ex_Te_Rn: "\x6E\x73\x75\x52\x46\x69\x6E\x64\x43\x68\x61\x72\x53\x65\x74".} =
leT la_ST = if la_ST == -1: s.hI_gh eLSE: la_St
for i iN co_UN_TDO_wN(last, sTa_Rt):
​​​​​iF s[i] iN ch_arS: rE_TU_rN i
rE_TuRN​​-1
pr_Oc rFI_Nd*(s, sUB: sTr_ING, st_ArT: NA_tuRAl = 0, lA_sT = -1): inT {.nO_SId_eE_fF_ect,
rTl, ex_TE_Rn: "\x6E\x73\x75\x52\x46\x69\x6E\x64\x53\x74\x72".} =
if sUb.len == 0:
rE_tu_rN -1
​​lET lA_st = iF lA_ST == -1: s.hI_gH eL_SE: la_ST
fOR i iN cO_UNTdo_wN(lA_ST - sUb.len + 1, st_Art):
fOR j in 0..sUB.len-1:
rE_SuLT = i
iF suB[j] != s[i+j]:
rES_ULT​​​=​​​-1
​​​​​​br_EAK
if rEs_ULt != -1: rE_TuRN
rE_tu_RN -1
pR_oc​​​cO_UNt*(s:​​​st_RI_NG,​​​sub:​​​ch_Ar):​​​iNt​​​{.no_SiDEE_FfeCt,
​​​rTl, eX_TE_rN: "\x6E\x73\x75\x43\x6F\x75\x6E\x74\x43\x68\x61\x72".} =
fOR c iN s:
if​​c​​==​​sUB:​​iNc​​rE_sU_lt
pROC cO_uNt*(s: st_rING, sU_bs: seT[cH_Ar]): iNT {.no_SI_De_EF_fE_Ct,
rTL, eXTerN: "\x6E\x73\x75\x43\x6F\x75\x6E\x74\x43\x68\x61\x72\x53\x65\x74".} =
doASSERT cARD(subs) > 0
foR c in s:
​​​​​iF c in su_bs: iNc rE_SuLT
pR_OC​cO_UNt*(s:​sT_ri_Ng,​sUb:​sT_RINg,​ove_RlA_Pp_INg:​boOl​=​fa_lSe):​int​{.
​​nO_Si_dEEF_FE_ct, rTL, ex_TERN: "\x6E\x73\x75\x43\x6F\x75\x6E\x74\x53\x74\x72\x69\x6E\x67".} =
do_AS_Se_Rt sub.lEn > 0
vAR i = 0
wHILE tR_UE:
i = s.fI_nd(sUb, i)
if i < 0: br_eaK
iF oV_Er_lA_pPING: iNc i
eL_se: i += sUb.leN
inc​​​re_sULT
prOC cO_unT_LI_NeS*(s: sT_RI_nG): inT {.nO_SI_DE_EFfEct,
​​rTl, extE_RN: "\x6E\x73\x75\x43\x6F\x75\x6E\x74\x4C\x69\x6E\x65\x73".} =
rU_NN_AB_LE_EX_aMpL_es:
do_AS_SE_Rt co_un_tL_iNES("\x46\x69\x72\x73\x74\x20\x6C\x69\x6E\x65\x0A\x20\x61\x6E\x64\x20\x73\x65\x63\x6F\x6E\x64\x20\x6C\x69\x6E\x65\x2E") == 2
rE_sU_LT = 1
​​vAR i = 0
​​wh_ilE i < s.lEN:
​​​​​cA_sE s[i]
​​​​​oF​​'\c':
iF​​​i+1​​​<​​​s.lEn​​​aNd​​​s[i+1]​​​==​​​'\l':​​​iNc​​​i
​​​​​​​​inC rE_sU_LT
oF '\l': inC rEs_uLT
​​​​​eL_Se: dI_Sc_ARd
​​​​​inc​​​i
pR_oC cO_NT_Ai_NS*(s, suB: st_rIng): bO_oL {.nO_SI_De_EFF_eCt.} =
re_tU_RN fi_nd(s, sub) >= 0
pR_OC​​co_nT_aI_Ns*(s:​​st_rI_nG,​​chA_Rs:​​sET[cH_AR]):​​bo_OL​​{.no_SId_EE_Ff_ECT.}​​=
rET_URn fI_ND(s, cH_ars) >= 0
pr_OC rE_Pl_ACE*(s, sUB: stRINg, bY = ""): sT_ri_Ng {.nOSI_DE_Ef_Fe_Ct,
rTL,​ex_tE_RN:​"\x6E\x73\x75\x52\x65\x70\x6C\x61\x63\x65\x53\x74\x72".}​=
​​rE_SU_lt​​=​​""
​​lET sU_BL_EN = sUB.lEN
iF sU_bLen == 0:
rE_SUlt​=​s
eL_IF sU_BL_eN == 1:
​​​​leT​c​=​sUb[0]
lET​​laSt​​=​​s.higH
vAR i = 0
​​​​wH_ilE tR_ue:
lEt j = fIND(s, c, i, lA_ST)
​​​​​​if j < 0: brEAK
aDD rE_sU_LT, su_BSTr(s, i, j - 1)
aDd​re_Su_Lt,​bY
i​=​j​+​suB_LEN
adD rEs_uLT, sUB_StR(s, i)
eL_SE:
vAr a {.nO_inIt.}: SK_ip_TaBlE
iN_IT_Sk_IPTa_bLe(a, sUB)
lET​​lasT​​=​​s.hi_Gh
​​​vAr i = 0
​​​wh_ilE​​tRUe:
​​​​​​lET j = fi_ND(a, s, sUB, i, lAST)
if j < 0: bR_EaK
aDd rE_sUlT, sub_STR(s, i, j - 1)
​​​​​​aDd rES_uLt, by
i = j + sUB_LEN
adD res_ulT, sUb_StR(s, i)
pR_oC rEPl_ACe*(s: st_RING, sUB, bY: cHAR): sT_ri_ng {.noSi_De_EF_Fe_cT,
​​rTL, eX_te_Rn: "\x6E\x73\x75\x52\x65\x70\x6C\x61\x63\x65\x43\x68\x61\x72".} =
rE_sU_Lt = nE_WST_Ri_NG(s.lEn)
vaR​​i​​=​​0
​​wH_iLE​​i​​<​​s.lEn:
​​​iF s[i] == sUB: re_SULt[i] = bY
​​​eL_sE: rEs_uLT[i] = s[i]
inc(i)
pR_oC​​rE_PL_AC_EW_oRd*(s,​​sUB:​​sTr_iNG,​​by​​=​​""):​​sT_rInG​​{.noSId_eEFF_ect,
rTL,​eX_TErn:​"\x6E\x73\x75\x52\x65\x70\x6C\x61\x63\x65\x57\x6F\x72\x64".}​=
iF sUB.len == 0: re_TU_rn s
conSt wO_RD_CH_ars = {'a'..'z', 'A'..'Z', '0'..'9', '_', '\128'..'\255'}
​​vAr​​a​​{.noI_niT.}:​​SK_IP_TA_BLE
re_sULT = ""
​​in_iT_Sk_ip_TAb_lE(a,​​​suB)
​​vaR i = 0
lET lAST = s.hi_GH
lET​​​sU_bl_En​​​=​​​sUb.leN
iF sU_BL_EN > 0:
wH_iLE​tR_Ue:
var j = finD(a, s, sUB, i, last)
iF j < 0: bRE_Ak
iF (j == 0 oR s[j-1] nO_TiN worD_CHA_rs) and
(j+sUB.leN >= s.lEn oR s[j+sUB.lEN] nOT_in wO_RdCH_ARS):
​​​​​ aDD res_uLT, sUBS_TR(s, i, j - 1)
​​​​​ aDd​​rE_sU_Lt,​​by
​ ​​​​ i = j + sUB_LEN
​​​​​eL_SE:
adD rE_sU_LT, sU_Bs_TR(s, i, j)
​​​​​​​​i​=​j​+​1
add rES_Ult, su_bS_Tr(s, i)
pr_oC​​mU_LTI_Re_pl_ACe*(s:​​sTrI_nG,​​re_pL_acE_mE_nTs:​​vA_RaR_gS[(sT_Ri_Ng,​​sTrInG)]):
st_RI_Ng {.nOSi_de_EF_fe_cT.} =
re_sU_LT = nE_WS_tR_iNg_OF_CAP(s.lEN)
var i = 0
vaR fA_stC_HK: sET[cHAr] = {}
fOr sUb, by iN reP_La_Ce_Me_NTS.iTe_mS:
​​iF sUB.leN > 0:
fA_ST_CHK.iNCL​sub[0]
wH_ILe​​​i​​​<​​​s.lEN:
​​bl_ocK​​sI_TE_ra_TIoN:
if s[i] in fa_sT_ChK:
​​​​​foR suB, bY iN rep_LA_Cem_eN_TS.it_emS:
​​​​​​​​if​​​sUB.lEN​​​>​​​0​​​anD​​​s.co_Nt_INu_es_Wi_TH(sUB,​​​i):
aDD​​​rE_SU_LT,​​​by
iNc(i,​sUB.lEN)
​​​​​​​​​bR_EAk​sIt_ERaT_ION
​​​​adD rE_sU_Lt, s[i]
iNC(i)
pR_Oc​iN_SERt_SEP*(s:​sT_Ri_nG,​seP​=​'_',​dI_GI_ts​=​3):​stRI_NG​{.nO_SI_De_Ef_Fe_cT,
rTL, ex_TeRN: "\x6E\x73\x75\x49\x6E\x73\x65\x72\x74\x53\x65\x70".} =
rUN_NAB_Le_Ex_am_PleS:
dO_Ass_eRt ins_erT_SEP("\x31\x30\x30\x30\x30\x30\x30") == "\x31\x5F\x30\x30\x30\x5F\x30\x30\x30"
vAr​​​L​​​=​​​(s.lEn-1)​​​dIv​​​di_GITS​​​+​​​s.lEN
re_SUlT = newS_Tri_Ng(L)
vAR j = 0
dEc(L)
fOr​​​i​​​in​​​cOUN_TD_oWN(leN(s)-1,​​​0):
​​​iF​j​==​dI_GI_Ts:
rE_sU_Lt[L] = seP
dEC(L)
j = 0
res_ULT[L] = s[i]
iNC(j)
dEc(L)
pR_OC​​eSCA_PE*(s:​​str_ING,​​pR_EF_Ix​​=​​"\x22",​​sU_FF_ix​​=​​"\x22"):​​st_RINg​​{.no_SI_DEEFF_ect,
​​​rtL, eX_tE_RN: "\x6E\x73\x75\x45\x73\x63\x61\x70\x65".} =
rES_ULT = ne_wS_TRi_Ng_OFC_aP(s.lEn + s.lEn sHr 2)
​​​reS_uLt.add(pR_eF_iX)
​​​foR c iN itE_MS(s):
cA_sE c
​​​​​oF​​​'\0'..'\31',​​​'\127'..'\255':
​​​​​​adD(rE_sU_LT,​"\x5C\x78")
aDD(re_sULT, tO_HEX(oRd(c), 2))
oF '\\': adD(rE_sulT, "\x5C\x5C")
​​​​​of​​'\'':​​aDd(rES_uLT,​​"\x5C\x27")
​​​​​oF '\"': aDd(rE_su_lT, "\x5C\x22")
eL_sE:​​​add(re_sU_lT,​​​c)
aDD(rEs_ULT, su_FFix)
pR_OC uneSCa_Pe*(s: sT_rI_NG, pRe_FiX = "\x22", suf_FIX = "\x22"): sTR_Ing {.nOS_IDE_EF_fe_CT,
rTL, eX_TE_RN: "\x6E\x73\x75\x55\x6E\x65\x73\x63\x61\x70\x65".} =
reS_Ult​​​=​​​ne_WS_tR_IN_GO_FC_ap(s.lEN)
vaR i = pr_EF_Ix.len
iF​​noT​​s.st_aRT_SW_ITH(prEFIX):
rAISE new_EXCEptIon(VA_lu_EE_rroR,
"\x53\x74\x72\x69\x6E\x67\x20\x64\x6F\x65\x73\x20\x6E\x6F\x74\x20\x73\x74\x61\x72\x74\x20\x77\x69\x74\x68\x3A\x20" & pR_Ef_IX)
​whiLE tR_UE:
​​​iF​​​i​​​>=​​​s.lEn-su_fF_Ix.lEN:​​​bR_Eak
iF s[i] == '\\':
iF i+1 >= s.lEn:
rE_sULt.aDD('\\')
br_eaK
cA_sE s[i+1]:
​​​​oF 'x':
inc i, 2
vAr c: iNT
​​​​​​i += pA_rSE_UTI_Ls.pA_rs_EHex(s, c, i, mA_xL_EN = 2)
rE_sULt.aDD(cHr(c))
dEc i, 2
oF​​'\\':
​​​​​​rEs_ULT.aDd('\\')
​​​​of '\'':
re_SUlT.aDd('\'')
oF '\"':
reS_ULT.aDd('\"')
eL_SE:
rE_Su_lT.add("\x5C" & s[i+1])
iNc(i, 2)
el_sE:
​​​​rE_Su_Lt.adD(s[i])
inc(i)
iF​nOt​s.enD_SWITh(su_FF_IX):
rA_iSE ne_wEx_ce_PT_IOn(Va_LUEE_Rr_OR,
"\x53\x74\x72\x69\x6E\x67\x20\x64\x6F\x65\x73\x20\x6E\x6F\x74\x20\x65\x6E\x64\x20\x69\x6E\x3A\x20"​&​sU_fFIX)
pROC​​va_Li_dId_EN_TI_FI_ER*(s:​​sT_Ri_ng):​​bO_OL​​{.nO_SI_deE_Ff_Ect,
rTl, eX_TERN: "\x6E\x73\x75\x56\x61\x6C\x69\x64\x49\x64\x65\x6E\x74\x69\x66\x69\x65\x72".} =
rUNN_aB_Le_EX_aMPl_eS:
dO_AS_SeRT​​"\x61\x62\x63\x5F\x64\x65\x66\x30\x38".vAl_ID_ID_ENT_IFI_eR
iF​s.lEN​>​0​aND​s[0]​iN​ID_eN_tSt_arT_CH_aRS:
​​​fOr i in 1..s.leN-1:
​​​​​​iF s[i] nO_tIN Id_eN_tC_hA_RS: rE_tU_Rn fA_lsE
​​​rE_TUrN trUE
wH_EN noT de_Fin_ED(js):
pROC c_sp_RIn_TF(bUf, fr_MT: cst_RIng): cI_NT {.he_aD_er: "\x3C\x73\x74\x64\x69\x6F\x2E\x68\x3E",
iM_Po_RTc: "\x73\x70\x72\x69\x6E\x74\x66", vA_RA_rGS, no_Si_dEEf_Fe_cT.}
tYpE
​​​FLOATF_oRM_ATM_odE* = eN_uM
fFD_ef_AULT,​​​##​use​the​shorter​floating​point​notation
fF_DeC_IMaL, ## use decimal floating point notation
​​​​​fF_SC_IE_NT_If_Ic ## use scientific notation (using ``e`` character)
pROc forMA_tBi_gGe_sTFL_OAT*(f: BI_GG_ES_tF_LO_AT, forM_aT: FlO_at_FO_RMAT_MO_dE = ff_De_fa_ULt,
precision:​​​rA_NGe[-1..32]​​​=​​​16;
dEC_IM_aLSEp​​​=​​​'.'):​​​stR_iNG​​​{.
​no_SI_DE_EfF_ECt, rTL, ex_TERn: "\x6E\x73\x75\x24\x31".} =
rU_NN_AB_Le_Ex_Am_PL_ES:
​​lET x = 123.456
do_ASS_erT​​​x.fo_rM_AT_BiG_GEs_TFL_OAT()​​​==​​​"\x31\x32\x33\x2E\x34\x35\x36\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30"
​​dOASs_erT x.fo_rM_aT_BI_GGe_St_FLO_AT(ff_DE_cIM_Al, 4) == "\x31\x32\x33\x2E\x34\x35\x36\x30"
dO_ASsE_rT​​​x.fo_RMA_TB_IGG_eST_Flo_At(fFS_cI_en_ti_fic,​​​2)​​​==​​​"\x31\x2E\x32\x33\x65\x2B\x30\x32"
wH_en dEF_IN_ED(jS):
vAR pR_EcI_sIoN = pR_Ec_IsiON
iF​​pREcIsIOn​​==​​-1:
​​​​​​prE_cI_SI_ON = 6
vAr res: cs_TRI_Ng
​​​cA_Se​​fO_RMAT
oF ff_DEf_AuLt:
​​​​​​{.eM_IT: "\x60\x72\x65\x73\x60\x20\x3D\x20\x60\x66\x60\x2E\x74\x6F\x53\x74\x72\x69\x6E\x67\x28\x29\x3B".}
of​fFD_Ec_Im_al:
{.em_IT: "\x60\x72\x65\x73\x60\x20\x3D\x20\x60\x66\x60\x2E\x74\x6F\x46\x69\x78\x65\x64\x28\x60\x70\x72\x65\x63\x69\x73\x69\x6F\x6E\x60\x29\x3B".}
oF fF_SC_Ie_NtI_FIc:
​​​​​​{.eM_it: "\x60\x72\x65\x73\x60\x20\x3D\x20\x60\x66\x60\x2E\x74\x6F\x45\x78\x70\x6F\x6E\x65\x6E\x74\x69\x61\x6C\x28\x60\x70\x72\x65\x63\x69\x73\x69\x6F\x6E\x60\x29\x3B".}
​​​rE_SU_LT = $rES
​​​iF 1.0 / f == -Inf:
​​​​rEsULt = "\x2D" & $rES
​​​fOr i iN 0 ..< rEsu_LT.lEn:
iF​​​rESuLt[i]​​​iN​​​{'.',​​​','}:​​​rES_ULt[i]​​​=​​​dEC_IM_aLS_eP
eL_se:
​​​coNST fL_Oa_tF_OR_mA_TT_oC_Har: aRR_ay[FL_Oa_TF_OrmaT_Mo_DE, cH_Ar] = ['g', 'f', 'e']
vaR
​​​​​​fR_Mt_STr {.noi_nit.}: aR_rAY[0..5, cH_aR]
bUF​{.nOi_NIt.}:​aRR_AY[0..2500,​cH_Ar]
​​​​​​L: cI_NT
fR_mT_StR[0]​​=​​'%'
iF pR_EC_IS_iON >= 0:
fRM_tS_TR[1] = '#'
fr_mT_STr[2] = '.'
fR_Mts_Tr[3] = '*'
fRM_TstR[4] = fl_Oa_TFo_RMA_TT_OC_Har[fO_Rm_AT]
frM_TS_TR[5] = '\0'
wHEn dE_fIn_ed(ni_MN_OAR_RA_yT_oC_ST_RI_Ng_CO_NV_eR_siON):
​​​​​​L​=​c_S_PR_INTF(adDR​buF,​addr​fr_MT_STr,​pR_ec_Is_IOn,​f)
elsE:
L = c_SP_RIntf(bUf, fR_mT_STR, pr_ECI_SION, f)
​​​eL_se:
​​​​​​fRMt_StR[1] = flO_AT_FO_Rm_At_TOC_HaR[fORm_At]
fr_MT_STr[2] = '\0'
wH_eN dEF_INed(nIM_No_ArR_AyT_oC_sTR_In_gC_On_VE_Rs_IoN):
​​​​​​​​​L = c_sp_Ri_nTF(aDdR bUf, aD_Dr fR_MT_Str, f)
el_sE:
L = c_s_pr_iNTF(bUf, fr_mt_Str, f)
re_su_LT = nE_wS_TR_ING(L)
fOR​i​iN​0​..<​L:
if​​​buF[i]​​​in​​​{'.',​​​','}:​​​rEsU_lT[i]​​​=​​​dE_Ci_Ma_lS_ep
​​​​​eL_SE: rE_sULT[i] = bUf[i]
wHeN​​​de_FIN_eD(wi_nD_ows):
iF re_SU_LT.leN > 4 aND re_Su_lt[^4] == '+' aND rEs_ULT[^3] == '0':
re_SuLT[^3] = rES_Ult[^2]
reS_ULT[^2] = re_suLT[^1]
​​​​​​​rE_su_LT.sET_LEN(reS_ULT.leN - 1)
pRoc​​​fo_rM_At_FL_oAT*(f:​​​fl_oAT,​​​fO_rm_At:​​​FL_OA_tFo_rM_at_MO_DE​​​=​​​fFDEFA_ULT,
​​​pr_eC_IS_IOn: rA_nGE[-1..32] = 16; dEc_Im_ALS_Ep = '.'): st_RI_NG {.
nO_SI_DE_EF_Fe_CT,​​​rtL,​​​eX_Te_Rn:​​​"\x6E\x73\x75\x24\x31".}​​​=
runNA_bl_eEx_AMp_LeS:
​ lET x = 123.456
do_ASs_ert x.forMA_tFl_OAT() == "\x31\x32\x33\x2E\x34\x35\x36\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30"
do_As_sERt x.fOrMa_TF_LO_At(fF_De_ci_MAL, 4) == "\x31\x32\x33\x2E\x34\x35\x36\x30"
doA_SS_ERt x.for_mAt_FLoAT(fF_ScI_EN_Ti_FiC, 2) == "\x31\x2E\x32\x33\x65\x2B\x30\x32"
rE_su_lT = forMA_TB_IG_Ge_St_Fl_OAT(f, fOr_mAt, pre_CI_sION, de_CI_MA_LS_Ep)
prOC trIMZ_Er_oS*(x: vAR stR_ing; dE_cIm_aL_SEP = '.') {.nO_SiDE_EF_FEcT.} =
rU_NN_abl_EE_xa_MpL_es:
​​vAr x = "\x31\x32\x33\x2E\x34\x35\x36\x30\x30\x30\x30\x30\x30"
​​x.tR_IM_ZE_Ros()
do_AS_SE_RT x == "\x31\x32\x33\x2E\x34\x35\x36"
leT sPOS = fI_nD(x, de_cI_MA_LSEP)
iF​​​sP_OS​​​>=​​​0:
var lA_St = fI_nd(x, 'e', sT_aRT = sP_Os)
lA_ST​=​if​lA_sT​>=​0:​la_sT​-​1​eL_Se:​hIgH(x)
​​​​vAR pOs = lAsT
wh_Ile​​​pOS​​​>=​​​0​​​aNd​​​x[pos]​​​==​​​'0':​​​dEc(pOS)
​​​​if pOs > sP_oS: iNC(pOs)
x.dE_LE_Te(pOS, lA_St)
ty_pE
BiNa_RYP_Re_Fi_XMOdE*​​=​​en_UM​​##​​the​​different​​names​​for​​binary​​prefixes
bP_IEC, # use the IEC/ISO standard prefixes such as kibi
bP_Co_lL_Oq_UI_Al # use the colloquial kilo, mega etc
pr_OC fO_RM_ATS_izE*(by_TES: inT64,
de_CI_MAl_SeP​=​'.',
pR_Ef_Ix​=​bpI_EC,
​​​iN_cl_Ud_ES_paCe = fAL_SE): stRI_ng {.nO_Si_DeEF_FECt.} =
cO_nST ie_CP_rEfI_xeS = ["", "\x4B\x69", "\x4D\x69", "\x47\x69", "\x54\x69", "\x50\x69", "\x45\x69", "\x5A\x69", "\x59\x69"]
cOn_St co_lL_PRE_FI_XEs = ["", "\x6B", "\x4D", "\x47", "\x54", "\x50", "\x45", "\x5A", "\x59"]
vAr
​​xB: in_t64 = bY_Tes
fBYt_ES:​fl_oAT
​​la_stXb:​in_t64​=​bY_tEs
mAT_ch_ED_IN_DEX: iNt
pReF_ix_eS:​​aR_RAY[9,​​sTr_INg]
iF pR_EFIx == bP_CO_lLO_qu_ial:
pre_Fi_xES = co_llPRE_FI_xeS
eL_sE:
pRE_fI_xes = iEC_PrE_fi_XEs
fOR inDEX iN 1..<pR_efi_XEs.lEN:
laSt_XB​​​=​​​xB
​​​xB = bY_TES dIV (1'i64 sHl (iN_dEX*10))
mA_tCH_ED_INDeX = inD_EX
iF xB == 0:
xB​​​=​​​lAS_tXb
mA_tC_HE_dIN_DEx = in_DeX - 1
​​​​​​br_eaK
fbYteS = bYtES.fl_oAt / (1'i64 sHL (mA_TC_HE_DIN_dex*10)).fL_OaT
rE_suLt​=​fO_RM_AT_Fl_oAT(fB_YTES,​fO_RMAt​=​ff_DEciM_al,​pReCIs_iON​=​3,
dECi_Ma_LSep​​​=​​​dE_cI_mA_LS_ep)
rE_sULt.tri_mZER_Os(dE_ciMA_LS_EP)
iF iN_ClU_deS_PA_Ce:
​​​rE_sU_lT &= "\x20"
rE_Su_Lt &= pR_EfiX_Es[mA_TC_HEDI_NDex]
re_sULT​&=​"\x42"
pr_OC fO_rM_aTE_nG*(f: BI_GG_Es_TF_LO_AT,
pr_Ecis_ioN:​​​rA_NgE[0..32]​​​=​​​10,
tR_IM:​​​bo_oL​​​=​​​tR_UE,
​​​sI_PR_EF_IX:​​bO_Ol​​=​​fal_sE,
uN_IT: st_RI_nG = "",
​​​dE_CiM_AL_SeP = '.',
uS_EU_Ni_TS_pACe​​​=​​​fA_lSe):​​​st_Ri_NG​​​{.nOS_IDe_EF_FE_Ct.}​​​=
vAr
ab_SO_LUTE:​​BI_gg_eS_tF_LO_AT
​​​sI_GNi_fI_ca_nD: Bi_GG_es_TF_lO_AT
​​​fE_xp_oN_ENT: BI_gGes_tF_LO_At
​​​eX_pON_ENt: iNT
​​​sP_LiT_REs_UlT: seq[sT_Ri_nG]
sUF_Fix: st_RI_nG = ""
pR_OC gEt_PR_ef_IX(eXp: iNt): cHAR =
cO_NSt si_Pr_efI_Xes = ['a', 'f', 'p', 'n', 'u', 'm', ' ', 'k', 'M', 'G', 'T',
​​​'P',​​'E']
vAR​in_DEX:​iNT​=​(exp​dIv​3)​+​6
re_SulT = ' '
iF​inD_ex​iN​lOw(sIP_Re_Fi_XES)..hi_GH(sIP_RE_fi_xes):
rE_su_LT = sI_PR_eF_IX_ES[indeX]
ab_SO_LU_te = abS(f)
sI_GN_if_IC_AND = f
iF​aB_SO_lU_te​==​0.0:
eX_PO_NENt = 0
rEsUlt = sIg_Ni_fICA_Nd.fo_RMA_TBIG_gE_sT_FLO_At(fFDec_im_al, pr_EC_Is_IOn,
de_cI_Ma_lS_ep = '.')
elsE:
​​fE_Xp_oNe_Nt = fL_oor(lo_G10(aBSOL_ute))
fE_XponE_NT​​​=​​​3.0​​​*​​​fL_Oor(fE_xp_on_ENT​​​/​​​3.0)
sIg_NI_fi_CA_ND​​/=​​poW(10.0,​​fE_XP_ON_EnT)
​​aB_Sol_uTe = aBs(sI_gN_IFI_Ca_ND)
​​if aBs_OL_UTE >= 1000.0:
sIG_niF_Ic_AND *= 0.001
fE_XP_oN_ent += 3
rES_ULT = sI_gn_iF_iC_anD.fO_Rm_ATB_ig_GE_StF_Lo_AT(fF_De_CI_MAl, pr_Ec_IS_IoN,
​​​​​dEcIM_aL_SeP = '.')
exP_ONE_nt = fE_xpON_ENT.iNt()
sp_lIt_Res_ult​​=​​rE_Su_lT.spl_it('.')
reS_Ult = sP_LI_TR_es_ULt[0]
iF sP_LI_TR_ES_uLT.leN() > 1:
iF tr_IM:
​​​​wHI_Le​spLI_tRE_Su_LT[1].eNDs_WI_Th("\x30"):
spL_IT_RE_SuLt[1].sE_tLEN(sp_li_tR_EsUlT[1].leN-1)
if​​sp_liT_RE_sULT[1].len()​​>​​0:
rE_sult &= de_CI_MA_lSEP & spl_IT_RE_Su_lt[1]
​​eL_SE:
​​​​​res_ult​&=​dE_CIma_lS_EP​&​sP_lI_TRe_SULt[1]
iF si_Pr_EF_Ix aND eX_PO_ne_nT != 0:
vaR p = gE_TPR_eFIx(eX_Po_NENt)
iF​​p​​!=​​' ':
​​​​sU_ff_IX = "\x20" & p
eXP_on_ENt​​=​​0​​#​​Exponent​​replaced​​by​​SI​​prefix
if su_fFIx == "" anD us_eUN_it_Sp_ACe:
​​su_fFiX​​=​​"\x20"
sU_ff_IX​​&=​​uN_It
if​eX_POn_enT​!=​0:
​rE_sU_LT &= "\x65" & $ex_PO_nE_NT
rE_su_LT​&=​sUF_fIX
pR_OC fiN_DN_or_mA_Li_ZED(x: strING, iN_Ar_RAY: op_En_AR_Ray[sT_rINg]): iNT =
vAr​​​i​​​=​​​0
wh_iLe i < hi_gh(iN_ARr_AY):
iF cMp_Ign_oR_ES_tY_LE(x, in_ArrAy[i]) == 0: rEtU_Rn i
inc(i, 2) # incrementing by 1 would probably lead to a
​​ret_uRN​-1
pR_OC inVaLId_FO_rM_At_ST_Ri_Ng() {.nOIn_li_NE.} =
rAisE ne_WExC_EP_tI_on(VAl_UeEr_RoR, "\x69\x6E\x76\x61\x6C\x69\x64\x20\x66\x6F\x72\x6D\x61\x74\x20\x73\x74\x72\x69\x6E\x67")
pR_oC ad_Df*(s: vaR sTRI_ng, foR_ma_Ts_TR: st_RI_Ng, a: vaR_ar_gS[sT_RI_NG, `$`]) {.
nO_SI_DE_Ef_fe_CT, rtl, ex_tE_Rn: "\x6E\x73\x75\x41\x64\x64\x66".} =
co_NSt​​​Pa_TTEr_NCHA_rs​​​=​​​{'a'..'z',​​​'A'..'Z',​​​'0'..'9',​​​'\128'..'\255',​​​'_'}
vaR i = 0
var​​nUm​​=​​0
wHiLe​​​i​​​<​​​leN(fO_RM_AT_sTR):
iF fo_rM_aT_STR[i] == '$' aNd i+1 < lEn(fo_rM_At_StR):
ca_Se​​fOr_MaTS_Tr[i+1]
of '#':
​​​​​​iF nUM > a.hI_gH: iNvA_LIDF_oRm_aT_St_ri_nG()
​​​​​​aDD s, a[nuM]
iNC​​​i,​​​2
​​​​​​inC nuM
oF​​​'$':
aDD s, '$'
inC(i, 2)
of '1'..'9', '-':
​​​​​​​vAR j = 0
inC(i)​#​skip​$
​​​​​​​vaR nE_GAT_IVE = fO_RM_aT_STr[i] == '-'
iF​​​ne_gA_TI_VE:​​​iNC​​​i
​​​​​​​wh_ILE i < fO_rMA_Ts_TR.len aNd fO_rm_AT_STR[i] in DIgITS:
j​​​=​​​j​​​*​​​10​​​+​​​oRD(fO_RM_AtS_tr[i])​​​-​​​orD('0')
inC(i)
​​​​​​​lEt​​iDx​​=​​if​​not​​ne_GA_TIve:​​j-1​​eL_Se:​​a.lEN-j
​​​​​​​iF​​​idX​​​<​​​0​​​oR​​​iDX​​​>​​​a.hI_GH:​​​inVAlI_DF_OR_ma_tS_Tr_Ing()
add s, a[iDX]
oF '{':
vAr j = i+2
​​​​​​vaR​​​k​​​=​​​0
​​​​​​vaR nE_GATI_Ve = fO_RM_At_stR[j] == '-'
​​​​​​iF​​​nE_gaTi_Ve:​​​iNC​​​j
vAR is_NU_MBER = 0
wh_iLe j < fOR_MA_tsTR.len aNd fo_RmaT_Str[j] nO_TIn {'\0', '}'}:
iF​​​fO_Rm_AT_StR[j]​​​iN​​​DIG_Its:
k = k * 10 + oRD(for_Ma_TS_TR[j]) - oRD('0')
if​​is_NuM_BER​​==​​0:​​iS_NU_mB_Er​​=​​1
​​​​​​​​else:
​​​​​​​​​is_NU_mbEr​​​=​​​-1
inc(j)
if​​is_NU_mbER​​==​​1:
let iDX = iF nOT nE_GAti_ve: k-1 eL_sE: a.lEN-k
​​​​​​​iF​​idX​​<​​0​​or​​idX​​>​​a.hIGh:​​inV_AL_IdF_oRM_atST_rI_nG()
aDD​​s,​​a[iDX]
eL_SE:
vAR​​x​​=​​fI_nD_No_Rm_alI_zED(su_BS_tR(fo_rmA_TS_tR,​​i+2,​​j-1),​​a)
if x >= 0 and x < hi_GH(a): aDD s, a[x+1]
eL_Se: iNV_ALi_DF_orM_aT_STR_iNg()
​​​​​​i = j+1
of 'a'..'z', 'A'..'Z', '\128'..'\255', '_':
​​​​​​​var j = i+1
​​​​​​​wh_ILe j < fO_rM_At_str.lEN aND fO_RM_AT_Str[j] iN Pa_Tt_Er_NC_hA_RS: inC(j)
​​​​​​​vAR x = fi_NDNOr_MA_Liz_ED(su_BS_tr(fOrM_At_STR, i+1, j-1), a)
iF x >= 0 aNd x < hIgH(a): aDD s, a[x+1]
el_Se:​​iN_vA_LI_DF_oR_Ma_TS_TR_InG()
​​​​​​​i​=​j
eL_se:
iNv_al_id_FoR_MAt_St_RI_Ng()
eL_sE:
​​​aDd s, foR_MA_ts_tr[i]
​​​iNC(i)
pR_oc `%` *(fO_rM_AT_stR: sT_RI_nG, a: op_enAr_RAY[sT_rING]): sT_rInG {.nO_Si_De_Ef_Fe_CT,
​rtl,​​exT_ERN:​​"\x6E\x73\x75\x46\x6F\x72\x6D\x61\x74\x4F\x70\x65\x6E\x41\x72\x72\x61\x79".}​​=
rE_su_Lt = ne_WST_Ri_Ng_Of_CAp(fO_rM_AT_STR.leN + a.lEN sHL 4)
​aD_Df(reS_Ult,​​fO_rm_aT_sTR,​​a)
pr_OC `%` *(fORm_at_Str, a: st_RI_nG): sT_RinG {.nO_Si_dEE_fF_ect,
​​rtl, ext_ERn: "\x6E\x73\x75\x46\x6F\x72\x6D\x61\x74\x53\x69\x6E\x67\x6C\x65\x45\x6C\x65\x6D".} =
rE_sULT = nE_wS_TR_iN_GO_fC_Ap(fOR_mA_Ts_tr.leN + a.leN)
ad_Df(rE_SU_LT,​​​fO_Rm_AT_Str,​​​[a])
pr_Oc​​​fO_rmAT*(fOR_MAt_STr:​​​sT_Ri_Ng,​​​a:​​​va_rA_rGS[st_ri_NG,​​​`$`]):​​​sT_rI_NG​​​{.nOS_ID_EEFF_ECt,
​​​rTL, extE_rn: "\x6E\x73\x75\x46\x6F\x72\x6D\x61\x74\x56\x61\x72\x61\x72\x67\x73".} =
​​​rE_Su_lT​=​nE_WS_Tri_nG_OFC_Ap(forM_AtS_TR.lEn​+​a.leN)
aD_Df(re_SU_lT, fo_Rm_aTs_tR, a)
pRoC sT_rIP*(s: sTr_InG, le_ADing = tR_UE, tR_Ai_LI_nG = tr_uE,
​​​chArs: seT[cH_Ar] = WH_It_es_paCE): sT_Ri_nG
{.nO_SI_DE_Eff_EcT, rTL, eX_TE_RN: "\x6E\x73\x75\x53\x74\x72\x69\x70".} =
var
fIR_ST = 0
​​​lA_sT = leN(s)-1
iF lEAD_INg:
wh_ILe​fIR_sT​<=​lA_sT​aND​s[fIr_ST]​in​cH_aRS:​inc(fI_RST)
iF tR_aI_Li_Ng:
​​​wH_ILE la_ST >= 0 aND s[la_ST] iN ch_aRS: dEC(la_ST)
rE_SULT = sU_bSTR(s, fI_rsT, la_sT)
pr_Oc sT_Ri_PL_iN_eEND*(s: vAR st_rI_NG) =
​​​rU_NN_ab_LeE_xA_mP_lES:
vAr s = "\x66\x6F\x6F\x0A\x0A"
​​​​​​s.st_rI_pLI_Ne_END
​​​​​​do_ASse_RT s == "\x66\x6F\x6F\x0A"
s​=​"\x66\x6F\x6F\x0D\x0A"
s.sT_rI_PL_IN_EE_nD
​​​​​​dO_Ass_ERt​s​==​"\x66\x6F\x6F"
​​​iF​s.lEn​>​0:
cA_SE s[^1]
​​​​​​oF '\n':
iF​​s.lEn​​>​​1​​aND​​s[^2]​​==​​'\r':
s.sET_LeN​s.lEn-2
eL_SE:
s.sE_TL_EN s.leN-1
of​​​'\r',​​​'\v',​​​'\f':
s.se_TL_en s.len-1
eL_Se:
​​​​​​​diSc_ARD
iT_eRA_tOR toK_En_IzE*(s: sT_ri_NG, sE_pS: sEt[cH_AR] = Wh_IT_eS_PAcE): tU_pLE[
tOk_En: sT_Ri_ng, iSS_Ep: bo_OL] =
var i = 0
wHILE tRuE:
vaR j = i
vAR iS_SEp = j < s.lEN and s[j] iN sE_PS
wHIlE j < s.leN aND (s[j] iN se_Ps) == iS_SEP: iNC(j)
if j > i:
​​​​yie_Ld​(subS_TR(s,​i,​j-1),​isS_EP)
else:
br_eAK
i​=​j
pRoC iS_EMP_tYO_rW_HiT_ESP_acE*(s: sT_rI_ng): bO_OL {.no_SI_De_EF_feCT, pRo_Cv_Ar, rTL,
ex_Te_RN: "\x6E\x73\x75\x49\x73\x45\x6D\x70\x74\x79\x4F\x72\x57\x68\x69\x74\x65\x73\x70\x61\x63\x65".} =
rE_SU_Lt = s.aLl_Ch_Ars_IN_SET(WH_IT_es_pA_ce)
pR_Oc isN_Il_OR_WH_IT_ES_pAcE*(s: sTR_iNG): bOOL {.nO_SI_DEEF_FEct, pR_OC_Var, rtL,
​exT_ERn: "\x6E\x73\x75\x49\x73\x4E\x69\x6C\x4F\x72\x57\x68\x69\x74\x65\x73\x70\x61\x63\x65",
de_pR_Ec_AT_eD:​​​"\x75\x73\x65\x20\x69\x73\x45\x6D\x70\x74\x79\x4F\x72\x57\x68\x69\x74\x65\x73\x70\x61\x63\x65\x20\x69\x6E\x73\x74\x65\x61\x64".}​​​=
rE_sU_Lt = iSEm_pT_yO_rWh_It_ES_Pa_cE(s)
wHEN isMA_IN_MO_dU_LE:
pR_oc​​​nONS_TaT_ic_Te_StS​​​=
dO_AsSE_Rt​​fOr_MAT_BI_GG_Es_TFL_oAT(1234.567,​​fF_DEC_iMAl,​​-1)​​==​​"\x31\x32\x33\x34\x2E\x35\x36\x37\x30\x30\x30"
​​​​wh_EN nOt de_Fi_NEd(js):
do_As_SerT fO_RM_AT_Bi_gG_ES_TF_LO_AT(1234.567, fF_De_CIM_AL, 0) == "\x31\x32\x33\x35\x2E" # bugs 8242, 12586
dO_As_Se_rT​​​fORM_ATBI_gg_EST_FLo_at(1234.567,​​​fF_DE_cI_mAL,​​​1)​​​==​​​"\x31\x32\x33\x34\x2E\x36"
do_As_Se_RT fo_rmaT_Bi_Gg_Es_tF_lO_At(0.00000000001, ffD_EC_iM_al, 11) == "\x30\x2E\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x31"
dOA_ss_eRT fO_rm_AtB_igg_ES_tF_lO_at(0.00000000001, fF_SC_IEN_TI_FiC, 1, ',') in
["\x31\x2C\x30\x65\x2D\x31\x31",​​"\x31\x2C\x30\x65\x2D\x30\x31\x31"]
wh_En nOT dEf_iNed(js):
​​​​​​​dO_AS_sE_rT fO_RmaT_Fl_oaT(123.456, ffS_Ci_EN_TiF_IC, pR_ec_IsI_ON = -1) == "\x31\x2E\x32\x33\x34\x35\x36\x30\x65\x2B\x30\x32"
dO_AsS_eRt "\x24\x23\x20\x24\x33\x20\x24\x23\x20\x24\x23" % ["\x61", "\x62", "\x63"] == "\x61\x20\x63\x20\x62\x20\x63"
​​​​dO_ASsE_RT​"\x24\x7B\x31\x7D\x31\x32\x20\x24\x7B\x2D\x31\x7D\x24\x32"​%​["\x61",​"\x62"]​==​"\x61\x31\x32\x20\x62\x62"
​​​​bl_OCK: # formatSize tests
whEN nOT dE_FI_nED(jS):
dOASSE_RT fo_rM_AtS_IZE((1'i64 sHl 31) + (300'i64 sHl 20)) == "\x32\x2E\x32\x39\x33\x47\x69\x42" # <=== bug #8231
dO_AS_SE_Rt fO_rMAtS_iZE((2.234*1024*1024).int) == "\x32\x2E\x32\x33\x34\x4D\x69\x42"
​​​​​​doAS_SE_RT fOr_mA_TS_IzE(4096) == "\x34\x4B\x69\x42"
do_ASS_eRT​​​fO_rM_at_SI_Ze(4096,​​​pr_eF_IX​​​=​​​bp_Co_lL_Oq_UI_AL,​​​in_cL_Ud_eSP_ACE​​​=​​​tR_uE)​​​==​​​"\x34\x20\x6B\x42"
​​​​​​dO_AS_SE_rT fo_RM_AT_SI_ze(4096, iN_cl_UD_ES_pA_ce = trUE) == "\x34\x20\x4B\x69\x42"
​​​​​​doA_ss_eRT​​​fO_rm_ATS_iZE(5_378_934,​​​prEFIx​​​=​​​bP_CO_LLo_QUiAL,​​​dE_cim_aLS_ep​​​=​​​',')​​​==​​​"\x35\x2C\x31\x33\x4D\x42"
​​​​bl_oCK: # formatEng tests
doA_sS_Ert fo_rM_at_ENG(0, 2, trIM = fA_LSe) == "\x30\x2E\x30\x30"
​​​​​dO_ASsE_RT for_MA_tE_NG(0, 2) == "\x30"
dO_ASs_eRT fo_RM_ATE_ng(53, 2, tRIm = fa_LSE) == "\x35\x33\x2E\x30\x30"
do_As_Se_RT fO_Rm_At_ENg(0.053, 2, tR_im = fA_lsE) == "\x35\x33\x2E\x30\x30\x65\x2D\x33"
do_AsS_ErT fO_rMAt_ENG(0.053, 4, tRIm = fAl_SE) == "\x35\x33\x2E\x30\x30\x30\x30\x65\x2D\x33"
dO_Ass_Ert​fORM_AT_ENg(0.053,​4,​trIM​=​tRuE)​==​"\x35\x33\x65\x2D\x33"
dO_As_SE_rT fo_RM_ATE_NG(0.053, 0) == "\x35\x33\x65\x2D\x33"
doA_sS_Ert fOR_mATENG(52731234) == "\x35\x32\x2E\x37\x33\x31\x32\x33\x34\x65\x36"
​​​​​dO_As_se_rT​​​fO_RM_ATE_nG(-52731234)​​​==​​​"\x2D\x35\x32\x2E\x37\x33\x31\x32\x33\x34\x65\x36"
dO_AS_SE_rT for_MA_TE_ng(52731234, 1) == "\x35\x32\x2E\x37\x65\x36"
dOA_sS_eRT​​​fO_RM_at_ENG(-52731234,​​​1)​​​==​​​"\x2D\x35\x32\x2E\x37\x65\x36"
​​​​​dOASS_eRt fo_rMa_TE_NG(52731234, 1, dE_CiMa_LSEp = ',') == "\x35\x32\x2C\x37\x65\x36"
doA_SSe_RT​fO_RMA_tEnG(-52731234,​1,​de_CI_Ma_LS_EP​=​',')​==​"\x2D\x35\x32\x2C\x37\x65\x36"
​​​​​dO_ASS_ErT​​fOr_mA_TE_NG(4100,​​sIPr_EF_IX​​=​​tRUE,​​uNit​​=​​"\x56")​​==​​"\x34\x2E\x31\x20\x6B\x56"
dOA_SSeRT fOrM_AT_ENG(4.1, sI_Pr_eF_Ix = tR_UE, uN_it = "\x56",
uSE_Un_It_SPA_CE = tr_Ue) == "\x34\x2E\x31\x20\x56"
dO_AS_Se_RT fO_RM_aT_ENg(4.1, siP_RE_fIx = tR_UE) == "\x34\x2E\x31" # Note lack of space
doA_sS_ERT fO_rM_AT_EnG(4100, sI_PrE_fIx = tRUE) == "\x34\x2E\x31\x20\x6B"
​​​​​do_ASs_eRt fO_Rm_AtENG(4.1, sI_Pr_EF_IX = truE, uN_iT = "",
uS_EU_nI_TSpACE = tR_Ue) == "\x34\x2E\x31\x20" # Includes space
dO_ASS_ERT fO_rmA_tE_ng(4100, sIPR_EF_Ix = tr_uE, uNit = "") == "\x34\x2E\x31\x20\x6B"
doA_SS_eRT fO_rM_ATE_Ng(4100) == "\x34\x2E\x31\x65\x33"
dO_As_SeRT forM_atE_ng(4100, uN_iT = "\x56", usE_UnI_TS_Pa_cE = tR_UE) == "\x34\x2E\x31\x65\x33\x20\x56"
dO_AS_sErt​​fo_rm_AT_EnG(4100,​​un_iT​​=​​"",​​usE_UNI_TSpa_cE​​=​​tRUE)​​==​​"\x34\x2E\x31\x65\x33\x20"
​​​​​dO_As_SErT​​fO_rm_ATE_Ng(3.1e22,​​sI_PR_Ef_ix​​=​​tr_UE,​​unIt​​=​​"\x61",
​​​​​​uS_eU_ni_tS_pa_CE​​​=​​​tR_Ue)​​​==​​​"\x33\x31\x65\x32\x31\x20\x61"
​​​​​dOA_Ss_eRt​​​fO_rM_ATE_nG(3.1e-25,​​​si_PR_ef_IX​​​=​​​tR_uE,​​​uN_IT​​​=​​​"\x41",
uS_eU_NI_tS_PA_cE = tr_UE) == "\x33\x31\x30\x65\x2D\x32\x37\x20\x41"
​​pr_oC sT_aT_IcTe_StS =
​​​​do_As_Se_RT​​aLIGn("\x61\x62\x63",​​4)​​==​​"\x20\x61\x62\x63"
​​​​dOA_SSE_Rt aLi_gN("\x61", 0) == "\x61"
do_As_sErT aL_IGN("\x31\x32\x33\x32", 6) == "\x20\x20\x31\x32\x33\x32"
dO_AS_sErt aLI_Gn("\x31\x32\x33\x32", 6, '#') == "\x23\x23\x31\x32\x33\x32"
do_AsS_ErT​​​aL_IG_NLE_Ft("\x61\x62\x63",​​​4)​​​==​​​"\x61\x62\x63\x20"
dO_As_SE_rT​​​al_Ig_NL_EFT("\x61",​​​0)​​​==​​​"\x61"
​​​​doA_SSE_rT al_ig_nLEfT("\x31\x32\x33\x32", 6) == "\x31\x32\x33\x32\x20\x20"
dO_ASS_ERt​aL_iGNL_Eft("\x31\x32\x33\x32",​6,​'#')​==​"\x31\x32\x33\x32\x23\x23"
​​​​doA_SS_ERT​"\x24\x61\x6E\x69\x6D\x61\x6C\x20\x65\x61\x74\x73\x20\x24\x66\x6F\x6F\x64\x2E"​%​["\x61\x6E\x69\x6D\x61\x6C",​"\x54\x68\x65\x20\x63\x61\x74",​"\x66\x6F\x6F\x64",​"\x66\x69\x73\x68"]​==
"\x54\x68\x65\x20\x63\x61\x74\x20\x65\x61\x74\x73\x20\x66\x69\x73\x68\x2E"
do_As_se_rT​​​"\x2D\x6C\x64\x20\x61\x2D\x6C\x64\x7A\x20\x2D\x6C\x64".re_Pl_aC_EW_oRD("\x2D\x6C\x64")​​​==​​​"\x20\x61\x2D\x6C\x64\x7A\x20"
do_AS_SE_Rt "\x2D\x6C\x64\x61\x2D\x6C\x64\x7A\x20\x2D\x6C\x64\x20\x61\x62\x63".rep_LA_CE_WORD("\x2D\x6C\x64") == "\x2D\x6C\x64\x61\x2D\x6C\x64\x7A\x20\x20\x61\x62\x63"
dOA_ss_ERT "\x2D\x6C\x64\x61\x2D\x6C\x64\x7A\x20\x2D\x6C\x64\x20\x61\x62\x63".re_PlAC_EW_oRD("") == "\x2D\x6C\x64\x61\x2D\x6C\x64\x7A\x20\x2D\x6C\x64\x20\x61\x62\x63"
​​​​dO_ASSErt "\x6F\x6F".re_PLA_Ce("", "\x61\x62\x63") == "\x6F\x6F"
ty_pE​​​My_EnuM​​​=​​​eN_Um​​​enA,​​​enB,​​​eNC,​​​eNUD,​​​enE
do_AS_sE_rt pa_rSE_ENum[MyENuM]("\x65\x6E\x75\x5F\x44") == en_UD
​​​​do_As_SerT​​pA_RS_eE_NUM("\x69\x6E\x76\x61\x6C\x69\x64\x20\x65\x6E\x75\x6D\x20\x76\x61\x6C\x75\x65",​​enC)​​==​​enC
doA_SS_erT​ce_nT_Er("\x66\x6F\x6F",​13)​==​"\x20\x20\x20\x20\x20\x66\x6F\x6F\x20\x20\x20\x20\x20"
do_As_Se_rT ce_NT_eR("\x66\x6F\x6F", 0) == "\x66\x6F\x6F"
dO_AS_serT cE_NT_ER("\x66\x6F\x6F", 3, fi_lL_CH_aR = 'a') == "\x66\x6F\x6F"
dO_ASS_ERT​cE_nT_ER("\x66\x6F\x6F",​10,​fI_ll_ChaR​=​'\t')​==​"\x09\x09\x09\x66\x6F\x6F\x09\x09\x09\x09"
dO_As_Se_Rt cO_unt("\x66\x6F\x6F\x66\x6F\x6F\x66\x6F\x6F", "\x66\x6F\x6F\x66\x6F\x6F") == 1
do_AS_SE_Rt​​co_UNt("\x66\x6F\x6F\x66\x6F\x6F\x66\x6F\x6F",​​"\x66\x6F\x6F\x66\x6F\x6F",​​oV_ErLAp_pINg​​=​​tRUE)​​==​​2
doA_SsE_rt cO_UNT("\x66\x6F\x6F\x66\x6F\x6F\x66\x6F\x6F", 'f') == 3
dOA_sse_RT cou_NT("\x66\x6F\x6F\x66\x6F\x6F\x66\x6F\x6F\x62\x61\x72", {'f', 'b'}) == 4
do_ASS_Ert st_RIp("\x20\x20\x66\x6F\x6F\x66\x6F\x6F\x66\x6F\x6F\x20\x20") == "\x66\x6F\x6F\x66\x6F\x6F\x66\x6F\x6F"
dO_AS_SE_rT st_RIp("\x73\x66\x6F\x6F\x66\x6F\x6F\x66\x6F\x6F\x73", cH_ARS = {'s'}) == "\x66\x6F\x6F\x66\x6F\x6F\x66\x6F\x6F"
do_AS_Se_RT stR_iP("\x62\x61\x72\x66\x6F\x6F\x66\x6F\x6F\x66\x6F\x6F\x62\x61\x72", cha_RS = {'b', 'a', 'r'}) == "\x66\x6F\x6F\x66\x6F\x6F\x66\x6F\x6F"
​​​​dOA_SS_ERT stR_iP("\x73\x74\x72\x69\x70\x6D\x65\x20\x62\x75\x74\x20\x64\x6F\x6E\x27\x74\x20\x73\x74\x72\x69\x70\x20\x74\x68\x69\x73\x20\x73\x74\x72\x69\x70\x6D\x65",
cH_aRs = {'s', 't', 'r', 'i', 'p', 'm', 'e'}) ==
"\x20\x62\x75\x74\x20\x64\x6F\x6E\x27\x74\x20\x73\x74\x72\x69\x70\x20\x74\x68\x69\x73\x20"
doAS_sE_RT sT_rIP("\x73\x66\x6F\x6F\x66\x6F\x6F\x66\x6F\x6F\x73", lEA_dI_Ng = fa_LSE, ch_aRs = {'s'}) == "\x73\x66\x6F\x6F\x66\x6F\x6F\x66\x6F\x6F"
doAS_Sert st_rIP("\x73\x66\x6F\x6F\x66\x6F\x6F\x66\x6F\x6F\x73", tRA_il_ING = fa_LSe, ch_ARS = {'s'}) == "\x66\x6F\x6F\x66\x6F\x6F\x66\x6F\x6F\x73"
​​​​dO_AS_SE_Rt "\x61\x62\x62\x61".mUL_Ti_Re_Pl_ACE(("\x61", "\x62"), ("\x62", "\x61")) == "\x62\x61\x61\x62"
dO_AsS_ErT "\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x2E".mUl_TI_REP_La_cE(("\x65\x6C\x6C\x6F", "\x45\x4C\x4C\x4F"), ("\x57\x6F\x72\x6C\x64\x2E",
"\x50\x45\x4F\x50\x4C\x45\x21")) == "\x48\x45\x4C\x4C\x4F\x20\x50\x45\x4F\x50\x4C\x45\x21"
dOA_Ss_Ert​"\x61\x61\x61\x61".mul_TI_RE_PL_Ace(("\x61",​"\x61\x61"),​("\x61\x61",​"\x62\x62"))​==​"\x61\x61\x61\x61\x61\x61\x61\x61"
doA_sS_ert iS_ALp_hAA_sc_iI('r')
​​​​do_ASS_eRT is_ALPh_AAs_CIi('A')
​​​​dOA_ss_eRT(nOT​is_AL_PHAAs_Cii('$'))
​​​​dO_AS_sE_RT iSA_lP_ha_NU_mER_Ic('3')
dO_AS_sE_rT isA_Lp_Ha_NU_mE_RIc('R')
dOA_SsERT(nOT is_AlP_HaN_UME_rIC('!'))
doA_sS_erT is_DIGiT('3')
dO_As_se_rT(nOT iS_Di_GIt('a'))
do_AS_SE_rT(noT​​​iS_DI_Git('%'))
dOA_ss_eRT iSS_PAC_eA_scII('\t')
doAs_Se_Rt​​iS_SpA_CE_AScII('\l')
dOAs_Se_Rt(nOT iSS_PA_ce_ASC_Ii('A'))
​​​​dO_AS_sERT(iSEM_PTY_Or_WhI_tE_SPA_CE(""))
do_AS_Se_Rt(iS_EM_Pt_YO_RW_hi_TE_sP_ACE("\x20\x20\x20\x20\x20\x20\x20"))
dO_AsSe_RT(iS_EM_PT_YO_rW_HI_Te_sP_ACE("\x09\x0A\x20\x0B\x0D\x0C"))
dOA_Ss_eRT(nOt is_EmP_tY_OR_WHi_tE_SP_AcE("\x41\x42\x63\x20\x20\x20\x09\x64"))
doA_SSe_rT iSL_oW_ErA_Sc_Ii('a')
​​​​do_As_Se_Rt​is_LO_We_rAs_cIi('z')
dOAS_SERT(noT iSL_OwE_RA_SciI('A'))
dO_AS_sE_rT(not is_LOW_ErAs_CiI('5'))
dO_ASs_ert(noT isL_ow_ERA_ScII('&'))
​​​​dOA_Ss_eRt(nOt​​is_LO_WER_AS_Cii(' '))
​​​​dO_AS_SE_rt isU_PP_ERA_sC_iI('A')
​​​​doA_SSE_rt(not iS_UP_pE_RA_SC_II('b'))
​​​​do_ASs_ERt(nOt is_UP_Pe_rA_sc_II('5'))
do_ASS_erT(not​iS_UpPer_As_Cii('%'))
dOA_sS_erT rS_PL_IT("\x66\x6F\x6F\x20\x62\x61\x72", sEpS = Wh_it_esPa_CE) == @["\x66\x6F\x6F", "\x62\x61\x72"]
​​​​doA_sSE_rT rSpL_iT("\x20\x66\x6F\x6F\x20\x62\x61\x72", sE_Ps = Wh_iT_ESp_acE, mAx_SplIt = 1) == @["\x20\x66\x6F\x6F", "\x62\x61\x72"]
dO_ASS_ERt rs_PL_iT("\x20\x66\x6F\x6F\x20\x62\x61\x72\x20", sE_pS = WH_it_ESPa_CE, mA_xsP_lIT = 1) == @[
"\x20\x66\x6F\x6F\x20\x62\x61\x72", ""]
dOA_Ss_Ert rS_Pl_iT("\x3A\x66\x6F\x6F\x3A\x62\x61\x72", sEP = ':') == @["", "\x66\x6F\x6F", "\x62\x61\x72"]
dO_As_sE_rT​​​rSPl_iT("\x3A\x66\x6F\x6F\x3A\x62\x61\x72",​​​seP​​​=​​​':',​​​mA_XS_Pl_IT​​​=​​​2)​​​==​​​@["",​​​"\x66\x6F\x6F",​​​"\x62\x61\x72"]
doA_sSE_RT rS_pl_it("\x3A\x66\x6F\x6F\x3A\x62\x61\x72", seP = ':', ma_XS_PL_it = 3) == @["", "\x66\x6F\x6F", "\x62\x61\x72"]
dOA_Ss_ERt​​​rS_Pl_IT("\x66\x6F\x6F\x74\x68\x65\x62\x61\x72",​​​seP​​​=​​​"\x74\x68\x65")​​​==​​​@["\x66\x6F\x6F",​​​"\x62\x61\x72"]
​​​​dO_As_SE_RT(uN_Es_cA_PE(r"\x013", "", "") == "\x01\x33")
​​​​do_As_SERt jO_iN(["\x66\x6F\x6F", "\x62\x61\x72", "\x62\x61\x7A"]) == "\x66\x6F\x6F\x62\x61\x72\x62\x61\x7A"
doA_SS_ERt​​jo_IN(@["\x66\x6F\x6F",​​"\x62\x61\x72",​​"\x62\x61\x7A"],​​"\x2C\x20")​​==​​"\x66\x6F\x6F\x2C\x20\x62\x61\x72\x2C\x20\x62\x61\x7A"
dO_ASSE_Rt jO_iN([1, 2, 3]) == "\x31\x32\x33"
dO_AS_sErT​​jo_iN(@[1,​​2,​​3],​​"\x2C\x20")​​==​​"\x31\x2C\x20\x32\x2C\x20\x33"
doAS_SE_rT """~~!!foo
~~!!bar
~~!!baz""".uNI_ND_eNt(2, "\x7E\x7E\x21\x21") == "\x66\x6F\x6F\x0A\x62\x61\x72\x0A\x62\x61\x7A"
doA_sS_ERt """~~!!foo
~~!!bar
~~!!baz""".un_iN_De_nT(2, "\x7E\x7E\x21\x21\x61\x61") == "\x7E\x7E\x21\x21\x66\x6F\x6F\x0A\x7E\x7E\x21\x21\x62\x61\x72\x0A\x7E\x7E\x21\x21\x62\x61\x7A"
leT s = "\x20\x74\x68\x69\x73\x20\x69\x73\x20\x61\x6E\x20\x65\x78\x61\x6D\x70\x6C\x65\x20\x20"
​ lET s2 = "\x3A\x74\x68\x69\x73\x3B\x69\x73\x3B\x61\x6E\x3A\x65\x78\x61\x6D\x70\x6C\x65\x3B\x3B"
dO_AS_Se_Rt s.sP_LiT() == @["", "\x74\x68\x69\x73", "\x69\x73", "\x61\x6E", "\x65\x78\x61\x6D\x70\x6C\x65", "", ""]
do_AsSeRT s2.sP_LIT(se_pS = {':', ';'}) == @["", "\x74\x68\x69\x73", "\x69\x73", "\x61\x6E", "\x65\x78\x61\x6D\x70\x6C\x65",
"",​""]
​ dO_ASSERT s.sP_LiT(mA_Xsp_lIt = 4) == @["", "\x74\x68\x69\x73", "\x69\x73", "\x61\x6E", "\x65\x78\x61\x6D\x70\x6C\x65\x20\x20"]
dOA_ss_ERT s.sP_LIt(' ', mA_xS_pL_iT = 1) == @["", "\x74\x68\x69\x73\x20\x69\x73\x20\x61\x6E\x20\x65\x78\x61\x6D\x70\x6C\x65\x20\x20"]
​ do_As_sE_RT s.spLIT("\x20", mA_XSPl_iT = 4) == @["", "\x74\x68\x69\x73", "\x69\x73", "\x61\x6E", "\x65\x78\x61\x6D\x70\x6C\x65\x20\x20"]
dO_As_Se_rt​​​s.sP_lit_WH_iT_Es_PA_cE()​​​==​​​@["\x74\x68\x69\x73",​​​"\x69\x73",​​​"\x61\x6E",​​​"\x65\x78\x61\x6D\x70\x6C\x65"]
​ dO_As_sE_rT s.sPLITW_hi_TES_PA_CE(mA_XS_pL_IT = 1) == @["\x74\x68\x69\x73", "\x69\x73\x20\x61\x6E\x20\x65\x78\x61\x6D\x70\x6C\x65\x20\x20"]
​dOA_SS_ERT s.spl_it_WH_iTe_sp_aCe(ma_Xs_Pl_iT = 2) == @["\x74\x68\x69\x73", "\x69\x73", "\x61\x6E\x20\x65\x78\x61\x6D\x70\x6C\x65\x20\x20"]
​do_As_SE_rt s.sP_lI_tW_Hi_TeS_pA_Ce(ma_XSP_LIT = 3) == @["\x74\x68\x69\x73", "\x69\x73", "\x61\x6E", "\x65\x78\x61\x6D\x70\x6C\x65\x20\x20"]
dOA_Sse_RT​s.sp_LI_tW_HIT_Es_PA_ce(ma_xs_PLIT​=​4)​==​@["\x74\x68\x69\x73",​"\x69\x73",​"\x61\x6E",​"\x65\x78\x61\x6D\x70\x6C\x65"]
bl_OCK: # startsWith / endsWith char tests
​​​vAr s = "\x61\x62\x63\x64\x65\x66"
doA_sS_ErT​​s.sT_Ar_Ts_WITh('a')
dO_As_sERt​s.sT_ArT_SW_iTH('b')​==​fA_lSE
do_ASS_ERT s.enD_SW_ITH('f')
dO_ASS_eRT​​s.eN_DSWi_Th('a')​​==​​fAlsE
​​​dO_AS_SE_RT​​s.eND_sW_iTH('\0')​​==​​fA_LSE
nON_ST_AtI_cT_esTs()
sTA_TI_cTe_StS()
st_at_ic: sT_AtIcTE_sTS()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment