Ide Kata Sandi Baru: Word-walker


23

Saya memikirkan cara baru untuk menghasilkan kata sandi saya, dan meskipun itu mungkin tidak terlalu pintar dalam jangka panjang, itu masih bisa menjadi kode-golf yang menyenangkan.

Mengambil serangkaian kata, kata sandi dibuat sebagai berikut:

  • Pilih karakter ke - n di kata ke - n
  • Jika n lebih besar dari kata, lanjutkan menghitung mundur

Contoh:

This is a fun task!
T     s a  u      !

T adalah karakter pertama
s adalah yang kedua
adalah yang pertama, tetapi bolak-balik itu juga yang ketiga
adalah yang kedua tetapi karena menghitung mundur itu juga yang keempat
'!' adalah karakter kelima dalam 'tugas!' dan dengan demikian akan dimasukkan dalam kata sandi akhir,Tsau!

Aturan

  • Input akan berupa string
  • Memisahkan string pada spasi, semua karakter lain harus disertakan
  • Huruf besar harus tetap huruf besar, sama dengan huruf kecil
  • Anda mengambil langkah n di setiap kata, di mana n adalah jumlah kata yang telah datang sebelum ditambah satu
  • Jika n lebih besar dari kata, Anda harus melangkah mundur menelusuri kata, jika Anda menekan awal, Anda maju lagi sampai Anda telah melangkah n kali
  • Karakter pertama dan terakhir hanya dilangkah satu kali, jadi 'asyik' pada posisi ketujuh sebagai contoh berjalan 'funufun' dan berakhir di n, bukan 'funnuff' dan berakhir di f
  • Output harus berupa string

Contoh:

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

Kode terpendek dalam byte menang!


3
toadalah kata ke-12 (0-diindeks) dalam string panjang, dan karena itu huruf kode harus t, bukan o.
Neil

@Neil <s> urutannya adalah 1-diindeks, jika tidak Anda tidak dapat mulai dengan huruf pertama pada kata pertama </s> (saya mencoba) yang salah, saya melihatnya sekarang
Troels MB Jensen

14
Tsau!adalah bahasa Cina untukFuck!
sergiol

1
Juga rencana lompatan Anda untuk memilih funufun daripada funnuff akan meningkatkan persentase vokal dalam output. Secara kriptografis, ini bukan penghasil kata sandi yang kuat.
Criggie

1
@Criggie Saya tidak pernah bermaksud menggunakannya, tetapi seperti yang saya katakan, itu akan menjadi tantangan yang menyenangkan, dan tampaknya para pegolf setuju
Troels MB Jensen

Jawaban:



7

05AB1E , 11 byte

#vyN©Fû}®è?

Cobalah online!

Penjelasan

#             # split input on spaces
 vy           # for each word in input
   N©F        # N times do, where N is the current iteration
      û}      # palendromize the word
        ®è    # use N to index into the resulting word
          ?   # print


4

Java 10, 148 117 114 110 byte

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 byte terima kasih kepada @SamYonnou dengan membuat port dari jawaban JavaScript @ user71546 .
-4 byte berkat @SamYonnou lagi, mengoptimalkan algoritma untuk Java.

Cobalah online.

Penjelasan:

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)

Tidak berfungsi untuk kasus uji 0, 2 dan 5
TFeld

1
bermain golf ke 117 "menggunakan pendekatan yang lebih aritmatika" mirip dengan apa yang tampaknya dilakukan versi pengguna71546: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 Terima kasih! Dan saya sudah bisa bermain golf tiga byte lagi dengan melepas tanda kurung dan mengganti ==0ke <1.
Kevin Cruijssen

1
++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));}
bermain golf

1
@ SamYonnou Terima kasih lagi! Aku sudah sedikit berubah 0<(j=a.length()+i-++i)?ke (j=a.length()-1)>0*i++?sehingga penjelasan sedikit lebih mudah untuk tipe (tidak ada byte yang disimpan melakukannya namun).
Kevin Cruijssen

3

Arang , 16 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

  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

Saya tidak sering menggunakan parameter terakhir Slice.


Saya suka bahwa Arang menggunakan mesin terbang gunting
Jonah

3

JavaScript (Node.js) , 78 70 69 68 byte

-1 byte @Arnauld

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

Cobalah online!

Penjelasan

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

Merah , 135 byte

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]

Cobalah online!

Dapat dibaca:

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 byte

s.e@+b_Ptbkc

Cobalah online

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 byte

¸Ëê ŪD gEÉ

Cobalah

¸Ë+s1J w)gE

Cobalah


Penjelasan

¸Ëê Ū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 byte (versi string), 114 byte (versi cetak)

Jika saya harus mengembalikan sebuah string (versi panjang):

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

Cobalah online!

Kalau tidak, saya hanya mencetak dan tidak khawatir tentang buffer (versi pendek):

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

Cobalah online!


-(j>1)-1dapat diganti +~(j>1)dengan 1 byte lebih sedikit saya pikir.
Shieru Asakoto

106 karakter: putchar( t[ j=strlen(t)-1, k = i++ % (j ? j*2 : 1), k<j ? k : j+j-k ]); Cobalah online!
user5329483

Versi yang disangga: Variabel global secara implisit memusatkan perhatian. Ganti *u++dengan c[i]dan hapus u.
user5329483

Membangun @ user5329483 105 bytes
ceilingcat

1

AWK, 79 byte

Terutama karena saya penasaran melihat solusi awk atau bash yang lebih baik!

{for(i=1;i<=NF;i++){l=length($i);k=int(i/l)%2?l-i%l:k%l;printf substr($i,k,1)}}

Cobalah online!



1

Haskell, 65 62 61 byte

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

Cobalah online!

Ini membutuhkan versi terbaru Preludeyang memiliki <>fungsi.

                   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  

Sunting: -3 byte terima kasih kepada @ user28667, -1 byte terima kasih kepada @B. Mehta


Sepertinya zipWith(\i w->(cycle$id<>reverse.drop 1.init$w)!!i)[0..].wordsjuga berfungsi.
user28667

1
Anda dapat menyimpan byte lain dengan mengubah lambda untuk \i->(!!i).cycle.(id<>reverse.drop 1.init)memfaktorkan keluar wpenyebutan eksplisit (TIO)
B. Mehta

1

Stax , 9 byte

éñ~╗D¡┤Gq

Jalankan dan debug itu

Dibongkar, tidak diserang, dan dikomentari, sepertinya ini.

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

Jalankan yang ini


1

PHP , 77 byte

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

Cobalah online!

  • -3 byte terima kasih kepada Kevin
  • -10 byte berkat Titus

1
Jawaban bagus! Satu hal kecil untuk golf: Anda dapat menyingkirkan tanda kurung dan satu byte ketiga tambahan dengan mengubahnya foreach(...){$c=...;echo$c[...];}menjadi foreach(...)echo($c=...)[...];. Cobalah secara online: 87 byte
Kevin Cruijssen

Anda dapat menggunakan daftar argumen untuk secara otomatis dipisah menjadi kata-kata (-8 byte), dan .=menyimpan dua byte: while(ord($w=$argv[++$i]))echo($w.=strrev(substr($w,1,-1)))[~-$i%strlen($w)]; coba online
Titus

Bagus! Satu pertanyaan: ~ - $ i melakukan hal yang sama dengan ($ i-1), kan?
user2803033

0

Powershell 208 186 170 byte

$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++})}

Tidak Disatukan:

$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++
    })
}

Uji kasus di bawah ini atau coba online

@(
    "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
Ada banyak yang bisa Anda buat lebih pendek di sini. Pernahkah Anda melihat tips untuk bermain golf di PowerShell ?
briantist

Terima kasih! Saya berpikir untuk menggunakan sakelar tepat setelah memposting, tetapi sisanya belum terpikir oleh saya.
Peter Vandivier

Satu masalah sebenarnya di sini adalah Anda tidak benar-benar mengambil input di mana pun di cuplikan ini. Kami cukup fleksibel untuk bisa menulis sebuah program atau fungsi, tetapi Anda memiliki input implisit. Sebagai langkah pertama Anda mungkin hanya mengganti ""|%{dengan Anda $args|%{, tapi saya pikir Anda bisa bermain golf lebih efektif juga;)
briantist

1
Berikut ini adalah demonstrasi di TIO yang juga menunjukkan cara menggunakan fitur argumen untuk kasus uji . Menyimpan blok kode hanya untuk kode Anda juga memungkinkan Anda menggunakan penghubung mudah dan jumlah byte TIO untuk pos Anda!
briantis

0

J, 43 byte

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

ungolfed

[: (> {~"_1 #@> | i.@#) [: (, }.@}:)&.> [: <;._1 ' '&,
  • <;._1 ' '&, berpisah pada spasi
  • (, }.@}:)&.> untuk setiap kata, bunuh elm pertama dan terakhir dan tambahkan kata
  • #@> | i.@# ambil sisa dari setiap panjang kata yang dibagi ke dalam indeksnya
  • > {~"_1 ambil hasil itu dan ambil dari setiap kata.

Cobalah online!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.