แนวคิดรหัสผ่านใหม่: Word-walker


23

ฉันคิดถึงวิธีใหม่ในการสร้างรหัสผ่านของฉันและแม้ว่ามันอาจจะไม่ฉลาดในระยะยาว แต่ก็ยังสามารถสร้างรหัสกอล์ฟที่สนุกได้

การสร้างชุดคำศัพท์รหัสผ่านจึงถูกสร้างขึ้น:

  • เลือกที่ nตัวละครในที่ nคำ
  • หากnมีขนาดใหญ่กว่าคำนั้นให้นับถอยหลังต่อไป

ตัวอย่าง:

This is a fun task!
T     s a  u      !

T คือตัวอักษรตัวแรก
คือที่สอง
เป็นครั้งแรก แต่จะกลับมาก็ยังเป็นคนที่สาม
ยูเป็นครั้งที่สอง แต่เป็นเพราะย้อนหลังนับก็ยังสี่
'!' เป็นตัวละครที่ห้าใน 'task!' และจะรวมอยู่ในรหัสผ่านสุดท้ายTsau!

กฎระเบียบ

  • อินพุตจะเป็นสตริง
  • แยกสตริงบนช่องว่างต้องรวมอักขระอื่นทั้งหมด
  • ตัวอักษรตัวพิมพ์ใหญ่ต้องเป็นตัวพิมพ์ใหญ่เช่นเดียวกับตัวพิมพ์เล็ก
  • คุณใช้nก้าวในแต่ละคำโดยที่nคือจำนวนคำที่มาก่อนบวกหนึ่งคำ
  • หากnมีขนาดใหญ่กว่าคำว่าคุณจะต้องย้อนกลับผ่านคำว่าถ้าคุณเริ่มต้นคุณจะไปข้างหน้าอีกครั้งจนกว่าคุณจะก้าวnครั้ง
  • อักขระตัวแรกและตัวสุดท้ายจะถูกเหยียบเพียงครั้งเดียวดังนั้น 'สนุก' ในตำแหน่งที่เจ็ดเป็นตัวอย่างไป 'funufun' และสิ้นสุดที่ n ไม่ใช่ 'funnuff' และลงท้ายด้วย 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

@Neil <s> ลำดับเป็น 1 ดัชนีมิฉะนั้นคุณจะไม่สามารถเริ่มต้นด้วยตัวอักษรตัวแรกของคำแรก </s> (ฉันลอง) แย่มากฉันเห็นแล้วตอนนี้
Troels MB Jensen

14
Tsau!เป็นภาษาจีนสำหรับFuck!
sergiol

1
นอกจากนี้แผนก้าวของคุณสำหรับการเลือก funufun ผ่าน funnuff จะเพิ่มเปอร์เซ็นต์ของสระในผลลัพธ์ การเข้ารหัสลับนี่ไม่ใช่ตัวสร้างรหัสผ่านที่คาดเดายาก
Criggie

1
@Criggie ฉันไม่เคยตั้งใจที่จะใช้มัน แต่อย่างที่ฉันบอกว่ามันจะทำให้ความท้าทายที่สนุกและปรากฏว่านักกอล์ฟเห็นด้วย
Troels MB Jensen

คำตอบ:





4

Java 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));}

-31 ไบต์ขอบคุณที่@SamYonnouโดยการสร้างพอร์ตของ@ user71546 's คำตอบ
-4 bytes ขอบคุณ@SamYonnouอีกครั้งการปรับอัลกอริทึมสำหรับ 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
golfed ลงไปที่ 117 "ใช้วิธีการทางคณิตศาสตร์มากขึ้น" คล้ายกับสิ่งที่ผู้ใช้รุ่น 71546 ดูเหมือนว่าจะทำ: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 <1
Kevin Cruijssen

1
golfed ถึง 110 โดยการกำจัดของ++i>(j=a.length()-1)สภาพเนื่องจากคณิตศาสตร์ทำงานในลักษณะเดียวกันโดยไม่คำนึงถึงผลของเงื่อนไขนั้น: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

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 บ่อยนัก


ฉันชอบถ่านที่ใช้รูปสัญลักษณ์กรรไกร
Jonah

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




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 -P,, 11 ไบต์

¸Ëê Ū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

รุ่นบัฟเฟอร์: ตัวแปรทั่วโลกเป็นศูนย์โดยปริยาย แทนที่*u++ด้วยc[i]และลบ u
user5329483

สิ่งปลูกสร้างบน @ user5329483 105 bytes
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  

แก้ไข: -3 ไบต์ขอบคุณ @ user28667, -1 ไบต์ขอบคุณ @B เมธา


ดูเหมือนว่า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. Mehta

1

Stax , 9 ไบต์

éñ~╗D¡┤Gq

เรียกใช้และแก้ไขข้อบกพร่อง

คลายกล่อง ungolfed และแสดงความคิดเห็นมันมีลักษณะเช่นนี้

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)];

ลองออนไลน์!

  • -3 ไบต์ขอบคุณ Kevin
  • -10 ไบต์ขอบคุณ Titus

1
คำตอบที่ดี! สิ่งหนึ่งที่มีขนาดเล็กเพื่อกอล์ฟ: คุณจะได้รับการกำจัดของวงเล็บและหนึ่งไบต์ที่สามเพิ่มเติมโดยการเปลี่ยนไปforeach(...){$c=...;echo$c[...];} ลองใช้งานออนไลน์: 87 ไบต์foreach(...)echo($c=...)[...];
Kevin Cruijssen

คุณสามารถใช้รายการอาร์กิวเมนต์เพื่อแยกเป็นคำโดยอัตโนมัติ (-8 bytes) และ.=บันทึกสองไบต์: while(ord($w=$argv[++$i]))echo($w.=strrev(substr($w,1,-1)))[~-$i%strlen($w)]; ลองออนไลน์
23918 Titus

ดี! คำถามหนึ่งข้อ: ~ - $ 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++})}

Ungolfed:

$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หรือไม่
ต้มตุ๋น

ขอบคุณ! ฉันคิดจะใช้สวิตช์หลังจากโพสต์แล้ว แต่ที่เหลือยังไม่เกิดขึ้นกับฉัน
Peter Vandivier

อีกหนึ่งปัญหาที่เกิดขึ้นจริงที่นี่คือคุณไม่ได้ป้อนข้อมูลที่ใดก็ได้ในตัวอย่างนี้ เราค่อนข้างยืดหยุ่นเกี่ยวกับความสามารถในการเขียนโปรแกรมหรือฟังก์ชั่น แต่คุณมีอินพุตโดยปริยาย เป็นขั้นตอนแรกคุณก็อาจแทนที่""|%{ด้วยของคุณ$args|%{แต่ฉันคิดว่าคุณสามารถเล่นกอล์ฟได้อย่างมีประสิทธิภาพมากขึ้นเช่นกัน)
briantist

1
นี่คือการสาธิตใน TIO ที่ยังแสดงให้เห็นถึงวิธีการใช้ข้อโต้แย้งมีสำหรับกรณีทดสอบ การบล็อกโค้ดไว้สำหรับโค้ดของคุณเท่านั้นยังช่วยให้คุณใช้การเชื่อมโยงและการนับจำนวนไบต์แบบง่ายของ TIO สำหรับโพสต์ของคุณ!
ต้มตุ๋น

0

J, 43 ไบต์

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

ungolfed

[: (> {~"_1 #@> | i.@#) [: (, }.@}:)&.> [: <;._1 ' '&,
  • <;._1 ' '&, แบ่งออกเป็นช่องว่าง
  • (, }.@}:)&.> สำหรับแต่ละคำให้ฆ่าต้นเอล์มตัวแรกและตัวสุดท้ายแล้วต่อท้ายคำ
  • #@> | i.@# ใช้เวลาที่เหลือของความยาวของแต่ละคำแบ่งออกเป็นดัชนี
  • > {~"_1 รับผลลัพธ์นั้นและถอนออกจากแต่ละคำ

ลองออนไลน์!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.