新しいパスワードのアイデア:Word-walker


23

私は自分のパスワードを生成する新しい方法を考えました。おそらく長期的にはあまり賢くないかもしれませんが、それでも楽しいコードゴルフを作ることができます。

単語の文字列を取得すると、パスワードは次のように生成されます。

  • n番目の単語のn番目の文字を選択します
  • もしnは言葉よりも大きい場合、逆方向に数え続けます

例:

This is a fun task!
T     s a  u      !

Tは最初の文字
sは2番目の
aは最初ですが、前後に進むと3番目の
u も2番目ですが、逆方向にカウントするため4番目の
'!'でもあります 「task!」の5番目のキャラクターです したがって、最終パスワードに含まれます。Tsau!

ルール

  • 入力は文字列になります
  • 文字列をスペースで区切ります。他のすべての文字を含める必要があります
  • 大文字は小文字のままで、大文字のままにする必要があります
  • あなたは取るn個のステップの各単語に、どこのnの前に来ている単語の数プラス1であります
  • 場合は、nは言葉よりも大きい場合、あなたが開始をヒットした場合、あなたが強化しているまで、あなたは再び前進し、単語を逆方向にステップしなければならないのn
  • 最初と最後の文字は一度だけステップされるため、例として7番目の位置の「fun」は「funufun」になり、「funnuff」ではなくnで終了し、fで終了します
  • 出力は文字列でなければなりません

例:

Input              Output
Once Upon A Time   OpAe
There was a man    Taaa
Who made a task    Waak
That was neat!     Taa
This is a long string to display how the generator is supposed to work  Tsagnoyotoipto

バイト単位の最短コードが勝ちです!


3
toは長い文字列の12番目の単語(0から始まる)であるため、コード文字はtでなくである必要がありoます。
ニール

@Neil <s>シーケンスは1から始まります。そうでない場合、最初の単語の最初の文字から始めることはできません</ s>(試しました)私の悪いことがわかりました
Troels MB Jensen

14
Tsau!中国語ですFuck!
セルジオル

1
また、funnuffよりfunufunを選択するためのステッピングプランは、出力の母音の割合を増やします。暗号的には、これは強力なパスワードジェネレーターではありません。
クリギー

1
@Criggie私はそれを使用することを意図したことがないが、私が言ったように、それは楽しい挑戦のためになるだろう、ゴルファーが同意することが表示されます
Troels MBジェンセンを

回答:





4

Java 10、148 117 114110バイト

s->{int i=-1,j;for(var a:s.split(" "))System.out.print(a.charAt((j=a.length()-1)>0*i++?i/j%2<1?i%j:j-i%j:0));}

@ user71546のJavaScript回答のポートを作成して@SamYonnouに感謝します。再び@SamYonnouの おかげで、Javaのアルゴリズムを最適化する-4バイト。

オンラインでお試しください。

説明:

s->{                            // Method with String parameter and no return-type
  int i=-1,                     // Step integer, starting at -1
      j;                        // Temp integer
  for(var a:s.split(" "))       // Loop over the parts split by spaces
    System.out.print(           // Print:
     a.charAt((j=a.length()-1)  //  Set `j` to the the length of the part minus 1
               >0               //  If the length of the part is larger than 1 (`j` > 0)
                 *i++?          //  (and increase `i` by 1 in the process with `i++`)
                i/j%2<1?        //   If `i` integer-divided by `j` is even:
                 i%j            //    Print the character at index `i` modulo-`j`
                :               //   Else:
                 j-i%j          //    Print the character at index `j` minus `i` modulo-`j`
               :                //  Else:
                0));}           //   Print the first (and only) character
                                //   (the >0 check is added to prevent divided-by-0 errors)

テストケース0、2、および5では機能しません
TFeld

1
user71546のバージョンが実行しているように見える「より算術的なアプローチを使用して」117までゴルフダウン:s->{int i=-1,j;for(var a:s.split(" ")){System.out.print(a.charAt(++i>(j=a.length()-1)?j>0?i/j%2==0?i%j:j-i%j:0:i));}}
SamYonnou

1
@SamYonnouありがとう!そして、ブラケットを削除してに変更==0することで、さらに3バイトをゴルフすることができました<1
ケビンCruijssen

1
++i>(j=a.length()-1)その条件の結果に関係なく数学は同じように機能するため、条件を取り除くことで110までゴルフをしましたs->{int i=-1,j;for(var a:s.split(" "))System.out.print(a.charAt(0<(j=a.length()+i-++i)?i/j%2<1?i%j:j-i%j:0));}
。– SamYonnou

1
@SamYonnouありがとうございます!少し変更0<(j=a.length()+i-++i)?した(j=a.length()-1)>0*i++?ので、説明は入力が少し楽になりました(ただし、バイトは保存されません)。
ケビンCruijssen

3

、16バイト

⭆⪪S §⁺ι✂ι±²¦⁰±¹κ

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

  S                 Input string
 ⪪                  Split on spaces
⭆                   Map over words and join
      ι ι           Current word
       ✂ ±²¦⁰±¹     Slice backwards from 2nd last character to start exclusive
     ⁺              Concatenate
    §          κ    Cyclically index on current word index
                    Implicitly print

Sliceの最後のパラメーターを使用することはあまりありません。


私はチャコールがハサミのグリフを使用しているのが好きです
ジョナ

3

JavaScript(Node.js)78 70 69 68バイト

-1バイト@Arnauld

x=>x.split` `.map((y,i)=>y[a=i%(l=y.length-1)|0,i/l&1?l-a:a]).join``

オンラインでお試しください!

説明

x=>
 x.split` `                    // Split the words by spaces
 .map((y,i)=>                  // For each word:
  y[                           //  Get the character at index:
                               //   A walk has cycle of length (2 * y.length - 2)
   a=i%(l=y.length-1)|0,       //   Calculate index a = i % (y.length - 1)
   i/l&1                       //   Check in which half the index i in
   ?l-a                        //   If in the second half of cycle, use y.length - 1 - a
   :a                          //   If in the first half of cycle, use a                  
  ]
 ).join``                      // Join back the letters

2

、135バイト

func[s][n: 0 p: copy""foreach w split s" "[append/dup r: copy""append w
reverse copy/part next w back tail w n: n + 1 append p r/(n)]p]

オンラインでお試しください!

読みやすい:

f: func[s][
    n: 0
    p: copy ""
    foreach w split s "  "[
        r: copy ""
        append/dup r append w reverse copy/part next w back tail w n: n + 1
        append p r/(n)
    ]
    p
]



1

Pyth、12バイト

s.e@+b_Ptbkc

オンラインで試す

s.e@+b_PtbkcQ   Final Q (input) implicit

           cQ   Split on spaces
 .e             Map the above with b=element, k=index
       Ptb        Remove 1st and last character
      _           Reverse
    +b            Prepend the unaltered element ('abcd' -> 'abcdcb')
   @      k       Get the kth character (0 indexed, wrapping)
s               Join on empty string, implicit output

1

Japt 、、-P11バイト

¸Ëê ŪD gEÉ

それを試してみてください

¸Ë+s1J w)gE

それを試してみてください


説明

¸Ëê ŪD gEÉ
¸               :Split on spaces
 Ë              :Map over each element D at index E
  ê             :  Palindromise
    Å           :  Slice off the first character
     ªD         :  Logical OR with the original element (the above will return an empty string for single character words)
        g       :  Get the character at index
         EÉ     :  E-1
¸Ë+s1J w)gE
¸               :Split on spaces
 Ë              :Map over each element D at index E
   s1J          :  Slice off the first and last characters
       w        :  Reverse
  +     )       :  Append to D
         gE     :  Get the character at index E

1

C(gcc)、148バイト(文字列バージョン)、114バイト(印刷バージョン)

文字列を返す必要がある場合(長いバージョン):

char c[99]={0};char*f(s,t,u,i,j,k)char*s,*t,*u;{for(u=c,i=0;t=strtok(s," ");s=0,i++)*u++=t[j=strlen(t),k=2*j-(j>1)-1,(i%k<j?i%k:k-i%k)%j];return c;}

オンラインでお試しください!

それ以外の場合は、印刷するだけで、バッファーの心配はありません(短いバージョン):

f(s,t,i,j,k)char*s,*t;{for(i=0;t=strtok(s," ");s=0,i++)putchar(t[j=strlen(t),k=2*j-(j>1)-1,(i%k<j?i%k:k-i%k)%j]);}

オンラインでお試しください!


-(j>1)-1+~(j>1)私は思う1バイト少ないと置き換えることができます。
朝琴シエル

106文字:putchar( t[ j=strlen(t)-1, k = i++ % (j ? j*2 : 1), k<j ? k : j+j-k ]); オンラインで試してみてください!
user5329483

バッファバージョン:グローバル変数は暗黙的にゼロになります。uで置き換え*u++c[i]削除します。
user5329483

@ user5329483上に構築さ105バイト
ceilingcat



1

Haskell、65 62 61バイト

zipWith(\i->(!!i).cycle.(id<>reverse.drop 1.init))[0..].words

オンラインでお試しください!

この機能Preludeを備えた最新バージョンが必要です<>

                   words    -- split the input string into a list of words
zipWith(\i->     )[0..]     -- zip the elements i of [0..] and the words pairwise
                            -- with the function      
      ... <> ...            --   call the functions with a word and concatenate
                            --   the results. The functions are
        id                  --     id: do nothing
        reverse.drop 1.init --     drop last and first element and reverse
    cycle                   --   repeat infinitely
(!!i)                       -- take the ith elemnt of  

編集:@ user28667のおかげで-3バイト、@ Bのおかげで-1バイト。メタ


zipWith(\i w->(cycle$id<>reverse.drop 1.init$w)!!i)[0..].words動作するように見えます。
user28667

1
あなたはにラムダを変更することにより、別のバイトを保存することができ\i->(!!i).cycle.(id<>reverse.drop 1.init)、明示的な外ファクタリングw言及(TIO)
B.メータ


1

PHP、77バイト

while(ord($w=$argv[++$i]))echo($w.=strrev(substr($w,1,-1)))[~-$i%strlen($w)];

オンラインでお試しください!

  • ケビンのおかげで-3バイト
  • Titusのおかげで-10バイト

1
いい答えだ!ゴルフに対する一つの小さなこと:あなたが変更することにより、ブラケットと一つの追加の3番目のバイトを取り除くことができますforeach(...){$c=...;echo$c[...];}foreach(...)echo($c=...)[...];オンラインで試してください:87バイト
ケビンクルーイッセン

あなたは(-8バイト)の単語に分割し、自動的に引数リストを使用し、できる.=2つのバイトを保存します。while(ord($w=$argv[++$i]))echo($w.=strrev(substr($w,1,-1)))[~-$i%strlen($w)]; オンラインそれを試してみてください
タイタス

いいね!1つの質問:〜-$ iは($ i-1)と同じですか?
user2803033

0

PowerShellの208 186 170バイト

$args|%{$i=0;-join($_.Split()|%{$l=($b=($a=$_)).Length;if($l-gt2){$b=($a|%{-join$a[($l-2)..1]})}for($j=0;$a.Length-le$i;$j++){$a+=($b,$_)[$j%2]}$a.Substring($i,1);$i++})}

ゴルフをしていない:

$args|%{
   $i=0;
    -join($_.Split()|%{
        $l=($b=($a=$_)).Length;
        if($l-gt2){
            $b=($a|%{-join$a[($l-2)..1]})
        }
        for($j=0;$a.Length-le$i;$j++){
            $a+=($b,$_)[$j%2]
        }
        $a.Substring($i,1);
        $i++
    })
}

以下のテストケースまたはオンラインで試す

@(
    "This is a fun task!",
    "Once Upon A Time",
    "There was a man",
    "Who made a task",
    "That was neat",
    "This is a long string to display how the generator is supposed to work"
)|%{$i=0;-join($_.Split()|%{$l=($b=($a=$_)).Length;if($l-gt2){$b=($a|%{-join$a[($l-2)..1]})}for($j=0;$a.Length-le$i;$j++){$a+=($b,$_)[$j%2]}$a.Substring($i,1);$i++})}

1
ここではもっと短くすることができます。PowerShellでのゴルフのヒントをご覧になりましたか?
ブリアンティスト

ありがとう!私は投稿直後にスイッチを使用することを考えていましたが、残りはまだ私には発生していませんでした。
ピーターヴァンディヴィエ

また、実際の問題の1つは、このスニペットのどこにも入力を実際に受け取らないことです。私たちはプログラムや関数を書くことができますが、あなたのものは暗黙的な入力を持っています。最初のステップとして、あなたは単にあなた""|%{と交換するかもしれません$args|%{が、私はあなたがそれをより効果的にゴルフすることもできると思います;)
ブリアンティスト

1
TIOのデモでは、テストケースの引数機能の使用方法も示しています。コードのコードブロックを保持するだけで、投稿にTIOの簡単なリンクとバイトカウントを使用できます。
ブリアンティスト

0

J、43バイト

[:(>{~"_1#@>|i.@#)[:(,}.@}:)&.>[:<;._1' '&,

食べない

[: (> {~"_1 #@> | i.@#) [: (, }.@}:)&.> [: <;._1 ' '&,
  • <;._1 ' '&, スペースで分割
  • (, }.@}:)&.> 各単語について、最初と最後のニレを殺し、単語に追加します
  • #@> | i.@# 各単語の長さの残りをインデックスに分割します
  • > {~"_1 その結果を取り、各単語からそれを摘み取ります。

オンラインでお試しください!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.