Erweiterte Wahrheitsmaschine

17

Viele Leute wissen, was eine Wahrheitsmaschine in der Programmierung ist. Aber es ist an der Zeit, die Dinge in Schwung zu bringen. Wir stellen vor, die erweiterte Wahrheitsmaschine! Eine erweiterte Wahrheitsmaschine nimmt zwei Dinge als Eingabe, eine Ganzzahl nund eine nicht leere Zeichenfolge s. Es gibt s nZeiten mit optionalem abschließendem Leerzeichen aus. Wenn njedoch gleich ist 0, müssen Sie so lange ausgeben, sbis das Programm manuell gestoppt wird, dh es sollte niemals beendet werden.

Wenn nes sich um eine negative Zahl handelt, muss die Zeichenfolge umgekehrt werden. Zum Beispiel mit s=hellound n=-1, Ausgabe wäre olleh.

Standard-Eingabemethoden, jede Art von Ausgabe, solange sie mit unendlich umgehen kann. Wenn Sie eine Antwort haben, die nicht unendlich ist, können Sie sie gerne posten, wenn sie interessant ist oder in einer Sprache, die nicht unendlich ist.

Testfälle

n, s, output

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

Das ist , also gewinnt der kürzeste Code!

Hier ist der ursprüngliche Sandbox-Beitrag. Es wurden Änderungen vorgenommen. Vielen Dank an @ComradeSparklePony für die Idee dieser Herausforderung

Caird Coinheringaahing
quelle

Antworten:

3

Haskell, 57 54 Bytes

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

Erläuterung:

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 Bytes dank @nimi

BlackCap
quelle
Sie können -nanstelle von verwenden abs n.
Nimi
2

PHP> = 7.1, 67 Bytes

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

Version mit list(,$x,$y)statt [,$x,$y] online ausprobieren!

Jörg Hülsermann
quelle
2

MATL , 37 Bytes

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

Probieren Sie es online!

Erläuterung:

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
quelle
1

Python 3, 71 Bytes

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

Probieren Sie es online!

Die Variable kgarantiert, dass die Schleife immer mindestens einmal ausgeführt wird. Dies bedeutet, dass wenn n=0, dann nbei der nächsten Iteration der Schleife negativ ist, so dass die Schleife für immer weiter ausgeführt wird.

Esolanging Fruit
quelle
1

Matlab, 87 Bytes

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

Mein erster Versuch, Code-Golf zu spielen! Anregungen zum Golfen sind willkommen.

J Doe
quelle
Willkommen auf der Seite! :)
DJMcMayhem
1

05AB1E , 17 16 14 Bytes

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

Probieren Sie es online!

Erläuterung:

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 Bytes gespart dank @EriktheOutgolfer

Genosse SparklePony
quelle
Sie können '-åmit 0‹und 0Qmit ersetzen _.
Erik der Outgolfer
@EriktheOutgolfer Danke, bearbeitet.
Genosse SparklePony
1

Cubix , 41 Vierundvierzig 45 Bytes

Übernimmt die Eingabe als <N> <String>

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

Probieren Sie es online!

Cubified:

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

Schau es dir an

Es gibt immer noch eine Menge No-Ops im Code, aus denen ich vielleicht ein paar Bytes mehr herausholen kann, aber ich wollte das aufklären, bevor ich es kaputt mache.

Grundlegende Vorgehensweise ist

  • I Zähler vom Eingang holen
  • A Nehmen Sie den Rest der Eingabe als Zeichen
  • ;p? entferne das Leerzeichen, rufe die Zahl auf und teste sie
    • psuqB$)Wenn der Zähler negativ ist, kehren Sie den Stapel um. Dies beinhaltet die Behandlung der Eingangsnummer und des EOI-Markers (-1). Erhöhe den Zähler.
    • ;p;ouqu Wenn der Zähler Null ist, entfernen Sie den Zähler und den EOI-Marker und starten Sie die ewige Ausgabeschleife.
    • ( Wenn positiv, den Zähler dekrementieren
  • <<q?/o()udie Ausgangsschleife. Dies gibt jedes Zeichen des Stapels aus, bis der EOI-Marker (-1) erreicht ist.
  • ... _ ... ?wq!Gehen Sie am Ende des EOI-Markers um den Würfel herum und reflektieren Sie zum ?, wechseln Sie die Spur, lassen Sie den EOI-Marker nach unten fallen und testen Sie den Zähler.
  • @ wenn null, halt
  • ?u( Wenn Sie sich positiv wenden und dekrementieren, wird der Anfang der Schleife erreicht
  • ? ... <) Wenn dies negativ ist, gehen Sie um den Würfel herum zur anderen Seite und leiten Sie ihn an den Anfang der Schleife weiter, während Sie über ein Inkrement fahren.
  • /)< wenn negativ inkrementieren und weiter zur Ausgangsschleife
MickyT
quelle
Funktioniert dies nicht, wenn die Zeichenfolge mit einer Zahl beginnt?
Destructible Lemon
@ DestructibleLemon behoben
MickyT
0

JavaScript (ES6), 79 Byte

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

Snippet:

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
quelle
Ich habe versucht, so etwas rekursives zu machen, aber ich habe nicht daran gedacht, eine !n&&Endlosschleife zu machen. Wird dies jedoch irgendwann zu einem StackOverflow führen? it should never terminate.
Stephen
Der String PPCG wird wiederholt alarmiert. In Chrome (zumindest) muss ich den Browser beenden, um es zu stoppen.
Rick Hitchcock
Ich verstehe deine Meinung. Ich denke, mein Code würde die Optimierung der Endanruf-Rekursion in Browsern nutzen, die dies unterstützen.
Rick Hitchcock
Testen Sie es mit console.log. Ich bekomme eine Fehlermeldung.
Stephen
Hmm, Sie haben absolut Recht: (
Rick Hitchcock
0

JavaScript (ES6), 98 94 91 83 Byte

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

-4, -5 Bytes dank Arjun

-3 Bytes dank Rick Hitchcock

Begann anders als die Java-Antwort , wurde aber nach dem Golfen schnell sehr ähnlich. Alert ist unendlich, aber wenn Sie möchten, dass es schön aussieht, wechseln Sie zu console.log. l=alert;und Ausschreiben alertsind gleich lang, aber wenn Sie zu wechseln, ist console.loges kürzer, um es neu zu definieren.

Stephen
quelle
1
while(!n)l(s)statt if(!n)for(;;)l(s).
Arjun
2
[...s].reverse()statts.split''.reverse()
Rick Hitchcock
@ RickHitchcock Ich vergesse immer darüber :(
Stephen
l(s.repeat(Math.abs(n)))statt forendlich Schleife.
Arjun
0

QBIC , 36 Bytes

Hier ist viel los, und QBIC / QBasic hat einfach nicht die Syntax, um mit solchen Bedingungen elegant umzugehen.

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

Erläuterung:

~:<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
quelle
0

Java (OpenJDK 8) , 137 Byte

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

Probieren Sie es online!

Schüchterner Beluga
quelle
Dies sieht eher nach einem Ausschnitt als nach einem vollständigen Programm aus, das vom Konsens der Community abgelehnt wird .
Esolanging Fruit
Laut dem Beitrag, den Sie verlinkt haben, sollte der Standard "Programme oder Funktionen" sein . Aus diesem Grund habe ich meine Antwort aktualisiert , da OP nicht ausdrücklich erklärt hat, dass ein vollständiges Programm gewünscht wird . Es besteht nun aus einer Methode .
Bashful Beluga
0

str , 30 bytes

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

Probieren Sie es online!

Erläuterung

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
quelle
0

C (gcc) , 115 112 109 107 104 Bytes

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

Probieren Sie es online!

Wer hat gesagt, wir brauchen strlen?

C (gcc) , 115 Bytes (134 mit #include<string.h>vorne)

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

Probieren Sie es online!

Ohne #include<string.h>wir einen impliziten Prototyp bekommen , strlendass die Renditen int, sondern strlensind size_t(zumindest heute nicht vollkommen sicher k & r oder c89, aber ich glaube, kehrte es intin den alten Tagen).

Das Fehlen #include <stdio.h>ist kein Problem, da aufgrund der Ganzzahlpromotion der Standardprototyp genau int putchar(int)das ist, was wir wollen.

Bodo Thiesen
quelle
0

Netzhaut , 49 Bytes

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

Eingabeformat: Übernimmt die Zeichenfolge, gefolgt von einer neuen Zeile, gefolgt von der Zahl.

Probieren Sie es online!

Erläuterung:

/¶-/&V`^.+

Der /¶-/&führt diese Zeile nur aus, wenn die Zahl negativ ist. Vist die umgekehrte Phase, und es kehrt sich um ^.+, was der Zeichenfolge entspricht ( .entspricht jedem Zeichen mit Ausnahme von Zeilenumbrüchen).

/¶0/&//+>G0`

Das /¶0/&führt diese Zeile nur aus, wenn die Zahl 0 ist. Startet //+>eine Endlosschleife, die den Arbeitsstring nach jeder Iteration ausgibt. G0Nimmt die Zeichenfolge und verwirft die Nummer. es macht das unendlich und druckt jedes Mal.

~`...

Dies markiert den Code, der eine Zeichenfolge generiert. Das Programm wertet den String als Retina-Code aus.

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

(.+)¶-*(\d+)die Zeichenfolge entspricht die gesamte Zeichenfolge und setzt in der Gruppe 1 die Erfassung und die Anzahl in Gruppe 2.e Erfassung .-$2+>K` $1erzeugt der Retina Code ausgeführt werden: . impliziten Ausgang abschaltet (sonst die Zeichenfolge gedruckt werden würde , n + 1 - mal), -$2+setzt eine Wiederholungsschleife das wiederholt sich {Capturing Group 2} mal. Das Minus am Anfang verwandelt die Zahl in eine negative Zahl, da dies die Konvergenzfunktionalität in der Schleife deaktiviert, die sie nach der ersten Iteration stoppen würde. >Legt fest, dass diese Schleife nach jeder Iteration gedruckt wird. Der Rest des Codes dient nur zum Drucken der Zeichenfolge.

lolad
quelle
0

Perl 6 , 44 Bytes

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

Probieren Sie es online!

Anonymer Codeblock, der eine Zahl und eine Zeichenfolge akzeptiert und eine (möglicherweise unendliche) Liste zurückgibt

Scherzen
quelle