새로운 비밀번호 아이디어 : 워드 워커


23

암호를 생성하는 새로운 방법을 생각했지만 장기적으로는 영리하지는 않지만 재미있는 코드 골프를 만들 수 있습니다.

일련의 단어를 취하면 비밀번호가 다음과 같이 생성됩니다.

  • n 번째 단어 에서 n 번째 문자를 선택하십시오.
  • 경우 n은 단어보다 큰, 계수 뒤로 계속

예:

This is a fun task!
T     s a  u      !

T는 첫 번째 문자
입니다. 두 번째
는 a입니다. 첫 번째 문자 이지만, 앞뒤로 이동하는 것도 세 번째 입니다. 두 번째 문자 는 두 번째 문자 이지만
역으로 계산되기 때문에 네 번째 문자 이기도합니다
! '작업'의 다섯 번째 문자입니다 최종 비밀번호에 포함됩니다.Tsau!

규칙

  • 입력은 문자열입니다
  • 문자열을 공백으로 분리하십시오. 다른 모든 문자는 포함해야합니다.
  • 대문자는 소문자와 동일하게 대문자로 유지해야합니다
  • 당신은 걸릴 n은 각 단어의 단계를 여기서 n은 더하기 하나는 전에 온 단어의 수는
  • 경우 n은 단어보다 큰, 당신은 당신이 시작을 공격하는 경우가 강화 될 때까지, 다시 앞으로 이동, 단어를 뒤로 단계해야한다 N
  • 첫 번째 문자와 마지막 문자는 한 번만 스텝되므로 예를 들어 일곱 번째 위치의 '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긴 문자열 (0 인덱스) 12 단어이며, 따라서 코드 문자는해야 t하지 o.

@Neil <s> 시퀀스가 ​​1 인덱싱되었습니다. 그렇지 않으면 첫 단어의 첫 글자로 시작할 수 없습니다. </ s> (나도 시도했습니다) 나의 나쁜, 지금 그것을 보았습니다
Troels MB Jensen

14
Tsau!에 대한 중국이다Fuck!
sergiol

1
또한 funnuff보다 funufun을 선택하기위한 스테핑 계획은 출력에서 ​​모음의 백분율을 증가시킵니다. 암호화 적으로 이것은 강력한 암호 생성기가 아닙니다.
Criggie

1
@Criggie 나는 그것을 사용 계획이없는,하지만 내가 말했듯이, 그것은 재미있는 도전을 만들 것, 그리고 골퍼가 동의 표시
Troels MB 젠슨

답변:





4

자바 10 148 117 114 110 바이트

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 덕분에 -31 바이트 . @SamYonnou 덕분에 -4 바이트 로 Java 알고리즘을 최적화했습니다.

온라인으로 사용해보십시오.

설명:

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.
Kevin 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++?(더 바이트 그렇게하지만 일을하지되어 저장) 설명이 유형에 좀 더 쉽게했다 있도록.
Kevin Cruijssen 2016 년

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의 마지막 매개 변수를 사용하지 않습니다.


나는 Charcoal이 가위 글리프를 사용하는 것을 좋아합니다
Jonah

3

자바 스크립트 (Node.js) , 78 70 69 68 bytes

-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 바이트 이하 로 바꿀 수 있습니다 .
Shieru Asakoto

106 자 : putchar( t[ j=strlen(t)-1, k = i++ % (j ? j*2 : 1), k<j ? k : j+j-k ]); 온라인으로 해보십시오!
user5329483

버퍼링 된 버전 : 전역 변수는 암시 적으로 0이됩니다. 교체 *u++와 함께 c[i]및 U을 제거합니다.
user5329483 2018 년

@ user5329483에 105 바이트 작성
ceilingcat



1

하스켈, 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)을
.

1

Stax , 9 바이트

éñ~╗D¡┤Gq

실행 및 디버깅

포장을 풀고 포장을 풀고 주석을 달았습니다.

j       split into words
{       start block for mapping
  cDrD  copy word; remove first and last character; reverse
  +     concatenate with original word
  i@    modularly (wrap-around) index using map iteration index
m       perform map

이것을 실행


1

PHP , 77 바이트

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

온라인으로 사용해보십시오!

  • Kevin 덕분에 -3 바이트
  • Titus 덕분에 -10 바이트

1
좋은 대답입니다! 골프에 대한 하나의 작은 일 : 당신은 변경하여 브래킷과 하나의 추가 세 번째 바이트 제거 할 수 foreach(...){$c=...;echo$c[...];}foreach(...)echo($c=...)[...];. 온라인으로 시도 : 87 바이트
Kevin Cruijssen

인수 목록을 사용하여 자동으로 단어 (-8 바이트)로 분할하고 .=2 바이트를 절약 while(ord($w=$argv[++$i]))echo($w.=strrev(substr($w,1,-1)))[~-$i%strlen($w)]; 할 수 있습니다. 온라인으로 시도
Titus

좋은! 한 가지 질문 : ~-$ i는 ($ i-1)과 동일합니까?
user2803033

0

파워 쉘 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에서 골프를 치기위한 팁을 보셨습니까 ?
briantist

감사! 게시 직후 스위치를 사용하는 것에 대해 생각했지만 나머지는 아직 발생하지 않았습니다.
피터 Vandivier

또한 실제 문제 중 하나는이 스 니펫의 어느 곳에서도 실제로 입력하지 않는다는 것입니다. 우리는 프로그램이나 함수를 작성할 수있는 융통성이 있지만 암시적인 입력을 가지고 있습니다. 첫 번째 단계로서 당신은 단순히 당신을 대체 할 수 ""|%{와 함께 $args|%{,하지만 난 당신이 너무 더 효과적으로 골프를 수 있다고 생각)
briantist

1
다음은 테스트 케이스에 인수 기능을 사용하는 방법을 보여주는 TIO의 데모입니다 . 코드에 대해서만 코드 블록을 유지하면 게시물에 TIO의 쉬운 링크 및 바이트 수를 사용할 수 있습니다!
briantist

0

J, 43 바이트

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

언 골프

[: (> {~"_1 #@> | i.@#) [: (, }.@}:)&.> [: <;._1 ' '&,
  • <;._1 ' '&, 공백으로 나누다
  • (, }.@}:)&.> 각 단어마다 첫 번째와 마지막 느릅 나무를 죽이고 단어를 추가하십시오.
  • #@> | i.@# 각 단어의 길이를 색인으로 나눈 나머지
  • > {~"_1 그 결과를 가져 와서 각 단어에서 뽑아냅니다.

온라인으로 사용해보십시오!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.