Teks Marquee Palsu

46

Dalam tantangan ini, teks tenda palsu adalah teks yang diperlihatkan bagian demi bagian, dengan cara seperti scrolling.

Beberapa contoh:

testing 4

   t
  te
 tes
test
esti
stin
ting
ing
ng
g


hello 2

 h
he
el
ll
lo
o


foobarz 3

  f
 fo
foo
oob
oba
bar
arz
rz
z


Something a bit longer 10

         S
        So
       Som
      Some
     Somet
    Someth
   Somethi
  Somethin
 Something
Something 
omething a
mething a 
ething a b
thing a bi
hing a bit
ing a bit 
ng a bit l
g a bit lo
 a bit lon
a bit long
 bit longe
bit longer
it longer
t longer
 longer
longer
onger
nger
ger
er
r


small 15

              s
             sm
            sma
           smal
          small
         small
        small
       small
      small
     small
    small
   small
  small
 small
small
mall
all
ll
l


aaa 3

  a
 aa
aaa
aa
a


brace yourself 6

     b
    br
   bra
  brac
 brace
brace 
race y
ace yo
ce you
e your
 yours
yourse
oursel
urself
rself
self
elf
lf
f

Anda harus menulis program atau fungsi yang mengambil dua input dan mencetak output seperti dijelaskan di atas. Anda mungkin atau tidak mengeluarkan spasi tambahan di output Anda. Ini adalah kode-golf sehingga kode terpendek dalam byte menang.

Jika program Anda berdiri sendiri (yaitu ketika dijalankan benar-benar mencetak garis-garis) (Input dapat berupa hard-coded tetapi mudah diubah) dan tidur sedikit di antara setiap baris output Anda mendapatkan bonus -10.

Caridorc
sumber
Apa yang Anda maksud dengan "termasuk Output"?
Pengoptimal
1
Juga, apakah kita harus mencetak baris pertama dan terakhir yang hanya berupa spasi?
Pengoptimal
2
Terinspirasi oleh ini ?
Spikatrix
1
Satu baris kosong di awal tampaknya diizinkan. Bagaimana dengan baris kosong lain di akhir?
nimi
2
Karena Anda berbicara tentang "hanya keluaran yang terlihat", dapatkah kita berasumsi bahwa input hanya akan dapat dicetak ASCII? (kode karakter 0x20 hingga 0x7E)
Martin Ender

Jawaban:

24

CJam, 12 11 byte

1 byte disimpan oleh Dennis.

,Sf*\f+$zN*

Saya menggunakan "Input bisa berupa kode-keras tetapi mudah diubah": ini mengharapkan input sudah ada di stack, jadi Anda bisa menambahkannya "testing" 4ke atas, misalnya.

Uji di sini.

Penjelasan

Perhatikan bahwa transpos dari output yang diinginkan jauh lebih sederhana:

   testing
  testing
 testing
testing

Jadi kita hanya perlu membuat ngaris, menambahkan ispasi untuk idari n-1bawah ke 0. Itulah yang dilakukan oleh kode:

,            e# Turn n into a range [0 1 .. n-1]
 Sf*         e# Turn each i into a string of i spaces.
    \f+      e# Swap this array with the input string and append it to each of the
             e# strings of spaces.
       $     e# Sort the array to have the string with n-1 spaces first.
        z    e# Transpose the grid.
         N*  e# Join the lines with newline characters.

19 - 10 = 9?

Saya menemukan bonus "tidur sedikit di antara setiap baris" agak kabur dan cerdik, tapi di sini adalah versi 19 byte yang hanya berhenti setelah setiap baris dengan menghitung semua permutasi dari array [0 1 .. 7]. Dalam juru bahasa online ini hanya mengarah pada hasil akhir yang ditampilkan sedikit kemudian, tetapi jika Anda menggunakan juru bahasa Java ini sebenarnya akan mencetak setiap baris setelah "sedikit tidur":

,Sf*\f+$z{oNo8e!;}/
Martin Ender
sumber
Penggunaan yang bagus z. Dengan asumsi input dapat dicetak ASCII, Anda dapat menggantinya W%dengan $.
Dennis
@ Dennis Oh, saya suka itu. Saya telah meminta klarifikasi tentang hal ini dari OP. (Yang mengatakan, saya menggunakan zsemua waktu untuk tantangan berbasis grid ascii.)
Martin Ender
15

C, 69 byte

sihir printf!

f(s,n,i)char*s;{for(i=n;*s;i?i--:s++)printf("%*s%.*s\n",i,"",n-i,s);}

Versi yang diperluas dengan beberapa penjelasan:

f(s,n,i)char*s;{       /* s is the string, n is the width of the grid. */
  for(i=n;             /* i is the number of preceding spaces. */
      *s;              /* Stop once we reach the end of the string. */
      i?i--:s++)       /* Decrease the number of spaces, and when there's 
                          none left start truncating the string itself. */
  printf("%*s          /* The first argument is the minimum width to print the 
                          string (left padded with spaces) and the second 
                          argument is the string to print. We use the empty 
                          string just to print the i spaces. */
    %.*s              /* The third argument is the maximum number of 
                         characters from the string (which is the fourth 
                         argument) to print. */
    \n",i,"",n-i,s);
}

Dan inilah sebuah contoh:

$ ./marquee stackoverflow 12

           s
          st
         sta
        stac
       tumpukan
      stacko
     stackov
    stackove
   stackover
  stackoverf
 stackoverfl
stackoverflo
aliran masuk
ackoverflow
ckoverflow
aliran uang kover
meluap
verflow
erflow
rflow
mengalir
rendah
ow
w
CL-
sumber
14

Pyth, 13 byte

jb.:++K*dQzKQ

Cobalah secara online: Pyth Compiler / Executor

Penjelasan

                 implicit: z = input string, Q = input number
      K*dQ       K = " " * Q
    ++K   zK     K + z + K
  .:        Q    all substrings of length Q
jb               join by newlines and print
Jakube
sumber
6

Python 65 63

s=lambda t,s:'\n'.join((' '*s+t)[i:s+i]for i in range(len(t)+s))

Ini sebenarnya digunakan untuk menulis contoh. Solusi dasar.

>>> print(s("foobarz", 3))

  f
 fo
foo
oob
oba
bar
arz
rz
z
Caridorc
sumber
2
saya belum mengujinya tetapi Anda harus dapat menghapus tanda kurung dalamjoin
undergroundmonorail
@undergroundmonorail right
Caridorc
6

Javascript ( ES7 Draft ), 61 byte

f=(s,l)=>[x.substr(i,l)for(i in x=' '.repeat(l)+s)].join(`
`)
<input id="str" value="Some String" />
<input id="num" value="5" />
<button onclick="out.innerHTML=f(str.value, +num.value)">Run</button>
<br /><pre id="out"></pre>

Javascript ( ES6 ) Hardcoded Input, 47 byte

Dengan asumsi input kode-keras dalam variabel s(string) dan l(panjang), dapat dikurangi menjadi 47 byte pencetakan dengan peringatan untuk setiap baris:

for(i in x=' '.repeat(l)+s)alert(x.substr(i,l))
nderscore
sumber
5

K, 19 byte

{x#'![1]\(x#" "),y}

Tack xspasi ( x#" ") ke awal string y. Kemudian gunakan bentuk "fixed-point scan" dari operator \untuk membuat set string yang diputar. Titik tetap dalam K berhenti iterasi jika hasil penerapan fungsi mengembalikan hasil yang diulang atau jika input awal ditinjau kembali. Karena ![1]akan memutar string satu langkah pada satu waktu, ![1]\adalah ungkapan yang bagus untuk permutasi siklik. Lalu kami hanya memotong hasilnya dengan x#'.

Contoh dijalankan:

  {x#'![1]\(x#" "),y}[4;"some text"]
("    "
 "   s"
 "  so"
 " som"
 "some"
 "ome "
 "me t"
 "e te"
 " tex"
 "text"
 "ext "
 "xt  "
 "t   ")
JohnE
sumber
5

J (22)

Ini berakhir lebih lama dari yang saya perkirakan, tapi saya kira itu tidak terlalu buruk.

[{."0 1[:]\.(' '#~[),]

Fakta menyenangkan: bukan dari [dan ]sebenarnya cocok, atau ada hubungannya dengan satu sama lain.

ɐɔıʇǝɥʇu
sumber
Setelah 3 perubahan kecil: [{."1]]\.@,~' '#~[(18 byte).
randomra
5

Julia, 75 byte

(s,n)->(n-=1;print(join([(" "^n*s*" "^n)[i:n+i]for i=1:length(s)+n],"\n")))

Ini menciptakan fungsi tanpa nama yang menerima string dan integer sebagai input dan mencetak output. Untuk menyebutnya, berikan nama, mis f=(s,n)->(...).

Penjelasan + tidak dikumpulkan:

function f(s, n)
    # Decrement n by 1
    n -= 1

    # Construct the lines as an array using comprehension by repeatedly
    # extracting subsets of the input string padded with spaces
    lines = [(" "^n * s * " "^n)[i:n+i] for i = 1:length(s)+n]

    # Print the array elements separated by a newline
    print(join(lines, "\n"))
end

Contoh:

julia> f("banana", 3)
  b
 ba
ban
ana
nan
ana
na 
a

julia> f("Julia", 6)
     J
    Ju
   Jul
  Juli
 Julia
Julia 
ulia  
lia   
ia    
a     

Perhatikan bahwa solusi ini adalah 66 byte jika sdan ndianggap sudah ada dalam program.

Alex A.
sumber
5

QBasic, 56 - 10 = 46

Ini golf QBasic - autoformatter akan memperluas ?ke PRINTdan menambahkan beberapa spasi. Diuji dengan QB64 , meskipun seharusnya tidak ada apa pun di sini yang tidak akan berfungsi dengan DOS QBasic.

s=SPACE$(n)+s
FOR i=1TO LEN(s)
?MID$(s,i,n)
SLEEP 1
NEXT

QBasic umumnya tidak baik dengan operasi string, tapi ada sangat nyaman adalah fungsi yang kembali sejumlah tertentu dari ruang!

Mengambil beberapa kebebasan dengan "input mungkin hard-coded," kode ini mengharapkan variabel smenjadi DIM'd AS STRING, untuk menghindari $tipe suffix, serta string yang ditugaskan sdan nomor ke n.

Pembukaan contoh:

DIM s AS STRING
s="string"
n=4

Keluaran:

   s
  st
 str
stri
trin
cincin
ing
ng
g

Baris kosong teratas dapat dihilangkan dengan memulai FORloop pada 2 bukannya 1.

Bonus: Menambahkan CLStepat sebelum NEXTuntuk empat byte remeh mengubah ini menjadi ... tenda nyata !

Tenda

Saya PRINT CHR$(3)QBasic. : ^ D

DLosc
sumber
Saya harus mencoba QBasic lagi ... Ini yang pertama kali saya pelajari
Luke Kanada REINSTATE MONICA
5

Ruby, 68 , 55 byte

a=" "*$*[1].to_i+$*[0]+" ";a.size.times{|b|puts a[b...b+$*[1].to_i]}

Setelah pembaruan dari @blutorange:

a=" "*(z=$*[1].to_i)+$*[0];a.size.times{|b|puts a[b,z]}

Keluaran:

         S
        So
       Som
      Some
     Somet
    Someth
   Somethi
  Somethin
 Something
Something 
omething a
mething a 
ething a b
thing a bi
hing a bit
ing a bit 
ng a bit l
g a bit lo
 a bit lon
a bit long
 bit longe
bit longer
it longer 
t longer 
 longer 
longer 
onger 
nger 
ger 
er 
r 

ruby marquee.rb "Something a bit longer" 10

Pengajuan pertama jadi meminta kritik.

DickieBoy
sumber
1
Terlihat bagus untuk saya, menggunakan beberapa pintasan ruby. Ruang terakhir tampaknya tidak perlu meskipun ("hanya hal-hal yang terlihat terlihat penting"), dan Anda dapat menyimpan beberapa byte dengan menggunakan variabel sementara:a=" "*(z=$*[1].to_i)+$*[0];a.size.times{|b|puts a[b,z]}
blutorange
@blutorange Terima kasih atas umpan baliknya!
DickieBoy
Sama-sama. Silakan mengedit jawaban jika Anda ingin;)
blutorange
4

Haskell, 61 59 54 byte

m n=unlines.scanr((take n.).(:))[].(replicate n ' '++)

Contoh penggunaan:

*Main> putStr $ m 6 "stackoverflow"

     s
    st
   sta
  stac
 stack
stacko
tackov
ackove
ckover
koverf
overfl
verflo
erflow
rflow
flow
low
ow
w

*Main> 

Sunting: baris kosong di awal / akhir diperbolehkan

nimi
sumber
4

Bash, 109 - 10 = 99 byte

Saya melihat bahwa dalam waktu yang saya perlukan untuk menulis solusi saya, saya telah dipukuli dengan baik. Namun demikian, saya menghabiskan terlalu lama menulisnya untuk tidak mempostingnya ...

Selain itu, ia memiliki beberapa fitur unik, seperti waktu antara pencetakan yang dapat disesuaikan pengguna berdasarkan berapa banyak yang ada di direktori saat ini! (Juga agak tidak konsisten, tergantung pada bagaimana rasanya disk Anda)

l=${#1};s=$1;for j in `seq 1 $2`;do s=" $s";done;for i in `seq 0 $((l+$2))`;do echo "${s:i:$2}";find 1>2;done

Contoh:

cd <some directory in which you own everything recursively>
Marquee.sh "Test Case" 4

   T
  Te
 Tes
Test
est 
st C
t Ca
 Cas
Case
ase
se
e

Tidak dikumpulkan dan berkomentar:

l=${#1} #Length of the incoming string
s=$1 #Can't reassign to the parameter variables, so give it another name
for j in `seq 1 $2`; do
    s=" $s" # Put on the padding spaces
done

for i in `seq 0 $((l+$2))`; do
    #Cut the string and print it. I wish I could lose "padding" that easily!
    echo "${s:i:$2}" #Format is ${string:index:length}, so always the same
    # length, with the index moving into the string as the loop advances
    find 1>2  #Wait "a bit". From ~/, about 6 minutes per line on my junky 
    # computer with a huge home directory. Probably in the <1 sec range for
    # most people.
    #This actually has the same character count as sleep(X), but is much
    # more fun!
done

Saya belum pernah benar-benar mencoba ini sebelumnya. Saran dan komentar diterima!

Sompom
sumber
4

Bash Murni, 61 byte

printf -vs %$2s"$1"
for((;++i<${#1}+$2;)){
echo "${s:i:$2}"
}

Keluaran:

$ ./marquee.sh testing 4
   t
  te
 tes
test
esti
stin
ting
ing
ng
g
$ 
Trauma Digital
sumber
Saya kira saya tidak mengerti perbedaan "murni" Bash, jadi mungkin saran ini tidak bagus, tetapi tidur (1) adalah 8 karakter dan memberi Anda -10 (dan merupakan Utilitas Inti GNU)
Sompom
3

Perl, 50

$c=$" x$^I;$_="$c$_$c";sleep say$1while(/(?<=(.{$^I}))/g)

57karakter +3untuk -i, -ndan -l. -10karakter untuk tidur.

-idigunakan untuk input numerik, yang disimpan dalam $^I. Pada dasarnya, kami menambahkan ispasi ke depan dan akhir input, dan kemudian mencari setiap ikarakter dan mengulanginya while. saydengan mudah mengembalikan 1yang dapat kita masukkan sleep.

echo "testing" | perl -i4 -nlE'$c=$" x$^I;$_="$c$_$c";sleep say$1while(/(?<=(.{$^I}))/g)'
hmatt1
sumber
Aku tahu ini sudah tua, tapi itu hanya melompat kembali ke halaman depan dan aku sudah pergi di menyusut bawah ini agak: s/^|$/$"x$^I/eg;sleep say$1 while s/.(.{$^I})/$1/. Anda juga dapat kehilangan -lbendera, tapi saya pikir Anda perlu untuk menghitung 5 untuk -i -n(karena -itidak bendera default) jika Anda menjalankan melalui: echo -n "testing" | perl -i4 -nE'...'. Namun harus tetap turun ke 44!
Dom Hastings
@HomHastings terima kasih Dom! Kerja bagus, saya akan mengedit jawaban saya nanti :)
hmatt1
3

Shell POSIX, 94

[ $3 ]||set "`printf "%${2}s"`$1" $2 t
[ "$1" ]&&printf "%-.${2}s" "$1" "
"&&$0 "${1#?}" $2 t

Saya tahu ini terlihat lebih dekat dengan perl, tetapi ini benar-benar shell!

Baris pertama menambahkan ruang utama yang diperlukan, hanya pada saat pertama kali melalui loop. Ini menetapkan $ 3 untuk menunjukkan bahwa ia telah melakukannya.

Baris kedua (NB tertanam baris baru) muncul kembali hingga input habis, mencetak n karakter pertama dari string, kemudian memanggil dirinya sendiri dengan karakter pertama dihapus dari $ 1.

Diuji dengan Debian /bin/dash- contoh output mengikuti:

./marquee "testing" 4

   t
  te
 tes
test
esti
stin
ting
ing
ng
g

./marquee "Sesuatu sedikit lebih lama" 10

         S
        So
       Som
      Some
     Somet
    Someth
   Somethi
  Somethin
 Something
Something 
omething a
mething a 
ething a b
thing a bi
hing a bit
ing a bit 
ng a bit l
g a bit lo
 a bit lon
a bit long
 bit longe
bit longer
it longer
t longer
 longer
longer
onger
nger
ger
er
r

./marquee "small" 15

              s
             sm
            sma
           smal
          small
         small
        small
       small
      small
     small
    small
   small
  small
 small
small
mall
all
ll
l
Toby Speight
sumber
Saya bisa menambahkan 9 karakter untuk mendapatkan bonus -10! ["$ 1"] && printf "% -. $ {2} s" "$ 1" "" && sleep 1 && $ 0 "$ {1 #?}" $ 2 t
Toby Speight
3

Python 2, 51 byte / 37 byte

Tanpa input hardcoded (51 byte):

def f(s,n):
 s=" "*n+s
 while s:print s[:n];s=s[1:]

Sebut seperti f("testing", 4).

Dengan input hardcoded (37 byte):

s="testing";n=4

s=" "*n+s
while s:print s[:n];s=s[1:]

Kedua versi menghasilkan garis spasi awal.

Sp3000
sumber
3

Python 2, (54 byte - 10 = 44) 64 62 60 46

(Saya berasumsi baris untuk input hard-coded tidak menambah jumlah byte.)

Saya belum melihat program yang benar-benar tidur di antara garis-garis pencetakan, jadi saya membuat satu yang tidak, karena lebih mirip tenda seperti itu. Program ini 2 byte lebih banyak di Python 3.

EDIT: Program sekarang melakukan perhitungan alih-alih tidur. Saya menggunakan iperhitungan sehingga program tidak menyimpannya sebagai konstanta, tetapi harus menghitungnya setiap waktu.

Coba Python 3 satu di sini (Python 2 repl adalah buggy)

i=0
while s[i-n:]:print((' '*n+s)[i:n+i]);i+=1;i**7**7
mbomb007
sumber
Mungkin alih-alih time.sleepada perhitungan panjang yang bisa Anda gunakan? Juga, ini sedikit lebih pendek untuk menggunakan whileloop:i=0\nwhile s[i-n:]:print(' '*n+s)[i:n+i];i+=1
xnor
@ xn atau Eksponensial beberapa kali berfungsi cukup baik untuk perhitungan.
mbomb007
@ mbomb007 Saya tidak berpikir Anda perlu menyimpan nilai perhitungan untuk mendapatkan python untuk benar-benar melakukannya (sehingga Anda dapat menyimpan 'q ='). Juga, x ^ 7 ^ 7 secara matematis setara dengan x ^ 49, meskipun python tampaknya menyelesaikan yang terakhir sedikit lebih cepat untuk saya. Anda dapat menyimpan beberapa karakter dengan cara itu.
Sompom
@Kompom Cobalah di repl. Jika saya mengkonsolidasikan ekspresi menjadi satu eksponensial, itu sepenuhnya menghilangkan penundaan waktu. Tapi saya akan menghapus q=. Terima kasih.
mbomb007
@Sompom Exponentiation benar-asosiatif, jadi ini sebenarnyai**(7**7)
Sp3000
3

Pyth, 12 byte

jb.:X*dyQQzQ

Demonstrasi.


Pyth, 17 - 10 = 7 byte

FN.:X*dyQQzQ&.p9N

Versi ini menggunakan penundaan antar cetakan garis. Ini dapat dilihat pada kompiler baris perintah, yang bisa Anda dapatkan di sini .

Jalankan yang berikut ini:

pyth -c 'FN.:X*dyQQzQ&.p9N' <<< 'testing
4'

Ini memiliki penundaan sekitar 0,3 detik sebelum setiap cetak. Jika Anda lebih suka penundaan yang lebih lama, Anda dapat menggunakan:

FN.:X*dyQQzQ&.pTN

Ini memiliki penundaan sekitar 4 detik.

isaacg
sumber
3

Jawa, 133 119 115

int i;void f(String s,int n){for(;++i<n;)s=" "+s+" ";for(;i<=s.length();)System.out.println(s.substring(i-n,i++));}

Versi panjang:

int i;
void f(String s, int n) {
    for(; ++i < n;)
        s = " " + s + " ";
    for(; i<=s.length();)
        System.out.println(s.substring(i-n, i++));
}

Padding diterapkan ke string, dan kemudian substring dari string yang empuk dicetak ke konsol.

-4 byte terima kasih kepada @KevinCruijssen.

TNT
sumber
Saya tahu ini sudah lebih dari satu tahun, tetapi Anda bisa bermain golf kedua untuk loop sedikit: for(;i<= s.length();System.out.println(s.substring(i-n,i++)));( -3 bytes )
Kevin Cruijssen
1
Bukan berarti itu tidak bisa diperbaiki. :) Terima kasih.
TNT
2

Matlab, 95

Seperti biasa, ini adalah manipulasi matriks. Inti di sini adalah perintah spdiagsyang memungkinkan Anda membuat matriks diagonal dengan sangat mudah.

t=input('');
n=numel(t);
k=input('');
flipud(char(full(spdiags(repmat(t,n+k-1,1),1-n:0,n+k-1,k))))

Dengan hardcoding 71 byte (string yang diharapkan disimpan tdan nomor dalam k)

n=numel(t);flipud(char(full(spdiags(repmat(t,n+k-1,1),1-n:0,n+k-1,k))))
cacat
sumber
2

APL, 50 - 10 = 40 karakter

Saya yakin itu bisa lebih pendek. 50 adalah panjang program tanpa dua konstanta.

{⍵≡⍬:⍬⋄⎕←↑⍵⋄⎕DL 99⋄∇1↓⍵}⊂[0]⊖s⍴⍨n,¯1+⍴s←'brace yourself',' '⍴⍨n←6

Penjelasan:

                               ' '⍴⍨n←6   call the number 'n' and make n spaces
            s←'brace yourself',           append them to the string and call it 's'
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
                             s⍴⍨n,¯1+⍴s   make a len(s)-1 by n matrix by repeating s 
                        ⊂[0]⊖             reflect the matrix and extract the columns
{                      }                  pass the list of columns to this function
 ⍵≡⍬:⍬⋄                                   return if the list is empty
       ⎕←↑⍵⋄                              print the first column (as a row)
            ⎕DL 99⋄                       wait for 99ms
                   ∇1↓⍵                   recurse with the rest of the columns

Dikembangkan untuk ngn APL di terminal.

Tobia
sumber
2

Powershell - 85 83 byte

Sudah terlambat, tidak akan menang :-) Tapi saya pikir saya akan melempar Powershell untuk kelengkapan:

function m($s,$n){1..$($n+$s.length)|%{-join(" "*$n+$s+" "*$n)[$_-1..$($n+$_-1)]}}

Chris J
sumber
1

Cobra - 60

def f(n,s)
    s=' '.repeat(n)+s
    while''<s,print (s=s[1:])[:n]
Suram
sumber
1

Groovy - 82

n=args[1]as int;t=" "*n+args[0]+" "*n;(0..t.size()-n).each{println t[it..it+n-1]}
dbramwell
sumber
1

Lua, 79 byte

r=io.read;t=r()w=r()s=" "t=s:rep(w)..t;for i=1,t:len()do print(t:sub(i,i+w))end
Pengobrol
sumber
1

C #, 112 byte

s=>n=>{var r=new string(' ',n-1);s=r+s+r;r="";for(int i=0;i<s.Length-n+1;)r+=s.Substring(i++,n)+"\n";return r;};

Program lengkap dengan metode ungolfed dan uji kasus:

using System;

namespace FakeMarqueeText
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<string,Func<int,string>>f= s=>n=>
            {
                var r=new string(' ',n-1);
                s=r+s+r;
                r="";
                for(int i=0;i<s.Length-n+1;)
                    r+=s.Substring(i++,n)+"\n";

                return r;
            };

            // test cases:
            Console.WriteLine(f("testing")(4));
            Console.WriteLine(f("hello")(2));
            Console.WriteLine(f("foobarz")(3));
            Console.WriteLine(f("Something a bit longer")(10));
            Console.WriteLine(f("small")(15));
            Console.WriteLine(f("aaa")(3));
            Console.WriteLine(f("brace yourself")(6));

        }
    }
}
adrianmp
sumber
1

Jelly , 15 byte - 10 = 5 ( tidak bersaing ?)

ḶṚ⁶ẋ;€⁹ZṄœS$€ṛ“

Cobalah online!

Tidur sebentar di antara setiap baris. Mencetak baris tambahan, jika itu dapat diterima.

yay Jelly mengalahkan Arang

Erik the Outgolfer
sumber
1

PHP4.1, 85-10 = 75 byte

Ya, ini adalah sangat lama, tetapi memiliki fungsi yang saya butuhkan.
Anda masih dapat menjalankannya di versi PHP yang lebih baru, tetapi Anda perlu mengatur variabel sendiri sebelum menjalankan kode di bawah ini.

Itu membantu saya mengurangi ukuran kode saya banyak!

Ini sangat mendasar:

<?for($s=str_repeat(' ',$n).$s;$i++<strlen($s)+$n;sleep(1))echo substr($s,$i,$n),'
';

Saya berlari untuk bonus karena ini, mengutip OP:

Jika program Anda berdiri sendiri (yaitu ketika dijalankan benar-benar mencetak garis-garis) (Input dapat berupa hard-coded tetapi mudah diubah) dan tidur sedikit di antara setiap baris output Anda mendapatkan bonus -10.

Seperti yang dapat Anda lihat dengan jelas, ia tertidur.

Ini mengasumsikan bahwa Anda telah register_globalsmengaktifkan secara default, yang merupakan pengaturan default untuk versi ini.


Anda dapat dengan mudah menguji di browser Anda, dengan minimal Beberapa perubahan:

//detects if it is running in js or php
//true for js, false for php
if('\0'=="\0")
{
	function strlen($s){
		return $s.length;
	}
	
	function str_repeat($s,$n){
		return Array($n+1).join($s);
	}
	
	function substr($s,$n,$m){
		return $s.substr($n,$m);
	}
	
	function printf($s){
		document.write($s);
	}
	
	function concat($a,$b){
		return $a+$b;
	}
}
else
{
	function concat($a,$b){
		return $a.$b;
	}
}

//sets the variables, not required for PHP if you pass the values by GET or POST
$i=0;
$s='example';
$n=6;



for($s=concat(str_repeat('-',$n),$s);$i++<strlen($s)+$n;)printf(concat(substr($s,$i,$n),'<br>'));
*{font-family:monospace}

Kode di atas adalah polyglot dan Anda dapat berjalan di browser Anda atau di penerjemah PHP. Bukankah seharusnya saya mendapatkan hadiah untuk ini? Cookie, mungkin?

Daftar perubahan:

  • Dihapus sleep(1)dalam tes ini
  • Dibuat 2 versi fungsi concat
    Tujuannya adalah untuk mengatasi perbedaan PHP dan JS dalam string gabungan.
  • Alih-alih spasi, a -digunakan untuk mengisi ruang
  • Alih-alih echo, printfadalah menggunakan sebagai gantinya (batasan PHP)
  • Alih-alih atau baris baru 'nyata', <br>digunakan sebagai gantinya
Ismael Miguel
sumber
1

APL (Dyalog) , 17 byte

⌽⍉↑(⎕,⍨' '/⍨⊢)¨⍳⎕

Cobalah online!

(program ini mengasumsikan ⎕IO←0default pada banyak mesin)

Penjelasan

⍳⎕               Create a range 0 .. input-1
¨                For each element in this range do:
 ' '/⍨⊢           A space duplicated right argument (which is the element in  the range) times
 ⎕,⍨              Concatenated with the input string to its right
⌽⍉               Transpose and reflect horizontally
Kritixi Lithos
sumber