Расширенная машина правды


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"

Это , поэтому выигрывает самый короткий код!

Вот оригинальный пост Песочницы. В него были внесены изменения. Спасибо @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.
Nimi


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

Matlab, 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с _.
Эрик Outgolfer

@EriktheOutgolfer Спасибо, отредактировано.
Товарищ SparklePony

1

Cubix , 41 Сорок четыре 45 байтов

Принимает вход как <N> <String>

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

Попробуйте онлайн!

Cubified:

      . 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

Согласно сообщению, на которое вы ссылаетесь, «по умолчанию должны быть« программы или функции »» . Поэтому, поскольку OP явно не указали, что им нужна полная программа, я обновил свой ответ. Теперь он состоит из метода .
Застенчивая Белуга

0

ул , 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.