Mehrmals quine


16

Ihre Aufgabe ist es, ein Programm zu erstellen, das Folgendes tut:

  1. Sie sollten die Nummer nehmen. (Positiv, Negativ, Bruch ist Eingabe möglich)
  2. Wenn es negativ ist, kehren Sie das Quine um. und negiere diese Zahl (Werde positiv)
  3. Dann wiederholen Sie <ganzzahliger Teil der Eingabenummer> Mal und drucken <Etage (Bruchteil der Eingabenummer * Länge)> aus Ihrem Quellprogramm. Wenn es eine Ganzzahl ist, ist der Bruchteil Null.

-10% Bonus, wenn Ihr Programm kein Palindrom ist.

Beispiel

Wenn Ihr Programm "ABCDEFG" ist, dann

1.

5
ABCDEFGABCDEFGABCDEFGABCDEFGABCDEFG

Erläuterung

ABCDEFG fünfmal

2.

-2
GFEDCBAGFEDCBA

Erläuterung

GFEDCBA (umgekehrt ABCDEFG) 2 mal

3.

7.5
ABCDEFGABCDEFGABCDEFGABCDEFGABCDEFGABCDEFGABCDEFGABCDEFGABC

Erläuterung

ABCDEFG 7-mal gefolgt von ABC (erste 3 (Etage (0,5 * 7) = Etage (3,5) = 3) Buchstabe auf ABCDEFG)

4.

-0.3
GF

Erläuterung

GFEDCBA (umgekehrtes ABCDEFG) 0-mal gefolgt von GF (erster 2 (Etage (0,3 * 7) = Etage (2,1) = 2) Buchstabe auf GFEDCBA (umgekehrtes ABCDEFG))

5.

0
<empty>

Erläuterung:

<leer> bedeutet hier, dass Ihr Programm nicht ausgegeben wird. ABCDEFG ist nullmal als leere Zeichenfolge definiert.


Könnten Sie bitte die Anweisungen klären?
LegionMammal978


@ LegionMammal978 Ich bin eigentlich schlecht darin, etwas auszudrücken, aber ich hoffe, es wird es klarer machen.
Akangka

2
@ mbomb007 Ich denke, Sie können die Zeichenfolge selbst analysieren -und .manuell verarbeiten (wobei der Bruch als positive ganze Zahlen dargestellt wird). Oder Sie können Ihre Aufmerksamkeit auf die nächste Herausforderung lenken. ;) (Nicht jede Sprache kann an jeder Herausforderung teilnehmen, aber solange die Herausforderung nicht absichtlich einzelne Sprachen ausschließt, ist das völlig in Ordnung. Denken Sie nur an alle Herausforderungen bei der Audio- / Bildverarbeitung oder beim Dateisystem.)
Martin Ender

1
Es wäre logischer gewesen, Sendungen mit Palindromen einen Bonus von 10% zu gewähren
Bassdrop Cumberwubwubwub

Antworten:


8

CJam, 28 26 Bytes * 0,9 = 23,4

Danke an Sp3000 für das Speichern von 2 Bytes.

{`"_~"+rd_z26*,\g1|@%f=}_~

Teste es hier.

Erläuterung

{`"_~"+ e# Generalised quine framework. Leaves the source code on the stack.
  rd    e# Read input and parse as double.
  _z    e# Copy and get absolute value.
  26*   e# Multiply by 26, the length of the quine to get length N of the output.
  ,     e# Get a range [0 1 ... floor(N-1)].
  \g    e# Swap with other copy and computer signum to determine direction of string.
  1|    e# This might be zero though, so take bitwise OR with 1 to avoid an error.
  @%    e# Pull up source string. Reverse it if the signum was -1 (no-op otherwise).
  f=    e# The range we pushed earlier corresponds to the (cyclic) indices of the source
        e# which make up the desired result, so we map each index to the corresponding
        e# character to get the final result.
}_~

5

Vitsy, 34 * 0,9 = 30,6 Bytes

Vielen Dank an @ Sp3000 für den Hinweis auf einen Fehler in meinem Code!

Woo. Mein Physiklehrer erinnerte mich daran, dass ich Machtfunktionen hatte, die mir dabei halfen. Stelle dir das vor.

'r (; Vd3 * V2 ^ 12 / ^ DvV / 1 + (rvl1 - * \ [DO {]
Starten Sie die Aufnahme als Zeichenfolge - dies packt alles und schiebt es als Zeichenfolge auf den Stapel.
 r Kehren Sie die Stapelreihenfolge um.
  (; Wenn das oberste Element Null ist, beenden Sie das Programm.
    V Erfassen Sie die Eingabe als endgültige globale Variable.
     d3 * Schiebe das Zeichen 'auf den Stapel.
        V2 ^ 12 / ^ Ermittelt den absoluten Wert des Eingabewerts.
               Dv Duplizieren und in einer temporären Variablen speichern.
                 V Verschieben Sie die globale Variable in den Stapel.
                  / Teilen Sie die beiden obersten Elemente auf - dies ergibt -1 oder 1, abhängig von der Polarität des Eingangs.
                   1+ (Wenn es -1 ist, mache die nächste Anweisung. Andernfalls nicht.
                      r Drehen Sie den Stapel um
                       v Legen Sie die temporäre Variable in den Stapel.
                        l1- * Mit der Länge des Stapels minus 1 multiplizieren.
                            \ [] Wiederhole alles, was in Klammern als oberstes Element der Stapelzeiten steht.
                              DO {Ein Objekt duplizieren, vom Stapel nehmen und ausgeben, dann ein Objekt im Stapel verschieben.

2

Perl, 104 Bytes - 10% = 93,6

perl -i-0.3 -e '$_=q{$_="\$_=q{$_};eval";$_=reverse if$^I<0;$n=abs$^I;print+($_ x$n).substr$_,0,y///c*($n-int$n)};eval'

102 Bytes + 2 Bytes für -i- 10%, da es sich nicht um ein Palindrom handelt. Die Eingabe wird als Argument an übergeben -i(z -0.3. B. oben).

Wie es funktioniert

Diese Lösung basiert auf dem folgenden Quine:

$_=q{print"\$_=q{$_};eval"};eval

Das funktioniert wie folgt. Stellen Sie $_zunächst die Zeichenfolge ein:

print"\$_=q{$_};eval"

Als nächstes rufen Sie an eval, was $_standardmäßig funktioniert . Dies ruft printmit einem Argument ein Zeichenkettenliteral auf:

"\$_=q{$_};eval"

Da diese Zeichenfolge in doppelte Anführungszeichen eingeschlossen ist, werden Variablen interpoliert. Nach der Interpolation $_lautet der Wert der Zeichenfolge:

\$_=q{print"\$_=q{$_};eval"};eval

Beim Drucken wird Folgendes ausgegeben:

$_=q{print"\$_=q{$_};eval"};eval

Das ist der Quellcode des Programms.

Das Schöne an diesem Quine ist, dass Sie beliebigen Code in den String einbetten können, um ihn zu verwenden eval.


Hier ist eine Aufschlüsselung der vollständigen Lösung:

perl -i-0.3 -e'
    $_=q{                     # string to be eval'd
        $_="\$_=q{$_};eval";  # append beginning and end of quine so the
                              #  entire thing can be reversed if necessary
        $_=reverse if $^I<0;  # reverse if input < 0
        $n=abs $^I;           # set $n to absolute value of input
        print                 # print
            +($_ x $n)        # $_ repeated $n times
            .                 # concatenated with
            substr $_,        # substring of $_
                   0,         # starting at the beginning
                   y///c      # having length x, where x is length of $_
                   *          # multiplied by
                   ($n-int$n) # fractional part of $n
    };
    eval                      # eval $_
'

0

Mathematica, 139 - 10% = 125,1 Bytes

StringJoin[Table[s = If[#1 > 0, #1 & , StringReverse][ToString[#0, InputForm]], {Abs[Floor[#1]]}], StringTake[s, Floor[Mod[#1, 1]*139]]] & 

Beachten Sie das nachfolgende Leerzeichen. Das Leerzeichen, die Standardnotation usw. sind das Ergebnis der ToString[#0, InputForm].


0

Haskell, 158 * 0,9 = 142,2 Bytes

c i|i<0=reverse|1<2=id;f i=putStr$take(floor$abs i*158)$cycle$c i$s++show s;s="c i|i<0=reverse|1<2=id;f i=putStr$take(floor$abs i*158)$cycle$c i$s++show s;s="

Eine quine Funktion.

*Main> f (-0.3)
"=s;s wohs++s$i c$elcyc$)851*i sba$roolf(ekat$r

*Main> f 1.1
c i|i<0=reverse|1<2=id;f i=putStr$take(floor$abs i*158)$cycle$c i$s++show s;s="c i|i<0=reverse|1<2=id;f i=putStr$take(floor$abs i*158)$cycle$c i$s++show s;s="c i|i<0=reverse

*Main> f 0
              <-- empty

0

Python 2, 193 Bytes - 10% = 173,7

x=input();y=int(x);_='x=input();y=int(x);_=%r;_=(_%%_)[::y/abs(y)];x,y=abs(x),abs(y);_=_*y+_[:int(y*(x-y)*193)];print _';_=(_%_)[::y/abs(y)];x,y=abs(x),abs(y);_=_*y+_[:int(y*(x-y)*193)];print _

Fehler auf 0, aber wenn Sie STDERR ignorieren, erhalten Sie immer noch eine leere Ausgabe.


Im Moment ist dies die längste Lösung, aber versuchen Sie, eine kürzere zu finden, und antworten Sie, wenn Sie können.
Erik der Outgolfer
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.