Нова ідея пароля: Word-Walker


23

Я подумав про новий спосіб генерувати свої паролі, і, хоча це, мабуть, не дуже розумно в довгостроковій перспективі, все-таки це могло б зробити веселим кодом-гольф.

Взявши рядок слів, пароль генерується таким чином:

  • Доберіть n-го символу до n-го слова
  • Якщо n більше слова, продовжуйте відлік назад

Приклад:

This is a fun task!
T     s a  u      !

Т - перший символ
s - другий
a - перший, але повернення вперед і назад це також третє
u - друге, але через підрахунок назад це також четверте
"!" - п’ятий персонаж у "завданні!" і таким чином буде включено до остаточного пароля,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 <s> послідовність є 1-індексованою, інакше не можна починати з першої літери першого слова </s> (я спробував) моє погано, я бачу це зараз
Troels MB Jensen

14
Tsau!є китайською мовоюFuck!
сергіол

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 , створивши порт відповіді на JavaScript @ user71546 .
-4 байти завдяки @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
гольф вниз до 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));}}
user71546

1
@SamYonnou Дякую! І мені вдалося переграти ще три байти, знявши дужки і змінивши ==0на <1.
Кевін Круїссен

1
гольфував до 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.


Мені подобається, що деревне вугілля використовує ножичний гліф
Іона

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,, -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 ]); Спробуйте онлайн!
користувач5329483

Завантажена версія: Глобальні змінні неявно занульовані. Замінити *u++з c[i]і видалити і.
user5329483

Розробляється на @ user5329483 105 байт
roofcat



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також працює.
користувач28667

1
Ви можете зберегти ще один байт, змінивши лямбду на \i->(!!i).cycle.(id<>reverse.drop 1.init)виділення явної wзгадки (TIO)
Б. Мехта,

1

Стакс , 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)];

Спробуйте в Інтернеті!

  • -3 байти завдяки Кевіну
  • -10 байт завдяки Титу

1
Гарна відповідь! Одна невелика річ, що стосується гольфу: ви можете позбутися дужок і ще один третій байт, змінивши foreach(...){$c=...;echo$c[...];}на foreach(...)echo($c=...)[...];. Спробуйте в Інтернеті: 87 байт
Кевін Кройсейсен

Ви можете використовувати список аргументів для автоматичного поділу на слова (-8 байт) і .=зберігає два байти: while(ord($w=$argv[++$i]))echo($w.=strrev(substr($w,1,-1)))[~-$i%strlen($w)]; спробуйте його в Інтернеті
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++})}

Безголівки:

$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 ?
британіст

Спасибі! Я думав про використання перемикача відразу після публікації, але решта мені ще не прийшло в голову.
Пітер Вандів'є

Також однією актуальною проблемою є те, що ви насправді не берете жодного місця в цьому фрагменті. Ми досить гнучкі щодо того, щоб можна було написати програму чи функцію, але у вас є неявний вклад. В якості першого кроку ви можете просто замінити ваш ""|%{з $args|%{, але я думаю , що ви можете грати в гольф це більш ефективно теж;)
briantist

1
Ось демонстрація в TIO, яка також показує, як використовувати функцію аргументів для тестових випадків . Зберігаючи блок коду лише для свого коду, ми також дозволимо використовувати просте зв’язування та кількість байтів TIO для своєї публікації!
британіст

0

J, 43 байти

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

неозорий

[: (> {~"_1 #@> | i.@#) [: (, }.@}:)&.> [: <;._1 ' '&,
  • <;._1 ' '&, розділити на пробіли
  • (, }.@}:)&.> за кожне слово вбийте першого та останнього в'яза та додайте до слова
  • #@> | i.@# візьміть залишок довжини кожного слова, поділений на його індекс
  • > {~"_1 візьміть цей результат і відірвіть його від кожного слова.

Спробуйте в Інтернеті!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.