Розширена машина правди


17

Багато людей знають, що таке машина істини в програмуванні. Але настав час, коли ми розіб'ємо речі. Представляємо, розширену машину правди! Машина розширеної істини приймає дві речі як вхідні дані, ціле число nта непорожній рядок s. Він виводить s nрази за допомогою додаткового пробільного пробілу. Однак, якщо nдорівнює 0, ви повинні вивести, sпоки програма не буде зупинена вручну, тобто вона ніколи не повинна припинятися.

Крім того, якщо nце від’ємне число, то рядок потрібно змінити. Наприклад, з s=helloі n=-1, вихід буде olleh.

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

Випробування

n, s, output

5, "hello world", "hello worldhello worldhello worldhello worldhello world"
0, "PPCG", "PPCGPPCGPPCGPPCG..."
-2, "truThY", "YhTurtYhTurt"
2000, "o", "oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo"

Це , тому найкоротший код виграє!

Ось оригінальний пост у Sandbox До цього внесено зміни. Дякуємо перейти до @ComradeSparklePony за створення ідеї цього виклику

Відповіді:


3

Haskell, 57 54 байти

f 0=cycle
f n|n<0=f(-n).reverse|n>0=concat.replicate n

Пояснення:

f 0           -- If n=0 ..
 =cycle       -- infinitely repeat the input
f n|n<0       -- Otherwise, if n<0 ..
 =f(-n)       -- call f with the negative of n ..
 .reverse     -- and the reverse of the input
 |n>0         -- Finally, if n>0 ..
 concat       -- concatenate the result of ..
 .replicate n -- repeating the input n times

-3 байти завдяки @nimi


Ви можете використовувати -nзамість abs n.
німі


2

MATL , 37 байт

jXJiXI0=?`1wtwDw]}I0>?I:"t]x}PI|:"t]x

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

Пояснення:

j            % input string
XJ           % copy to clipboard J
i            % input
XI           % copy to clipboard I
0            % number literal
=            % is equal? (element-wise, singleton expansion)
?            % if
  `          % do...while
    1        % number literal
    w        % swap elements in stack
    t        % duplicate elements
    w        % swap elements in stack
    D        % convert to string and display / string representation
    w        % swap elements in stack
  ]          % end
}            % else
  I          % paste from clipboard I
  0          % number literal
  >          % is greater than? (element-wise, singleton expansion)
  ?          % if
    I        % paste from clipboard I
    :        % range; vector of equally spaced values
    "        % for
      t      % duplicate elements
    ]        % end
    x        % delete
  }          % else
    P        % flip the order of elements
    I        % paste from clipboard I
    |        % absolute value / norm / determinant
    :        % range; vector of equally spaced values
    "        % for
      t      % duplicate elements
    ]        % end
    x        % delete
             % (implicit) end
             % (implicit) end
             % (implicit) convert to string and display

1

Python 3, 71 байт

def f(n,s,k=1):
 if n<0:s=s[::-1];n=-n
 while n|k:print(end=s);n-=1;k=0

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

Змінна kгарантує, що цикл завжди виконується принаймні один раз. Це означає, що якщо n=0, тоді nбуде негатив на наступну ітерацію циклу, то цикл продовжить працювати вічно.


1

Матлаб, 87 байт

n=input('')
s=input('','s')
a=repmat(s,1,abs(n))
while~n s=[s s]
end
if n<0,flip(a)
end

Моя перша спроба коду-гольфу! Будь-які пропозиції щодо гольфу вітаються.


Ласкаво просимо на сайт! :)
DJMcMayhem

1

05AB1E , 17 16 14 байт

0‹iR}¹Ä×¹_i[²?

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

Пояснення:

0‹iR}¹Ä×¹_i[²?
0‹             Is the input negative?
  iR}          If so, reverse the second input.
     ¹Ä        Get the absolute value of the first input.
       ×       Repeat the string that many times.
        ¹_     Boolean NOT the first input. (Is the first input 0?)
          i    If so...
           [   Do forever...
            ²? Print the second input without a newline.

Збережено 2 байти завдяки @EriktheOutgolfer


Ви можете замінити '-åна 0‹і 0Qна _.
Ерік Аутгольфер

@EriktheOutgolfer Спасибі, відредаговано.
Товариш SparklePony

1

Cubix , 41 Сорок чотири 45 байт

Вводиться як " <N> <String>

.uq.sB.p$IA;p?;ouu(..!q/o()uq?..@<w?q<<_)

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

Кубіфіковано:

      . u q
      . s B
      . p $
I A ; p ? ; o u u ( . .
! q / o ( ) u q ? . . @
< w ? q < < _ ) . . . .
      . . .
      . . .
      . . .

Дивіться, як він працює

У коді все ще є кількість недозволених дій, з яких я можу отримати ще кілька байтів, але хотів отримати це, перш ніж розірвати його.

Основна процедура

  • I отримати лічильник від введення
  • A решту введення введіть як символи
  • ;p? видаліть пробіл, піднесіть номер і випробуйте його
    • psuqB$)якщо лічильник негативний, поверніть стек. Це включає обробку вхідного номера та маркера EOI (-1). Збільшення лічильника.
    • ;p;ouqu якщо лічильник дорівнює нулю, видаліть лічильник та маркер EOI і запустіть вічний цикл виводу.
    • ( якщо позитивне зменшення лічильника
  • <<q?/o()uвихідний контур. Це видасть кожен символ стека, поки не буде досягнуто маркера EOI (-1).
  • ... _ ... ?wq! на кінці маркера EOI, об’їжджайте куб і відбивайтеся назад до ? , міняйте смугу руху, опускайте маркер EOI на дно та перевіряйте лічильник.
  • @ якщо нуль, зупиніть
  • ?u( якщо позитивний поворот і зменшення, то злодій закінчується натисканням на початок циклу
  • ? ... <) якщо це негативно, пройдіться навколо куба до іншої сторони, перейдіть на початок циклу, переходячи через приріст.
  • /)< якщо від'ємний приріст і перейти до циклу виводу

це не спрацює, якщо рядок починається з числа?
Зруйнований лимон

Виправлено @DestructibleLemon
MickyT

0

JavaScript (ES6), 79 байт

 f=(n,s)=>n<0?f(-n,[...s].reverse().join``):(alert(!n?s:s.repeat(n)),!n&&f(n,s))

Фрагмент:

f=(n,s)=>n<0?f(-n,[...s].reverse().join``):(alert(!n?s:s.repeat(n)),!n&&f(n,s))

f(5, "hello world")
//f(0, "PPCG")  //uncomment this at your peril!!!
f(-2, "truThY")
f(2000, "o")


Я намагався зробити щось таке рекурсивне, як це, але не думав про !n&&нескінченність циклу. Однак, чи вдасться це досягти StackOverflow? it should never terminate.
Стівен

Він буде тривожно попереджати рядок PPCG. У Chrome (принаймні) я мушу вбити браузер, щоб зупинити його.
Рік Хічкок

Я розумію вашу думку. Я думаю, що мій код скористався б оптимізацією рекурсії хвостових викликів у браузерах, які його підтримують.
Рік Хічкок

Перевірте це за допомогою console.log. Я отримую помилку.
Стівен

Хм, ти абсолютно прав: (
Рік Хічкок

0

JavaScript (ES6), 98 94 91 83 байт

n=>s=>{s=n<0?[...s].reverse().join``:s;while(!n)l(s);l(s.repeat(n<0?-n:n))}

-4, -5 байт завдяки Арджуну

-3 байти завдяки Ріку Хічкоку

Почав відрізнятися від відповіді на Java , але швидко став дуже схожим після гри в гольф. Попередження нескінченне, але якщо ви хочете, щоб це виглядало приємно, перейдіть наconsole.log . l=alert;і виписування alertмають однакову довжину, але якщо ви перейдете на console.logкоротше, перегляньте її.


1
while(!n)l(s)замість if(!n)for(;;)l(s).
Арджун

2
[...s].reverse()замістьs.split''.reverse()
Рік Хічкок

@RickHitchcock Я завжди про це забуваю :(
Стівен

l(s.repeat(Math.abs(n)))замість forциклу нарешті.
Арджун

0

QBIC , 36 байт

Тут багато чого, і QBIC / QBasic просто не має синтаксису, щоб елегантно впоратися з такими умовами.

~:<0|;=_fA}[abs(a)|Z=Z+A]~a|_X}{?A';

Пояснення:

~:<0|       IF cmd line arg 'a' is negative
  ;=_fA         Make cmd line arg A$ into its reverse
}           Close the IF (this eliminates the need for a | fuction terminator on _f)
[abs(a)|    FOR b = 1 to (abs(a) (hammering out negatives)
  Z=Z+A         Add A$ to Z$ (on exit, Z$ is printed explicitly)
]           NEXT
~a|_X       IF a is non-zero, terminate the program
}           END IF
{?A';       If we're here, just start a DO-loop and keep on printing the input.

0

Java (OpenJDK 8) , 137 байт

void f(String[] a){for(long n=Long.valueOf(a[0]),i=0;n==0|i++<Math.abs(n);)System.out.print(n<0?new StringBuilder(a[1]).reverse():a[1]);}

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


Це схоже на фрагмент, а не на повну програму, яка заборонена консенсусом громади .
Esolanging Fruit

Відповідно до публікації, яку ви пов’язували, "За замовчуванням має бути" програми чи функції "" . Тому, оскільки ОП прямо не заявила, що вони хочуть повну програму, я оновив свою відповідь. Тепер він складається з методу .
Bashful Beluga

0

str , 30 байт

I#Lbd0<[_u_][d0='e'u#?]#?xo;db

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

Пояснення

I#Lbd0<[_u_][d0='e'u#?]#?xo;db
...........................;      preamble
I                                 read number
 #L                               read rest of STDIN
   b                              buffer the STDIN
    d                             duplicate number
     0<[   ]           #?         if the number is less than zero
        _                         negate that number
         u_                       and reverse STDIN from buffer
            [         ]           otherwise
             d0='e  #?            if its 0, push the empty string
                  'u              otherwise, push the unbuffered STDIN untouched
                         x        repeat STDIN by the TOS
                          o       and output
                           ;..    main program (only activates when input = 0)
                            d     duplicate the implicitly unbuffered STDIN
                             b    and rebuffer it
                                  implicitly displayed

0

C (gcc) , 115 112 109 107 104 байт

f(n,s,l,p,d)char*s;{d=n<0?-1:1;do for(l=1,p=0;p>=0;p+=l)s[p]?d==l&&putchar(s[p]):l--;while(!n||(n-=d));}

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

Хто сказав, що нам потрібно strlen?

C (gcc) , 115 байт (134 зі #include<string.h>спереду)

#include<string.h>
f(n,s)char*s;{int l=strlen(s),d=n<0?0:2,m=d--,p;do for(p=m?0:l-1;p!=(m?l:-1);p+=d)putchar(s[p]);while(!n||(n-=d));}

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

Без цього #include<string.h>ми не маємо неявного прототипу для strlenцього повернення int, але strlenє size_t(принаймні, нині не зовсім впевнений у відношенні k & r чи c89, але я вважаю, він повернувсяint за старих часів).

Відсутнє #include <stdio.h>не є проблемою, оскільки завдяки цілому просуванню, прототипом за замовчуванням буде int putchar(int)саме те, що ми хочемо.


0

Сітківка , 49 байт

/¶-/&V`^.+
/¶0/&//+>G0`
~`(.+)¶-*(\d+)
.-$2+>K`$1

Формат введення: приймає рядок, а потім новий рядок, а потім число.

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

Пояснення:

/¶-/&V`^.+

/¶-/&Запускає цю лінію , тільки якщо число є негативним. Vє зворотним етапом, і він обертається ^.+, що відповідає рядку ( .відповідає кожному символу, крім нових рядків).

/¶0/&//+>G0`

/¶0/&Запускає цю лінію , тільки якщо число дорівнює 0. //+>запускає нескінченний цикл, який друкує робочу рядок після кожної ітерації. G0бере рядок і відкидає номер; це робить це нескінченно, друкуючи кожен раз.

~`...

Це позначає код, який буде генерувати рядок; програма оцінює рядок як код Retina після.

(.+)¶-*(\d+)
.-$2+>K`$1

(.+)¶-*(\d+)відповідає всій рядку і ставить рядок у групу захоплення 1 та число у групі захоплення 2. .-$2+>K` $1генерує код Retina для запуску: . вимикає неявний вихід (інакше рядок буде надруковано n + 1 раз), -$2+встановлює цикл повторення що повторюється {група захоплення 2} разів. Мінус на початку перетворює число в негативне число, оскільки це вимикає функціонал конвергенції в циклі, який зупинить його після 1-ї ітерації. >встановлює цю петлю для друку після кожної ітерації. Решта коду - просто надрукувати рядок.


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