产生密码


26

记住密码非常困难,因此我想出了一种生成密码的方法。

按照以下步骤,我是通过单词或句子生成密码的:

  1. 从左到右开始

  2. 查找每个字母的数量

  3. 按顺序把字母和数量放在一起

    • 重复度更高的字母将在结尾

    • 重复相同的字母将按字母顺序排列

  4. 数字和特殊字母将被忽略,包括空格(例如9、4,@,(,*等)将被忽略)

  5. 组字母忽略大小写。在输出中,使用输入中最后一次出现的情况

  6. 字母的计数可以是任何数字,例如5H17M345K
  7. 如果输入为全数字或特殊字母,则输出为空字符串,例如输入“ 12 $ * 34 ^!” 然后输出“”
  8. 当相同出现的顺序按字母顺序大小写无关紧要时,例如1a1B1c

例:

Input: Kitkat Tango
(2k / 1i / 3T / 2a / 1n / 1g / 1o)
Output: 1g1i1n1o2a2k3T

另一个例子:

Input: Database Partitions Task
(1D / 5a / 4T / 1b / 3s / 1e / 1P / 1r / 2i / 1o / 1n / 3s / 1k)
Output: 1b1D1e1k1n1o1P1r2i3s4T5a

注意:重复次数为1的字母在开头按字母顺序排列,然后重复次数较多的字母

这是,最短的代码获胜。


16
字母可以出现9次以上吗?
毛茸茸的

3
@manatwork:但这并不清楚(请注意,他们的回答并不假设字母出现少于10次),它只是试图放松输入限制。
ბიმო

4
确保将这些说明添加到实际的问题正文中,这样回答者就不必遍历所有评论
Jo King

2
注释不是规范。您需要更新挑战,以1.添加至少1个测试案例,其中包括9个以上的出现的一个或多个字母,2.指定输出必须为字符串(尽管我强烈建议您不要过于严格;它不会给挑战增加任何内容),3.指定我们必须能够处理不包含字母的输入,并4.阐明我们是否需要处理空字符串作为输入。
毛茸茸的

1
完成此操作后,您将必须测试所有现有解决方案,并告知他们是否需要进行任何更改。我已经找到了很多解决方案,这些解决方案都无法解决1。另外,将来您可能会考虑使用我们的沙盒尝试在发布挑战之前解决此类问题。
毛茸茸的

Answers:


7

Japt v2.0a0,14 -P个字节

f\l üv ñÊ®ÌiZÊ

试试吧

f\l üv ñÊ®ÌiZÊ     :Implicit input of string
                   > e.g., "Kitkat Tango"

f                  :Split to an array of characters
 \l                :  Matching RegEx /[a-z]/gi
                   > ["K","i","t","k","a","t","T","a","n","g","o"]

    ü              :Sort & group (Preserves original order within each group)
     v             :  By lowercase
                   > [["a","a"],["g"],["i"],["K","k"],["n"],["o"],["t","t","T"]]

       ñ           :Sort
        Ê          :  By length
                   > [["g"],["i"],["n"],["o"],["a","a"],["K","k"],["t","t","T"]]

         ®         :Map each Z
          Ì        :  Last element of Z
                   >   ["g","i","n","o","a","k","T"]
           i       :  Prepend
            ZÊ     :    Length of Z
                   >   ["1g","1i","1n","1o","2a","2k","3T"]

                   :Implicitly join & output
                   > "1g1i1n1o2a2k3T"

10

05AB1E19 17 16字节

感谢Kevin Cruijssen节省了1个字节

áΣl}.γl}éεgyθJ}J

在线尝试! 或作为测试套件

说明

á                  # keep only letters in input
 Σl}               # sort by lower-case
    .γl}           # group by lower-case
        é          # sort by length (stable)
         ε    }    # map each to
          g        # its length
             J     # joined with
           yθ      # the last letter
               J   # join to string

您可以通过将(对与)更改为«(concat /合并)来保存一个字节,因此J可以删除两个(连接)之一。
凯文·克鲁伊森

@KevinCruijssen:哇。我现在觉得很愚蠢:)为什么我不只是搬进J里面呢?编辑:实际上,我需要将它们作为19字节版本中的一对,当我制作17个版本时,我不打算更改它:P
Emigna



7

Perl 6的66 63个字节

{[~] map {+$_~.tail},sort {+$_,.lc},m:g/<:L>/.classify(&lc){*}}

在线尝试!

说明

{                                                             }  # Anon block
                                    m:g/<:L>/  # Match all letters
                                             .classify(&lc)  # Group by lowercase
                                                           {*}  # Get hash values
                     sort {+$_,.lc},  # Sort by array length and lowercase
     map {         },  # Map to
          +$_~.tail  # Concat array length and last letter
 [~]  # Join

6

视网膜67 66 41 39字节

\P{L}

O$`.
$l$0
ir`\1*(.)
$.0$1
N`\d+.

-25个字节和一个小错误修复,这要归功于@Neil
-2个字节感谢@Neil@Shaggy在一起。

在线尝试验证所有测试用例

说明:

除去大写和小写字母之外的所有内容:
Kitkat Tango 123!KitkatTango

\P{L}

对不区分大小写的单个字母进行排序(为此感谢@MartinEnder):
KitkatTangoaagiKknottT

O$`.
$l$0

捕获不区分大小写的每块重复相邻字母:
aagiKknottT→[ ,aagiKk,,n ]ottT

ir`\1*(.)

预先准备每场比赛的长度,并只保留每一个块的最后一个字母:
即[ aagiKknottT]→2a1g1i2k1n1o3T

$.0$1

根据数字对数字和字母组进行排序:
2a1g1i2k1n1o3T1g1i1n1o2a2k3T

N`\d+.

之后,将隐式输出结果。


您确定这是一个错误吗?不只是按字典顺序排序吗?("aA" < "aa"
毛茸茸的

1
@Shaggy我不确定是否可以。因为\w.中的O`\w.和用来表示我们正在对字符对进行排序。不知道我们是否可以对每对字符进行排序,而只能根据第一个字符对其进行排序。但是,好吧,马丁的建议是根据替换(比赛的小写变体)对每个字符进行排序,就像是一种魅力。:)
Kevin Cruijssen

1
可以用41个字节来完成吗,还是我丢失了什么?
尼尔


2
@Shaggy实际上,进一步阅读\P{L}可能会起作用,这样可以节省2个字节。
尼尔

4

Wolfram语言(Mathematica)102 96 93 87字节

""<>Map@ToString/@Sort[(r=Reverse)/@Tally[r@#/." "->Nothing,Equal@@ToLowerCase@{##}&]]&

在线尝试!

Tally[r@#/." "->Nothing,Equal@@ToLowerCase@{##}&]      Start with a char list
        #/." "->Nothing                                Remove spaces
      r@                                               Reverse the result
Tally[                 ,Equal@@ToLowerCase@{##}&]
                                             Make a list of letters and multiplicities,
                                             where two letters are considered the same if
                                             their lowercase values are equal. Then:

""<>Map@ToString/@Sort[(r=Reverse)/@ ... ]&
                       (r=Reverse)           Reverse each {letter, freq} to {freq,letter}.
                                             Then the standard Wolfram order function sorts
                                               lower frequencies first, with ties broken by
                                               by letters earlier in the alphabet,
                  Sort[                  ]     exactly what we want.

    Map@ToString/@                           @ has higher precedence than /@, so
                                               this effectively does Map[Map[ToString]].
""<>                                         StringJoin the nested list into a single string.

4

Pyth,27 24 22字节

ssrD0m,lded.gr0k@+Gr1G

在这里在线尝试。

ssrD0m,lded.gr0k@+Gr1GQ   Implicit: Q=eval(input()), G=lowercase alphabet
                          Trailing Q inferred
                   r1G    Uppercase alphabet
                 +G       Concatenate with lowercase alphabet
                @     Q   Keep those characters in Q which are also in the above
           .g             Group the remaining characters, as k, using:
             r0k             Convert k to lowercase
                              (Grouping preserves relative order)
     m                    Map the sorted groups, as d, using:
       ld                   Length of d
      ,                     Pair the above with...
         ed                 ... last element of d
   D                      Sort the above...
  r 0                     ... by their lowercase values
ss                        Flatten, then concatenate the result of the above into a string, implicit print

编辑:通过分组之前,以前的字符排序打了3个字节: sm+ldedo,lNr0eN.gr0kf}r0TGQ

编辑2:在进行任何订购之前,通过格式化输出来再打2个字节,先前版本: sm+ldedlD.gr0krD0f}r0TGQ

编辑3:感谢@FryAmTheEggman,通过更改过滤器使另一个字节占满。当OP阐明单个字母可以出现9次以上时,还必须修复一个错误,这会在:o(以前的版本:srD0m+lded.gr0kf}r0TGQ


@FryAmTheEggman很棒的电话,谢谢!

4

APL(Dyalog扩展),28 字节SBCS

匿名默认前缀功能。

(∊⍤∧⌊(⊂⍕⍤≢,⊢/)⍤⊢⌸⊢)'\PL'R''

在线尝试!

'\PL' 非字母
⎕R PCRE R替换为
'' 空字符串

() 应用以下默认功能:

 以小写字母为键,
 …  对每个键及其对应的一组值(即
 自变量)应用以下默认函数:

  () 将以下默认函数
   应用于
   值列表:

   ⊢/ 最后的值

   ……在此之前, 加上以下内容:

     该字符串化
     的
     帐簿

    括起来(将字符列表视为单个字符串)

ϵ nlist(展平)
 该列表
 的升序版本


1
@粗野的谢谢。固定为+1个字节。
阿达姆

3

Perl 5,74 68 66字节

-6字节更改-p-n并使用say而不是$_=join"", -2字节,这要归功于Abigail使用\pL而不是[a-z]

s/\pL/($h{lc$&}+=1).=$&/gie;say sort{$a-$b||lc$a cmp lc$b}values%h

蒂奥

59个字节,以防每个字符出现不超过9个

s/\pL/($h{lc$&}+=1).=$&/gie;say sort{lc$a cmp lc$b}values%h

@Abigail,谢谢您,在第二个程序中,它是更新之后的一个疏忽
Nahuel Fouilleul

3

Python 2,116字节

def f(s):a=s.lower();return''.join(`n`+s[a.rfind(c)] for n,c in sorted((a.count(c),c)for c in set(a)if c.isalpha()))

在线尝试!


的输出Database Partitions Task不等于1b1D1e1k1n1o1P1r2i3s4T5a
mdahmoune

@mdahmoune谢谢,应该解决。
TF场

In the output, use the case of the last occurrence in the input你需要rfind,而不是find这个。...] for可以...]for弥补这一点。
ArBo



3

220个 196 206字节

func[s][a: charset[#"a"-#"z"#"A"-#"Z"]trim/all form sort/skip collect[foreach c sort
unique reverse rejoin parse s[collect[any[keep[a]| skip]]][i: 0
foreach d s[if(c% 32)=(d% 32)[i: i + 1]]keep i keep c]]2]

在线尝试!

感谢Shaggy发现错误。


1
@Shaggy感谢您指出这一点,我将尝试修复它。
Galen Ivanov


2

外壳,15个字节

与进口没有问题使用稻壳的时候,所以我们可以利用各种方便的功能,例如groupOnsortOntoLower等:

ṁ§:osL→ÖLSġÖ_f√

在线尝试全部尝试!

说明

ṁ§:(sL)→ÖLSġÖ_f√  -- example input: "Kitkat Tango"
              f√  -- `filter isAlpha`: "KitkatTango"
          S  _    -- apply _ to .. then ..
            Ö     -- | sortOn: `sortOn toLower`
           ġ      -- | groupOn: `groupOn toLower`
                  -- .. compose: `groupOn toLower . sortOn toLower`
                  -- `sortOn toLower` (stable): "aagiKknottT"
                  -- `groupOn toLower`: ["aa","g","i","Kk","n","o","ttT"]
        ÖL        -- `sortOn length` (stable): ["g","i","n","o","aa","Kk","ttT"]
ṁ                 -- map and flatten (`concatMap`)
 §                -- | fork argument ..
       →          -- | | `last`: ['g','i','n','o','a','k','T']
   (sL)           -- | | `show . length`: ["1","1","1","1","2","2","3"]
  :               -- | .. and `snoc`: ["1g","1i","1n","1o","2a","2k","3T"]
                  -- : "1g1i1n1o2a2k3T"

2

JavaScript(Node.js),127字节

s=>[...s].sort(o=(x,y)=>p(0+x,36)-p(0+y,36),p=parseInt).join``.match(/([a-z])\1*/ig).map(x=>(l=x.length)+x[l-1]).sort(o).join``

在线尝试!

  • parseInt(numberAsString, radix)将尝试解析字符串开头的整数。例如,parseInt('120px', 10)将输出120。解析失败时,它将返回NaN。我们将an连接'0'到每个字符的开头,因此它将返回0任何非数字字母字符。通过此算法,我们可以将相同的字母和非字母字符排序在一起。
  • sortjoin"Hello world!123"将成为" !123deHllloorw"。与的匹配/([a-z])\1*/ig将忽略任何非字母字符,并将字符串分成相同字母的大块。`。
  • map转换"aaa""3a"在这个问题需要。
  • 第二种使用与第一种相同的功能。就像我们期望的那样,由于采用了数字系统,因此"3b"它将小于"12a"以36为底的数字:它首先比较计数(n div 36),然后再比较字母(n mod 36)。
  • 最后join他们在一起。

JavaScript(Node.js),146字节

f=(s,...a)=>(s=s.replace(/[^a-z]/ig,''))?f(s.replace(RegExp(s[c=0],'ig'),x=>(l=++c+x,'')),...a,l):a.sort((x,y)=>p(x,36)-p(y,36),p=parseInt).join``

在线尝试!


为什么不提交较短的解决方案作为您的主要解决方案?另外,它可以缩短2个字节,因为它不是递归的。
毛茸茸的

@Shaggy Ah,完全忘了删除f=。第一个过去比较短。但由于OP要求输出的内容可能为空字符串,因此它又增加了4个字节。我只是把它们放在那里...
tsh

1
@Shaggy好吧,只是找出第二个可能更短。我把它放在第一位。
tsh

2

Java的10,223个 209 301字节

s->{int i=32,t;String M[]=new String[i],r,R="";for(var c:s)M[c%32]+=c>64&c<91|c>96&c<123?c:R;for(;i-->0;M[i]=(t=r.length()-4)>0?t+r.split(R)[t+3]:R)r=M[i]+R;java.util.Arrays.sort(M);for(var p:M)R+=p;return R;}

+92个字节,可解决单个字母超过9个的输入。

在线尝试。

说明:

s->{                        // Method with character-array parameter and String return-type
  int i=32,                 //  Index-integer, starting at 32
      t;                    //  Temp-integer, uninitialized
  String M[]=new String[i], //  Create a String-array of size 32, filled with null by default
         R="",              //  Result-String, starting empty
         r;                 //  Temp-String, uninitialized
  for(var c:s)              //  Loop over the characters of the input-array:
    M[c%32]+=               //   Append the string at index code-point of `c` modulo-32 with:
     c>64&c<91|c>96&c<123?  //    If the character is a letter:
      c                     //     Append the character
     :                      //    Else:
      R;                    //     Append an empty String
  for(;i-->0                //  Loop `i` in the range (32, 0]:
      ;                     //    After every iteration:
       M[i]=                //     Replace the String at index `i` with:
        (t=r.length()-4)    //      Set `t` to the length of String `r` minus 4
                            //      (the minus 4 is for the prepended "null")
         >0?                //      If this length minus 4 is larger than 0:
          t                 //       Set the String to this length minus 4
          +r.split(R)[t+3]  //       Appended with the last character of `r` as String
         :                  //      Else:
          R)                //       Make the String at index `i` empty
    r=M[i]                  //   Set `r` to the `i`'th String
          +R;               //  Converted to String
                            // (null becomes "null", to prevent NullPointerException-errors)
  java.util.Arrays.sort(M,  //  Now sort the array of Strings on:
   (a,b)->                  //   For each pair of two Strings:
     new Byte(              //    Convert the first String to a number
      (0+a).replaceAll("\\D",""))
                            //    after we've added a leading 0 and removed all non-digits
    .compareTo(             //   And compare it to:
     new Byte(              //    The second String converted to a number
      (0+b).replaceAll("\\D",""))));
                            //    after we've added a leading 0 and remove all non-digits
  for(var p:M)              //  Loop over the Strings of the array:
    R+=p;                   //   And append each to the result-String `R`
  return R;}                //  And finally return the result-String `R`

1
@Shaggy党..固定为92个字节的成本。> <会看到,如果我可以通过不使用比较排序,但手动排序我后来再次..高尔夫下来。
凯文Cruijssen

哎哟! 对于那个很抱歉!
毛茸茸的


2

迅速4.2.1 / Xcode的10.11054个 1050 1048 370 368 364字节

s.map{String($0)}.filter{$0.rangeOfCharacter(from:.letters) != nil}.reversed().reduce(into:[String:Int]()){d,s in if let l=[s.uppercased(),s.lowercased()].first(where:{d[$0] != nil}){d[l]=d[l]!+1}else{d[s]=1}}.sorted{let c=$0.value-$1.value;return c==0 ?$0.key.compare($1.key,options:.caseInsensitive) == .orderedAscending:c<0}.map{"\($0.value)\($0.key)"}.joined()

在线尝试!

@KevinCruijssen还删除了一些空格。


嗨,欢迎来到PPCG!我不知道斯威夫特,但似乎你忘了删除一些空间,你也可以打高尔夫球都false0>1true1>0在线尝试1027字节。可能会打更多的高尔夫球,就像if let v=$0.key.escaped(asASCII:0>1).lowercased().unicodeScalars.first?.value{return v<$1.key.value}else{return 0>1}您复制的高尔夫球一样,但我会将其留给真正了解Swift的人处理。
凯文·克鲁伊森

1
另外,如果您还没有看过,那么通读<all language> 高尔夫技巧Swift中的高尔夫技巧可能会很有趣。再次欢迎您,并祝您逗留愉快!:)
Kevin Cruijssen

您好@KevinCruijssen。谢谢你的提示,我删除true,并false从我的答案。
Roman Podymov

1
很好,从最初的1000多个字节开始,您已经打了很多高尔夫球。:)我看到在所有=-assigns 之后/之前可以删除的6个空格:在线尝试364个字节。入住愉快!:)
Kevin Cruijssen

1

木炭,30字节

F⌈Eβ№↧θιFβ¿⁼№↧θκ⊕ι⁺⊕ι§Φθ⁼↧λκ±¹

在线尝试!链接是详细版本的代码。说明:

F⌈Eβ№↧θι

遍历小写字母并在小写输入中找到最高字符数。在隐式范围内循环。(循环实际上从0转到,n-1因此每次使用时我都必须增加循环变量。)

Fβ

再次遍历小写字母。

¿⁼№↧θκ⊕ι

如果当前字母的计数等于外循环值...

⁺⊕ι§Φθ⁼↧λκ±¹

将当前计数与当前字母的最后一次出现并隐式打印。



1

NodeJS,299字节,-6字节,感谢@tsh

不是那么美丽,但它可以工作!

(x,l={},g=p=>p.charCodeAt(),q=p=>p.toLowerCase())=>Object.entries([...x[R='replace'](/[^a-z]/gi,'')].reduce((m,n)=>(r=q(n),l[r]=g(n)>96?1:0,{...m,[r]:-~m[r]}),{})).sort((a,b)=>a[1]^b[1]?a[1]-b[1]:g(q(a[0]))-g(q(b[0]))).map(([m,n])=>[n,m]).join``[R](/,/g,'')[R](/[a-z]/g,v=>l[v]?q(v):v.toUpperCase())

Javascript(ES8)(Firefox或Chrome),294字节,-1字节,感谢@tsh

使用新.flat方法,我可以节省10个字节:

(x,l={},g=p=>p.charCodeAt(),q=p=>p.toLowerCase())=>Object.entries([...x[R='replace'](/[^a-z]/gi,'')].reduce((m,n)=>(r=q(n),l[r]=g(n)>96?1:0,{...m,[r]:-~m[r]}),{})).sort((a,b)=>a[1]^b[1]?a[1]-b[1]:g(q(a[0]))-g(q(b[0]))).map(([m,n])=>[n,m]).flat().join``[R](/[a-z]/g,v=>l[v]?q(v):v.toUpperCase())

在线尝试:https : //repl.it/repls/ConcernedHorribleHypothesis


您好,欢迎来到PPCG。如果您提供了一种测试提交内容的方法,例如链接到在线解释器,那就太好了。
乔纳森·弗雷奇

@JonathanFrech我刚刚添加了测试用例,谢谢!
周姜

.replacex 3倍-> [R='replace][R]x 2倍
tsh

.charCodeAt(0)-> .charCodeAt()0默认设置)
tsh

@tsh非常感谢您提供的所有提示,我刚刚更新了答案!
周姜

1

[R 131个 129字节

cat(paste0(N<-by(X<-utf8ToInt(gsub('[^a-z]','',scan(,''),T)),G<-X%%32,length),L<-intToUtf8(by(X,G,tail,1),T))[order(N,L)],sep='')

在线尝试!


1

朱莉娅 1.0,158字节

¬t=(c=Dict();C=Dict();for i=eachmatch(r"\w",t);l=i.match;k=lowercase(l);c[k]=get(c,k,0)+1;C[k]=l;end;*(["$v$(C[k])" for (v,k)=sort([(v,k) for (k,v)=c])]...))

具有相同逻辑的原始非高尔夫版本:

function password(text)
    letter_counts = Dict()
    cases = Dict()

    for i in eachmatch(r"\w", text)
        letter = i.match[1]
        letter_key = lowercase(letter)
        letter_counts[letter_key] = get(letter_counts, letter_key, 0) + 1
        cases[letter_key] = letter
    end

    sorted_counts = sort([(value, key) for (key, value) in letter_counts])

    return string(["$v$(cases[k])" for (v,k) in sorted_counts]...)
end

在线尝试!


0

Perl 6,86 82字节

{[~] flat map *[0,2],sort map {+$^b,$^a,$b[*-1]},kv classify &lc,.comb: /<alpha>/}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.