Maszyna o rozszerzonej prawdzie

17

Wiele osób wie, czym jest maszyna prawdy w programowaniu. Ale nadszedł czas, abyśmy podnieśli poziom. Przedstawiamy maszynę o rozszerzonej prawdzie! Maszyna o rozszerzonej prawdzie przyjmuje dwie rzeczy jako dane wejściowe, liczbę całkowitą ni niepusty ciąg s. Wyprowadza s nczasy z opcjonalnymi końcowymi spacjami. Jeśli jednak njest równy 0, musisz wyprowadzać dane wyjściowe, sdopóki program nie zostanie ręcznie zatrzymany, tzn. Nigdy nie powinien się kończyć.

Ponadto, jeśli njest liczbą ujemną, ciąg musi zostać odwrócony. Na przykład za pomocą s=helloi n=-1, wyjście byłoby olleh.

Standardowe metody wprowadzania, każdy rodzaj wyniku, o ile może on obsługiwać nieskończoność. Jeśli masz odpowiedź, która nie obsługuje nieskończoności, możesz ją opublikować, jeśli jest interesująca lub w języku, który nie obsługuje nieskończonych wyników.

Przypadki testowe

n, s, output

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

To jest , więc wygrywa najkrótszy kod!

Oto oryginalny post w piaskownicy. Wprowadzono w nim zmiany. Podziękowania dla @ComradeSparklePony za stworzenie pomysłu na to wyzwanie

Cairney Coheringaahing
źródło

Odpowiedzi:

3

Haskell, 57 54 bajtów

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

Wyjaśnienie:

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 bajty dzięki @nimi

Gajówka
źródło
Możesz użyć -nzamiast abs n.
nimi
2

PHP> = 7,1, 67 bajtów

for([,$x,$y]=$argv,$z=$x<=>0;!$z||$x;$x-=$z)echo$x<0?strrev($y):$y;

Wersja z list(,$x,$y)zamiast [,$x,$y] Wypróbuj online!

Jörg Hülsermann
źródło
2

MATL , 37 bajtów

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

Wypróbuj online!

Wyjaśnienie:

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
J Doe
źródło
1

Python 3, 71 bajtów

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

Wypróbuj online!

Zmienna kgwarantuje, że pętla jest zawsze uruchamiana przynajmniej raz. Oznacza to, że jeśli n=0, to nprzy następnej iteracji pętli będzie ujemny, więc pętla będzie działać wiecznie.

Esolanging Fruit
źródło
1

Matlab, 87 bajtów

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

Moja pierwsza próba golfa kodowego! Wszelkie sugestie dotyczące gry w golfa są mile widziane.

J Doe
źródło
Witamy na stronie! :)
DJMcMayhem
1

05AB1E , 17 16 14 bajtów

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

Wypróbuj online!

Wyjaśnienie:

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.

Zaoszczędzono 2 bajty dzięki @EriktheOutgolfer

Towarzyszu SparklePony
źródło
Można wymienić '-åz 0‹i 0Qz _.
Erik the Outgolfer
@EriktheOutgolfer Dzięki, edytowane.
Towarzysz SparklePony,
1

Cubix , 41 Czterdzieści cztery 45 bajtów

Pobiera dane wejściowe jako <N> <String>

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

Wypróbuj online!

Cubified:

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

Zobacz, jak działa

W kodzie wciąż jest wiele braków, z których mógłbym być w stanie wydobyć jeszcze kilka bajtów, ale chciałem to zrobić, zanim go zepsuję.

Podstawowa procedura to

  • I uzyskać licznik z danych wejściowych
  • A weź resztę danych wejściowych jako znaki
  • ;p? usuń spację, podnieś numer i przetestuj go
    • psuqB$)jeśli licznik jest ujemny, odwróć stos. Obejmuje to obsługę numeru wejściowego i znacznika EOI (-1). Zwiększ licznik.
    • ;p;ouqu jeśli licznik jest równy zero, usuń licznik i znacznik EOI i rozpocznij ciągłą pętlę wyjściową.
    • ( jeśli dodatnie zmniejszenie licznika
  • <<q?/o()upętla wyjściowa. Spowoduje to wyświetlenie każdego znaku na stosie, aż do osiągnięcia znacznika EOI (-1).
  • ... _ ... ?wq!na końcu znacznika EOI, obejdź sześcian i odbij z powrotem na ?, zmień pas, upuść znacznik EOI na dół i przetestuj licznik.
  • @ jeśli zero, zatrzymaj się
  • ?u( jeśli pozytywne zawracanie i zmniejszanie się, kończy się na początku pętli
  • ? ... <) w przypadku wartości ujemnej przejdź dookoła sześcianu na drugą stronę, przekieruj na początek pętli, przechodząc obok przyrostu.
  • /)< w przypadku przyrostu ujemnego i przejść do pętli wyjściowej
MickyT
źródło
czy to nie działa, jeśli ciąg zaczyna się od liczby?
Zniszczalna Lemon
@DestructibleLemon naprawiony
MickyT
0

JavaScript (ES6), 79 bajtów

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

Skrawek:

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")

Rick Hitchcock
źródło
Próbowałem zrobić coś takiego rekurencyjnego, ale nie myślałem o !n&&zapętleniu w nieskończoność. Czy to jednak ostatecznie wpłynie na StackOverflow? it should never terminate.
Stephen
Ostrzeże ciąg PPCG wielokrotnie. W Chrome (przynajmniej) muszę wyłączyć przeglądarkę, aby ją zatrzymać.
Rick Hitchcock
Rozumiem twój punkt widzenia. Myślę, że mój kod skorzystałby z optymalizacji rekurencji wywołania ogona w przeglądarkach, które go obsługują.
Rick Hitchcock,
Przetestuj za pomocą console.log. Dostaję błąd.
Stephen
Hmm, masz absolutną rację: (
Rick Hitchcock,
0

JavaScript (ES6), 98 94 91 83 bajtów

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

-4, -5 bajtów dzięki Arjunowi

-3 bajty dzięki Rickowi Hitchcockowi

Zaczynałem inaczej niż odpowiedź Java , ale szybko stał się bardzo podobny po golfie. Alert jest nieskończony, ale jeśli chcesz, aby ładnie wyglądał, przełącz się na console.log. l=alert;i wypisywanie alertma taką samą długość, ale jeśli przełączysz console.logna krótszy, możesz go przedefiniować.

Stephen
źródło
1
while(!n)l(s)zamiast if(!n)for(;;)l(s).
Arjun
2
[...s].reverse()zamiasts.split''.reverse()
Rick Hitchcock
@ RickHitchcock Zawsze o tym zapominam :(
Stephen
l(s.repeat(Math.abs(n)))forw końcu zamiast pętli.
Arjun
0

QBIC , 36 bajtów

Wiele tu się dzieje, a QBIC / QBasic po prostu nie ma składni, aby elegancko radzić sobie z takimi warunkami.

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

Wyjaśnienie:

~:<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.
Steenbergh
źródło
0

Java (OpenJDK 8) , 137 bajtów

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

Wypróbuj online!

Lękliwa Beluga
źródło
To wygląda jak fragment kodu, a nie pełny program, który jest odrzucany przez konsensus społeczności .
Esolanging Fruit
Zgodnie z postem, który podlinkowałeś, „Domyślnie powinny to być„ programy lub funkcje ”” . Dlatego, ponieważ OP nie stwierdził wprost, że chcą pełnego programu, zaktualizowałem swoją odpowiedź. Teraz składa się z metody .
Lękliwa Beluga
0

str , 30 bajtów

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

Wypróbuj online!

Wyjaśnienie

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
Conor O'Brien
źródło
0

C (gcc) , 115 112 109 107 104 bajtów

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

Wypróbuj online!

Kto powiedział, że potrzebujemy strlen?

C (gcc) , 115 bajtów (134 z #include<string.h>przodu)

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

Wypróbuj online!

Bez #include<string.h>otrzymamy niejawny prototyp dla strlentych zwrotów int, ale tak strlenjestsize_t (przynajmniej w dzisiejszych czasach, nie do końca pewny co do K&R lub C89, ale wierzę, że zwróciłint w dawnych czasach).

Brakowanie #include <stdio.h>nie stanowi problemu, ponieważ ze względu na promocję liczb całkowitych domyślnym prototypem będzie int putchar(int)dokładnie to, czego chcemy.

Bodo Thiesen
źródło
0

Siatkówka , 49 bajtów

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

Format wejściowy: pobiera ciąg, po którym następuje nowa linia, a następnie liczba.

Wypróbuj online!

Wyjaśnienie:

/¶-/&V`^.+

/¶-/&Uruchamia tę linię tylko jeśli liczba jest ujemna. Vjest odwrotnym etapem i odwraca ^.+, który pasuje do łańcucha ( .pasuje do każdego znaku oprócz znaków nowej linii).

/¶0/&//+>G0`

/¶0/&Biegnie tej linii tylko wtedy, gdy liczba 0. //+>rozpoczyna nieskończoną pętlę, która drukuje ciąg roboczych po każdej iteracji. G0bierze ciąg i odrzuca liczbę; robi to nieskończenie, drukując za każdym razem.

~`...

Oznacza kod, który wygeneruje ciąg; program ocenia ciąg jako kod Retina później.

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

(.+)¶-*(\d+)dopasowuje cały ciąg i umieszcza ciąg w grupie przechwytywania 1, a liczbę w grupie przechwytywania 2. .-$2+>K` $1generuje kod Retina do uruchomienia: . wyłącza niejawne wyjście (w przeciwnym razie ciąg zostanie wydrukowany n + 1 razy), -$2+ustawia pętlę powtarzania to się powtarza {przechwytywanie grupy 2} razy. Minus na początku zamienia liczbę na liczbę ujemną, ponieważ wyłącza to funkcję konwergencji w pętli, co zatrzymałoby ją po pierwszej iteracji. >ustawia tę pętlę do drukowania po każdej iteracji. Reszta kodu to tylko wydrukowanie ciągu.

lolad
źródło
0

Perl 6 , 44 bajtów

{[$^s.flip,$s,$s Zxx-$^n,Inf,$n][$n.sign+1]}

Wypróbuj online!

Anonimowy blok kodu, który pobiera liczbę i ciąg znaków i zwraca listę (być może nieskończoną)

Jo King
źródło