Birden çok kez sorgulama


16

Göreviniz aşağıdakileri yapan bir program yapmak:

  1. Sayı almalısın. (Pozitif, negatif, kesir girilebilir)
  2. Negatifse, kınayı ters çevirirsiniz. ve bu sayıyı reddetmek (Olumlu olmak)
  3. Sonra <giriş numarasının tamsayı kısmı> kez tekrarlayın ve kaynak programınızdan ilk <katı (giriş numarasının * uzunluğunun kesir kısmı)> yazdırın. Tamsayı ise, kesir kısmı sıfırdır.

Programınız palindrom değilse% -10 bonus.

Misal

Programınız "ABCDEFG" ise,

1.

5
ABCDEFGABCDEFGABCDEFGABCDEFGABCDEFG

açıklama

ABCDEFG beş kez

2.

-2
GFEDCBAGFEDCBA

açıklama

GFEDCBA (ters ABCDEFG) 2 kez

3.

7.5
ABCDEFGABCDEFGABCDEFGABCDEFGABCDEFGABCDEFGABCDEFGABCDEFGABC

açıklama

ABCDEFG 7 kez ardından ABC (ilk 3 (kat (0,5 * 7) = kat (3,5) = 3) ABCDEFG'deki mektup)

4.

-0.3
GF

açıklama

GFEDCBA (ters ABCDEFG) 0 kez ardından GF (ilk 2 (zemin (0,3 * 7) = zemin (2,1) = 2) GFEDCBA (ters ABCDEFG)) harfi

5.

0
<empty>

Açıklama:

<empty> burada programınızın çıktısı olmadığı anlamına gelir. Boş dize olarak tanımlanan sıfır ABCDEFG'dir.


Talimatları açıklığa kavuşturabilir misiniz?
— LegionMammal978


@ LegionMammal978 Aslında bir şeyi ifade etmede kötüyüm, ama umarım daha net olur.
— Akangka

2
@ mbomb007 Dizeyi kendiniz ayrıştırabilir -ve .elle ve elle (kesir pozitif tamsayı olarak temsil) temsil edebilirsiniz sanırım . Veya dikkatinizi bir sonraki zorluğa dönüştürebilirsiniz. ;) (Her dil her zorluğa katılamaz, ancak zorlukla isteğe bağlı bireysel dilleri dışlamadığı sürece, bu tamamen iyidir. Sadece tüm ses / görüntü işleme veya dosya sistemi zorluklarını düşünün.)
— Martin Ender

1
Bu programlara% 10 bonus vermek daha mantıklı keçe olurdu vardır palindromes
— Bassdrop Cumberwubwubwub

Yanıtlar:


8

CJam, 28 26 bayt * 0.9 = 23.4

2 bayt tasarruf için Sp3000'e teşekkürler.

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

Burada test edin.

açıklama

{`"_~"+ 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 Bayt

Kodumdaki bir kusuru işaret ettiği için @ Sp3000'e teşekkürler!

Woo. Fizik öğretmenim bana bu konuda yardımcı olacak güç fonksiyonlarım olduğunu hatırlattı. Git şekil.

'R (, VD3 * V2 ^ 12 / ^ DVV / 1 + (rvl1 - * \ [DO {]
'Bir dize olarak kaydetmeye başlayın - bu her şeyi alır ve dizeye yığına iter.
 r Yığın sırasını ters çevirin.
  (; En üstteki öğe sıfırsa, programdan çıkın.
    V Girdiyi nihai bir global değişken olarak alın.
     d3 * 'karakterini yığına doğru itin.
        V2 ^ 12 / ^ Giriş değerinin mutlak değerini alın.
               Dv Çoğaltma ve temp değişkeninde kaydetme.
                 V Global değişkeni yığına doğru itin.
                  / En üstteki iki öğeyi bölün - girişin polaritesine bağlı olarak -1 veya 1 olur.
                   1+ (-1 ise, bir sonraki talimatı uygulayın. Aksi takdirde yapma.
                      r Yığını ters çevirin
                       v Geçici değişkeni yığına doğru itin.
                        l1- * Yığın uzunluğunun eksi 1 ile çarpın.
                            \ [] Yığın zamanlarının üst köşesinde parantez içindeki her şeyi tekrarla.
                              DO {Bir öğeyi çoğaltın, yığının dışına çıkarın ve çıktısını alın, ardından bir öğeyi yığının üzerinde hareket ettirin.

2

Perl, 104 bayt -% 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 bayt + 2 bayt -i- palindrom olmadığından% 10. Girdi, argüman olarak -i(örn. -0.3Yukarıda) geçirilir .

Nasıl çalışır

Bu çözüm aşağıdaki kine dayanmaktadır:

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

Bu aşağıdaki gibi çalışır. İlk $_olarak, dizeye ayarlayın :

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

Ardından, varsayılan olarak evalçalışan arama $_. Bu print, bir bağımsız değişkeni, bir dize değişmezini çağırır :

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

Bu dize çift tırnaklı olduğu için değişkenler enterpole edilir. Enterpolasyondan sonra $_dizenin değeri:

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

Yazdırıldığında, bu çıktı:

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

bu da programın kaynak kodudur.

Bu alıntı ile ilgili güzel bir şey, eval'd olmak üzere dizenin içine rastgele kod gömebilirsiniz .


İşte tam çözümün dökümü:

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 bayt

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

Sondaki boşluğa dikkat edin. Boşluk, standart gösterim vb ToString[#0, InputForm].


0

Haskell, 158 * 0.9 = 142.2 bayt

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

Bir quine işlevi.

*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 bayt -% 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 _

Hatalar açık 0, ancak STDERR'ı yok sayarak yine de boş çıktı alıyorsunuz.


Şu anda bu en uzun çözüm, ancak daha kısa bir çözüm bulmaya çalışın ve mümkünse cevap verin.
— Outgolfer Erik
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.