ทำให้ฉันเป็นกระโจมที่เลื่อนได้


15

บทนำ

จำ 80 คำราม? ฉันหมายถึงคุณรู้ไหมเหมือนเมื่อ 30 ปีก่อน? ไม่มีโทรศัพท์มือถือไม่มีอินเทอร์เน็ตไม่มีตู้ ATM เสื้อผ้าเรืองแสง (นั่นคืออะไร?!) และการเลื่อนของ marqee ! ไม่ไม่ไม่! ไม่ใช่คนออนไลน์ แต่เป็นคนจริงด้วยไฟ LED

กระโจมเลื่อน

เนื่องจากฉันอยู่ในอารมณ์ที่คิดถึงฉันอยากให้คุณสร้างกระโจมเลื่อน

ท้าทาย

สร้างโปรแกรมที่คุณสามารถป้อนสตริงหนึ่งบรรทัด โปรแกรมของคุณจำเป็นต้องสร้างตัวอักษรกระโจมกว้าง 80 ตัวเพื่อทำซ้ำข้อความหากจำเป็น

กฎระเบียบ

  • ผู้ใช้จะต้องสามารถป้อนสตริงลงในโปรแกรมของคุณเป็นอินพุต สตริงสามารถเป็นพารามิเตอร์บรรทัดคำสั่งหรือสตริงที่ป้อนขณะเรียกใช้โปรแกรม
  • โปรแกรมของคุณจะต้องพิมพ์สตริงที่มีอักขระ 80 ตัว (ที่มองเห็นได้) อย่างต่อเนื่อง
  • สตริงจะต้องได้รับการอัพเดตทุก ๆ 0.1 วินาที (มากหรือน้อยกว่านั้นฉันจะไม่จับเวลา) เลื่อนตัวละครทุกตัวซ้ำหนึ่งตำแหน่งไปทางซ้าย
  • สตริง "หมุน" ในตอนท้ายของสตริงที่ผู้ใช้ระบุอินสแตนซ์อื่นของสตริงต้องปรากฏขึ้น
  • โปรแกรมของคุณจะต้องพิมพ์มันออกในหนึ่งบรรทัดโดยไม่ต้อง linefeeds (ใช้ '\ r' แทน '\ n')
  • โปรแกรมของคุณจะต้องเรียกใช้infinitumจนกว่าผู้ใช้จะขัดจังหวะ
  • นี่คือ codegolf ดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ
  • มีโบนัส 10% (ปัดขึ้นเป็นจำนวนเต็มถัดไป) สำหรับการพิมพ์สีแดงบนพื้นหลังสีดำ
  • ช่องโหว่มาตรฐานใช้

การใช้งานอ้างอิงใน Python 2.7

โปรแกรมนี้ไม่ได้เล่นกอล์ฟ แต่มีการดำเนินการอ้างอิง (และทำให้มีข้อ จำกัด ด้านขนาด)

import time,sys
s=raw_input()*99
while 1:
    for i in range(80):
        print s[i:i+80]+'\r',
        sys.stdout.flush()
        time.sleep(0.1)

@ mbomb007 คล้ายกัน แต่ไม่เหมือนกัน นอกจากนี้ยังมีคำถามนี้ดูเหมือนว่ามัน (ดีสำหรับแรงบันดาลใจ) แต่มันเป็นเรื่องที่แตกต่างกันหลายต่อหลายประการผมคิดว่า นอกจากนี้ฉันพบว่าคะแนน (ความยาวรหัส) ค่อนข้างน่าผิดหวัง ฉันคิดว่าเราทำได้ดีกว่านี้จริง ๆ !
ทุก

อาจจะเป็นการประกวด code golf + popular?
SuperJedi224

เราต้องรออย่างแน่นอน 100 ms หรือไม่?
เดนนิส

1
@ เดนนิสกันไม่มากก็น้อย ไม่เป็นไรถ้าคุณตั้งค่าเป็น 99 เพื่อประหยัดถ่าน สมมติว่าการดำเนินการตามคำสั่งอื่นจะใช้เวลา 0.01 วินาที :-)
agtoever

1
จะเกิดอะไรขึ้นหากสตริงอินพุตมีมากกว่า 80 อักขระ การดำเนินการอ้างอิงของคุณและคำตอบของฉันไปที่ [80: 160] แล้วข้ามกลับไปที่ [0 .. ] พวกเขาไม่เคยพิมพ์จุดสิ้นสุดของสตริงยาวเช่นการป้อนข้อมูล1 2 3 4 5 6 7 8 9 10 11 ... 300ถูกตัดหลังจากผ่านไปประมาณ 56
TessellatingHeckler

คำตอบ:


4

CJam, 31 ไบต์

l80*{Dco_80<o(+es99+{es1$<}g;}h

รอประมาณ 100 ms

สิ่งนี้จะทำงานกับล่าม Javaอย่างเป็นทางการเท่านั้นเนื่องจากล่ามออนไลน์จะแสดงเฉพาะผลลัพธ์หลังจากออกจากโปรแกรม

ข้อความสีแดงบนพื้นหลังสีดำมีความเป็นไปได้ที่ 40 (หรือ 39) ไบต์สำหรับคะแนน 36:

0000000: 6c 38 30 2a 7b 22 0d 1b 5b 33 31 3b 34 30 6d 22 6f 5f  l80*{"..[31;40m"o_
0000012: 38 30 3c 6f 28 2b 65 73 39 39 2b 7b 65 73 31 24 3c 7d  80<o(+es99+{es1$<}
0000024: 67 3b 7d 68                                            g;}h

มันทำงานอย่างไร

l80*                             Read a line and repeat it 80 times.
    {                        }h  Do:
     Dco                           Print the character with code point 13.
        _80<o                      Print the first 80 characters of the string.
             (+                    Rotate the string one charcter to the left.
               es99+               Push the current time (ms) plus 99.
                    {     }g       Do:
                     es1$<           Compare the current time with the sum.
                                     Repeat the loop if 99 or less ms have passed.
                            ;      Discard the time stamp.
                                 Repeat the loop.

ฉันคิดว่าพวกเขาจะไม่สั้นกว่านี้ ขอแสดงความยินดี!
agtoever

ดูเหมือน tlike ;ในการอธิบายเป็น misaligned
Ven

@Ven คงที่ขอบคุณ!
เดนนิส

9

PowerShell, 118 113 112 108 102 101 99 96 - 10% = 86

รหัส

$s=(Read-Host)*180;for(){Write-Host($s.substring(($i=++$i%80),80)+"`r")-N -F R -B 0;sleep -m 99}

ด้วยข้อแม้ว่าตอนนี้มันเริ่มห่วงแรกกับตัวละครที่สอง; กฎไม่ได้บอกว่ามันจะต้องเริ่มจากด้านหน้าของสตริงและกฎข้อแรกรวมอยู่ด้วยดังนั้นฉันก็สบายดี ฉันจะไปถึง 100 ตัวอักษรอย่างใด - แก้ไข: ขอบคุณ @ConnorLSW สำหรับการแก้ไขเพื่อให้ได้ต่ำกว่า 100

คำแนะนำ

  1. เรียกใช้ PowerShell (คอนโซลปกติไม่ทำงานใน PowerShell ISE)
  2. วางเวอร์ชันบรรทัดเดี่ยวลงใน PoSH แล้วกด Enter
  3. พิมพ์ข้อความกด Enter
  4. Ctrl-C เพื่อแยก

เอาท์พุต

ตัวอย่างเอาต์พุต PowerShell

หมายเหตุ

เวอร์ชันที่อ่านได้ง่ายขึ้นพร้อมชื่อตัวแปรและพารามิเตอร์ที่กรอก:

$test = (Read-Host) * 180
for () {
    Write-Host ($text.substring(($i=++$i%80), 80)+"`r") -NoNewLine -ForegroundColor Red -BackgroundColor Black
    sleep -Miliseconds 99
}
  • พารามิเตอร์จะต้องยาวพอที่จะไม่ซ้ำกันดังนั้นจึง-F Rไม่ซ้ำกันพอที่จะตั้งค่า Red ForegroundColor เป็นต้น
  • 'Black' จะต้องเป็น 'Bla' จะไม่ซ้ำกันเมื่อเทียบกับ 'Blue' แต่-B 0ตั้งค่าเป็น Enum value 0 ซึ่งตีความว่าเป็น Black

ทางเลือกเพิ่มเติมปะรำ 'ถูกต้อง':

รหัสอ้างอิงไม่ได้จัดการสายอักขระที่ยาวเกินกว่า 80 ตัวอักษรอย่างข้ามข้ามสิ่งใด ๆ ในข้อความที่ผ่านมา ~ 160 ตัวอักษรและมันผิดพลาดรีเซ็ตทุกตัวอักษร 99 * len (สตริง) เช่นถ้าความกว้างของเครื่องหมายมีความยาว 5 ตัวอักษรก็จะทำสิ่งนี้:

   here is my long test input
 0 |here |            
 1  |ere i|          ^^^^ never shown
 2   |re is|
 3    |e is |
 4     | is m|
 0 |here |
 1  |ere i|
    ...

รุ่นนี้จัดทำดัชนี modulo ความยาวข้อความแทนที่จะเป็นความกว้างของเครื่องหมายดังนั้นจึงวิ่งผ่านสตริงทั้งหมด 106 - 10% = 95 ตัวอักษร

$l=($s=Read-Host).Length;for(){Write-Host(($s*160).substring(($i=++$i%$l),80)+"`r")-N -F R -B 0;sleep -m 99}

ทางเลือก: ลงชื่อรอบที่ชอบ. gif ในคำถาม 118-10% = 106

เพราะมันดูดีกว่า

$s=' '*80+(read-host)+' '*80;for(){write-host($s.Substring(($i=++$i%($s.length-80)),80)+"`r")-N -F R -B 0;sleep -m 99}

ภาพเคลื่อนไหวตัวอย่างสัญญาณทางเลือก


1
ฉันรู้ว่าคำตอบนี้ค่อนข้างเก่า แต่คำถามนี้เป็น frontpage ในขณะนี้ - Blaต่อ0- Write-Hostจะตีความตัวเลขเป็นสี
colsw

@ConnorLSW ขอบคุณคุณได้ต่ำกว่า 100 ตัวอักษร! และฉันก็ไม่รู้ว่าทำไมฉันถึงคิดถึงความคิดเห็นของคุณเมื่อหนึ่งปีที่แล้ว (!) มีใครบางคนเพิ่งโหวตขึ้นและฉันกลับมาเพื่อดูว่ามันคืออะไร
TessellatingHeckler

ไม่ต้องกังวลผมคิดว่าคุณยังสามารถเปลี่ยนwhile(1)ไปfor()เพื่อประหยัดไบต์บาง :)
colsw

@ConnorLSW เพื่อให้คุณสามารถทำได้เช่นกัน (ฉันอาจจะทำอย่างนั้นในสนามกอล์ฟส่วนใหญ่ของฉันมันไม่ใช่สิ่งที่ฉันคิดตามปกติ)
TessellatingHeckler

ในขณะที่คุณกำลังใช้for()คุณสามารถบันทึกหนึ่งไบต์มากขึ้นเปลี่ยน$s=(Read-Host)*180;for(){ไปfor($s=(Read-Host)*180){
Clijsters

6

Matlab, 76 ไบต์

สิ่งที่ฉันคิดว่าดีนี่คือคุณสามารถมีเวกเตอร์เป็นดัชนีอาเรย์ นี่จะคืนค่าเวกเตอร์ของรายการอาร์เรย์ที่สอดคล้องกันซึ่งทำให้ง่ายต่อการผนวกสตริงที่กำหนดโดยไม่ขึ้นกับความยาว

a=input('');k=1:80;while 1;pause(.1);clc;k=mod(k+1,nnz(a));disp(a(k+1));end

ผลลัพธ์:

ป้อนคำอธิบายรูปภาพที่นี่


clcเคล็ดลับที่ดีกับ คุณลืมเพิ่ม's'ในinput
Luis Mendo

คุณหมายถึงอะไร มันทำงานได้อย่างสมบูรณ์แบบเหมือนใน Matlab เวอร์ชั่นที่ฉันเคยใช้ (R2010b)
ข้อบกพร่อง

1
ตามที่เป็นอยู่ตอนนี้คุณต้องใส่สตริงด้วยเครื่องหมายคำพูด ในการป้อนเนื้อหาสตริงโดยตรง (โดยไม่มี qoutes) คุณต้องa=input('','s')
Luis Mendo

ตอนนี้ฉันเห็นแล้วฉันไม่ได้ตระหนักถึงคุณลักษณะนั้น เนื่องจากสเป็คไม่ต้องการสิ่งนี้ฉันคิดว่ามันก็โอเคที่จะต้องใช้'สตริงที่คั่นด้วยเป็นอินพุต หลายภาษาต้องการตัวคั่นสตริงหรือพวกเขาจะตีความอาร์กิวเมนต์บรรทัดคำสั่งในรูปแบบของประโยค (คำที่คั่นด้วยช่องว่าง) เป็นหลายอาร์กิวเมนต์อย่างไรก็ตาม
ข้อบกพร่อง

4

QBasic, 116 113 ไบต์ - 10% = 105 102

INPUT s$
COLOR 4
1CLS
FOR i=a TO a+79
?MID$(s$,i MOD LEN(s$)+1,1);
NEXT
?
a=a+1
t=TIMER+.1
2ON(TIMER<t)+2GOTO 2,1

การสาธิตกระโจม

นี่คือเวอร์ชันที่มีการจัดรูปแบบพร้อมความคิดเห็น:

INPUT s$
COLOR 4   ' 4 is the color code for red (the background's already black)

1 CLS   ' CLear Screen (and mark this as line number 1)

' The variable a represents an offset from the beginning of the string
' As a numeric variable, it is 0 at the beginning of the program
FOR i = a TO a + 79
    ' Print i'th character mod string length (+ 1 because QBasic strings
    ' are 1-indexed)
    PRINT MID$(s$, i MOD LEN(s$) + 1, 1);
NEXT i
PRINT
a = a + 1

' Do a busy-wait for .1 seconds
' (Unfortunately, QBasic's SLEEP command only takes integer values)
' Set t to the time we want to stop waiting, .1 seconds in the future
t = TIMER + .1
' We want to stay on line number 2 while TIMER < t; once that condition is
' no longer true, we want to goto the top of the outer loop (line number 1)
' Since true is -1 and false is 0 in QBasic, adding 2 to the conditional
' gives 1 for true and 2 for false; we can pass these values to the
' ON ... GOTO statement to branch conditionally
2 ON (TIMER < t) + 2 GOTO 2, 1

หมายเหตุสองประการ:

  • ฉันไม่รู้ว่าทำไมPRINTหลังจากFORลูปจำเป็น CLSควรรีเซ็ตเคอร์เซอร์ไปที่มุมซ้ายบนทุกครั้ง แต่อย่างน้อยใน QB64 อย่างน้อยถ้าฉันไม่ใส่ส่วนเสริมPRINTเข้าไปปะรำก็จะกลายเป็นบรรทัดที่สองแทนที่จะเป็นอันแรก หากใครมี QBasic ตั้งค่าบน DosBox หรือ somesuch ฉันจะสนใจที่จะรู้ว่าสิ่งเดียวกันเกิดขึ้นที่นั่นหรือถ้ามันเป็นข้อผิดพลาด QB64
  • รหัสมีความผิดพลาดเล็ก ๆ น้อย ๆ เพราะมันอาศัยTIMER(จำนวนวินาทีตั้งแต่เที่ยงคืน) สำหรับความล่าช้า หากรหัสกำลังทำงานในเวลาเที่ยงคืนปะรำจะติดอยู่เพราะTIMERจะรีเซ็ตเป็น0และจะน้อยกว่าtหลังจากนั้นเสมอ

ภาษาแรกของฉัน! IIRC ใน QB 4.5 อย่างไรก็ตามเซมิโคลอนที่ท้ายของสตริงที่พิมพ์หมายความว่าคำสั่ง PRINT จะไม่พิมพ์การคืนค่าขนส่ง
bgStack15

@ bgStack15 Mine เช่นกัน : ^ D ปัญหาไม่ได้เกิดขึ้นจริงPRINTแต่ด้วย - CLSหลังจากCLSนั้นไม่ว่าจะพิมพ์อะไรมาก่อนPRINTคำสั่งถัดไปควรให้ผลลัพธ์ที่ 1,1; แต่ฉันวิ่งเข้าไปในสถานการณ์ที่มันแสดงผลที่ 2,1
DLosc

4

Perl, 99 98 ไบต์ (-10% = 89)

$|=@_=split('',pop);printf("\e[31m\r%.80s",join('',@_)x80)while select($a,$a,$a,.1)|push@_,shift@_

รับอินพุตจากพารามิเตอร์บรรทัดคำสั่ง

perl marquee.pl "Welcome to Programming Puzzles & Code Golf "

3

pb , ⌈ (216 + 3) * 0.9⌉ = 198

+3 ไบต์สำหรับการตั้งค่าสถานะของล่าม d=1

c^w[Y=-1]{w[B!0]{>}t[X]<[X-79]w[X!0]{t[T-1]w[T=-1]{t[0]}<}vw[T=0]{^w[B!0]{t[B]^b[T]>v}<[X]^w[B!0]{t[B]vw[B!0]{>}b[T]<[X]^w[B=0]{>}b[0]>}v}}^w[1=1]{<[X-80]w[X!0]{<t[B]vb[T]^}w[B!0]{t[B]<b[T]>>}<[X]<t[B]w[B!0]{>}<b[T]}

คะแนนที่น่ากลัว แต่เมื่อพิจารณาว่าการทำสิ่งใดในภาษานี้มันยากแค่ไหน อัตราส่วนของคำตอบนี้ (ไบต์ที่ใช้เพื่อรับข้อความสีแดง) ถึง (โบนัสจากการมีข้อความสีแดง) ดีจริง ๆ ผลลัพธ์ทั้งหมดจะเปลี่ยนเป็นสีแดงโดยมีเพียงcจุดเริ่มต้นเท่านั้น!

เวลาระหว่างแต่ละขีดแตกต่างกันไปขึ้นอยู่กับความยาวของสตริงป้อนข้อมูล แต่ประมาณ 0.1 วินาที

อย่างไรก็ตามผลลัพธ์ของโปรแกรมนี้ดูเหมือนขยะทั้งหมดเพราะล่ามแย่มาก ทุกมิลลิวินาทีมันจะลบเทอร์มินัลและวาดใหม่ทุกอย่างดังนั้นมันจึงสั่นไหวจริงๆ

ด้วยความคิดเห็น:

c           # Change paint colour to red

^w[Y=-1]{   # While Y=-1 (arbitrary condition we can break later)

    w[B!0]{>}   # Go to end of input

    t[X]        # Save length of input in T

    # SET T TO MAX(T-79, 0)

    <[X-79]     # Go to (79, -1)

    w[X!0]{     # While X is not 0
        t[T-1]      # Subtract 1 from T
        w[T=-1]{    # If T is now negative
            t[0]        # Set it back to 0
        }
        <         # Move left (position doesn't matter except to end the loop eventually)
    }

    # DONE SETTING T TO MAX(T-79, 0)
    # If T == 0, the string needs to be doubled. Otherwise this part of the program is done

    v           # Move down to break the loop unless this is specifically undone
    w[T=0]{     # While T == 0
        ^w[B!0]{    # For each byte of input
            t[B]^b[T] # Copy it up 1 place
            >v        # Go to the next byte
        }
        <[X]^     # First byte of the copy
        w[B!0]{   # For each byte of the copy
            t[B]      # Save the byte's value
            vw[B!0]{>}# Go to the first empty spot after the original
            b[T]      # Write the saved value
            <[X]^w[B=0]{>} # Go back to the first byte of the copy
            b[0]>     # Erase it and go to the next one
        }
        v       # Back to Y=-1 to reset the loop from the very beginning
    }

}

# After ALL OF THAT nonsense, we're now at (0, 0) and the input string is guaranteed to be
# at least 80 characters long

^
w[1=1]{       # While 1=1 (should hold true until mathematics itself breaks down)
    <[X-80]        # Go to the 81st character
    w[X!0]{        # While X!=0
        <t[B]vb[T]^    # Go left and copy that character down
    }

    w[B!0]{      # For each byte in the string
        t[B]<b[T]>>  # Copy that byte left
    }

    <[X]<t[B]    # Go get the first value (copied to (-1, -1))
    w[B!0]{>}<b[T]# Bring it to the end of the string
}


2

Matlab, ⌈188 * .9⌉ = 170

ใช้งานได้ใน Matlab รุ่น R2014b หรือสูงกว่า ผลลัพธ์จะปรากฏขึ้นในหน้าต่างรูป

h=text(.1,.1,repmat(' ',1,80),'fontn','courier','ba','k','co','r');set(1,'pos',[90 90 990 90]);axis off
s=input('','s');n=0;while 1
n=n+1;pause(.1)
h.String=s(mod((0:79)+n,numel(s))+1);end

ในตัวอย่างต่อไปนี้ข้อความจะถูกพิมพ์เป็นตัวหนาเพื่อการมองเห็นที่ดีขึ้น (ไม่ได้ทำในรหัสข้างต้นเพราะค่าใช้จ่ายไม่กี่ไบต์) โปรดทราบว่าความเร็วของภาพเคลื่อนไหว GIF นั้นไม่สอดคล้องกับการหยุดชั่วคราว 0.1 วินาทีที่ต้องการ แต่เวลานั้นถูกต้องในรูปจริงที่แสดงโดยการเรียกใช้โปรแกรม

enter image description here


2

SpecBAS, 130 ไบต์ (-10% = 117)

ทวีคูณสตริงเดิมเพื่อให้มีอักขระอย่างน้อย 80 ตัวจากนั้นจึงตัดเป็น 80 เท่า

TEXT เป็นคำสั่งใน SpecBAS ที่ทำงานในลักษณะเดียวกันกับ PRINT (ในตัวอย่างนี้) แต่บันทึกอักขระหนึ่งตัว

SCALEคำสั่งเพิ่มอักขระพิเศษไม่กี่รหัส แต่ทำให้ดูเพิ่มเติมปะรำ-ish

โปรแกรมจะดำเนินต่อไปจนกว่าคุณจะกด Esc

1 INPUT s$: LET s$=s$*CEIL(80/LEN s$)
2 TEXT PAPER 0;INK 2;SCALE 1,2;AT 1,1;s$( TO 80)
3 LET s$=s$(2 TO)+s$(1): PAUSE 5: GO TO 2

ป้อนคำอธิบายรูปภาพที่นี่


2

Perl, 63 (70 ตัวอักษร - 10% สำหรับโบนัส)

ไม่ใช่ทางออกที่แตกต่างอย่างมากสำหรับคนอื่น ๆ แต่ฉันเสียเวลาทำมันดังนั้นฉันคิดว่าฉันจะโพสต์มันเช่นกัน!

$_=<>;s/
/ /;print"\x0d\x1b[91m",substr"$_"x80,$z++%y///c,80 until`sleep .1`

อาศัยอยู่กับขั้วยูนิกซ์ที่รองรับสำหรับรหัส ANSI และการเรียกร้องให้ coreutils' sleepสอง\x..ตัวอักษรด้านบนเป็นจริงตัวดึงข้อมูลบรรทัดและหลบหนีถ่านตามการถ่ายโอนข้อมูล hex นี้:

0000000: 245f 3d3c 3e3b 732f 0a2f 202f 3b70 7269  $_=<>;s/./ /;pri
0000010: 6e74 220d 1b5b 3931 6d22 2c73 7562 7374  nt"..[91m",subst
0000020: 7222 245f 2278 3830 2c24 7a2b 2b25 792f  r"$_"x80,$z++%y/
0000030: 2f2f 632c 3830 2075 6e74 696c 6073 6c65  //c,80 until`sle
0000040: 6570 202e 3160                           ep .1`

2

Ruby, 79 76 75 ไบต์

t,i=gets.chop*81,0
loop{system'cls'
$><<t[(i=(i+1)%80)..i+79]
sleep 0.1}

ฉันยังไม่ชำนาญทับทิมอาจจะลงเล่นกอล์ฟได้

ด้วยคะแนนเดียวกันสีแดงและสีดำ:

t,i=gets.chop*81,0
loop{system'cls&color 4'
$><<t[(i=(i+1)%80)..i+79]
sleep 0.1}

2

Perl, 84 ไบต์ (- 10% = 76)

$_=' 'x80 .pop;$|=print"\b \r\e[31m".substr$_,++$p% length,80until select$z,$z,$z,.1

ใช้อาร์กิวเมนต์บรรทัดคำสั่งซึ่งเป็นข้อความในปะรำ

คำอธิบาย:

  1. เติมช่องว่าง 80 ช่องลงในข้อความและเก็บไว้ใน $_
  2. พิมพ์ backspace ( \b) และ a space ( ) สิ่งนี้จะลบอักขระตัวสุดท้ายออกจากการพิมพ์ก่อนหน้า จากนั้นพิมพ์แคร่คืนและสี
  3. พิมพ์ 80 ตัวอักษรของข้อความจากตำแหน่ง $p
  4. $p = ($p+1) % length of text
  5. นอน 0.1 วินาที


1

Python 3, 96 ไบต์

import time;s=input()*80
while 1:print("\033[2J",end=s[:80],flush=1);s=s[1:]+s[0];time.sleep(.1)

สิ่งนี้จะทำงานกับเทอร์มินัลที่รองรับลำดับ ANSI Escape หากคุณอยู่ใน Windows ลองansicon

Hurray สำหรับflushคำหลักใน Python 3 ดังนั้นเราไม่จำเป็นต้องsys.stdout.flush()โทรแพง


1

C, 293 269 ​​ไบต์

(เพิ่มบรรทัดใหม่เพื่อให้สามารถอ่านได้)

สิ่งนี้รับอินพุตจากอินพุตมาตรฐานที่ EOF ยกเลิก ดังนั้นจึงเป็นการดีที่สุดที่จะป้อนสตริงขึ้นบรรทัดใหม่แล้วตามด้วย EOF (เช่น Ctrl ^ D)

#include<stdio.h>
#include<string.h>
#define Z '\0'
main(){int i=0,j;char m[80],o[80],n[2];
while(~(j=getchar())&&i<80)j-'\n'?m[i++]=j:0;m[i]=Z;
while(1){for(i=0;m[i]-Z;++i){strcpy(o,&m[i]);
for(j=0;j<i;)*n=m[j++],n[1]=Z,strcat(o,n);
printf("\x1b[40;31m%s\x1b[0m\r",o);}}}

Ungolfed:

#include <stdio.h>
#include <string.h>
#define ANSI_COLOR_SET "\x1b[40;31m"
#define ANSI_COLOR_RESET "\x1b[0m"

int main(void)
{
  int i, j, c;
  char msg[80], out[80], next[2];

  for (i = 0; (c = getchar()) != EOF && i < 80; ++i) {
    if (c != '\n') {
      msg[i] = c;
    }
  }
  msg[i - 1] = '\0';

  while (1) {
    for (i = 0; msg[i] != '\0'; ++i) {
      strcpy(out, &msg[i]);
      for (j = 0; j < i; ++j) {
        next[0] = msg[j];
        next[1] = '\0';
        strcat(out, next);
      }
      printf(ANSI_COLOR_SET "%s\r" ANSI_COLOR_RESET, out);
    }
  }
  return(0);
}

1

SmileBASIC ใหญ่ 79 ไบต์

COLOR 3INPUT S$@L
CLS
FOR I=0TO 79?S$[(I+O)MOD LEN(S$)];
NEXT
WAIT 6O=O+1GOTO@L

ฉันมีวิธีแก้ไขปัญหากราฟิกที่ดีเกือบเสร็จแล้วเมื่อฉันรู้ว่าต้องเลื่อน 1 ตัวอักษรพร้อมกัน


1

เยลลี่ , 20 19 18 ไบต์

  • -1 ไบต์โดยแทนที่แรก80ด้วย(= 256) เพราะจะต้องมีการคูณด้วยอย่างน้อย 80
  • -1 ไบต์โดยเปลี่ยนลูปไม่สิ้นสุดเป็นÇß(จากÇ1¿)

ẋ⁹ḣ80ṙ1;”ÆṄœS.1
Çß

ด้วยเทคนิคบางอย่างจาก คำตอบ @Dennis' ที่นี่ เจลลี่นั้นใหม่กว่าความท้าทาย แต่ไม่ได้ปรับให้เหมาะกับมันโดยเฉพาะ ข้อเสนอแนะเกี่ยวกับวิธีการปรับปรุงยินดีต้อนรับ! หากคอนโซลของคุณอยู่ใน utf-8 ให้เรียกใช้export LC_ALL=en_USหรือคล้ายกันก่อนลอง

ตัวอย่าง

https://gyazo.com/f3594391a6b4d459a9d30bd47cf598b1

คำอธิบาย

ẋ⁹ḣ80ṙ1;”ÆṄœS.1         Monadic helper link - Argument: s
ẋ⁹                      Repeat s 256 times.
  ḣ80                   Head. Set {output} to first 80 characters from repeated s.
     ṙ1                 Rotate. Rotates {output} one character to the left.
       ;Ӯ              Concatenate character 0D, the carriage return, to {output}.
          Ṅ             Print and return {output}.
           œS.1         Wait 0.1 seconds before returning {output} from the
                        helper link.

Çß                      Monadic main link - Argument: s
Ç                       Execute helper link with argument s. Replace s by
                        result of helper link.
 ß                      Execute this link with argument s (while true).

0

LOVE2D Lua, 197-10% = 178 Bytes

f=io.open("t.t"):read().."  "love.graphics.setColor(255,0,0)love.window.setMode(640,14)function love.draw()s=""for i=1,80 do n=i+os.clock()s=s..f:sub(n%#f,n%#f) end love.graphics.print(s,0,0)end

ต้องการอินพุตที่อยู่ในไฟล์ชื่อ 'tt' ในรูทดังนั้นจึงเพิ่ม 3 ไบต์พิเศษลงในคะแนน

พื้นฐานในการใช้งานจริงเพียงแค่วนซ้ำ 80 รอบต่อท้ายอักขระที่ดัชนีของ i บวกกับเวลาปัจจุบันในไม่กี่วินาทีที่ปรับด้วยความยาวของสตริงปัจจุบันทำให้สตริงอินพุตยาว 80 อักขระซ้ำซึ่งเลื่อนไปทางซ้าย เมื่อเวลาผ่านไป

ฉันใช้ LOVE2D สำหรับเสียงหัวเราะ


0

Sinclair ZX81 / Timex TS1000 / 1500 BASIC, 110 bytes 182 ไบต์ (สำหรับรายชื่อ)

1 LET A$="I LIKE TO SCROLL IT... HELLO MUM, BY DONKEYSOFT... THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG... STILL SCROLLING... "
2 PRINT AT 0,0;A$(1 TO 80)
3 LET A$=A$(2 TO )+A$(1)
4 GOTO 3

มันทำงานได้โดยการพิมพ์ตัวอักษร32 80 ตัวแรกของสตริงA$ที่ตำแหน่งหน้าจอ 0,0 ในบรรทัดที่สองแล้วจัดการสตริงจากตำแหน่งที่ 2 ถึงจุดสิ้นสุดของการต่อยที่บรรทัดที่ 3 (Sinclair ZX81 BASIC ดัชนีสตริงจาก 1 และไม่เป็นศูนย์ ) ดังนั้นการเพิ่มอักขระตัวแรกไปยังจุดสิ้นสุดและส่งกลับไปยังA$ตัวแปร จากนั้นจะมีการวนซ้ำแบบไม่มีเงื่อนไขกลับไปที่บรรทัด 2


0

พลเรือจัตวา 64, 434 ไบต์

0 A$="I LIKE TO SCROLL IT... SAMPLE SCROLLY ROUTINE FOR CODE-GOLF MADE BY DONKEYS
1 A$=A$+"OFT MMXVII... HELLO MUM... SCROLLING IS FUN, INNIT? GREETZ TO ALL...
2 POKE53280,6:PRINT"{CLEAR}";
3 PRINTLEFT$(A$,40)"{HOME}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}"MID$(A$,41,40)"{HOME}";
4 FORI=0TO99:NEXT:A$=RIGHT$(A$,142)+LEFT$(A$,1):GOTO3

เนื่องจากต้องแสดง 80 ตัวอักษรและ C64 โดยค่าเริ่มต้นจะมีเพียง 40 ตัวอักษรจากนั้นตัวอักษรของ scrolly 40 ตัวจะถูกพิมพ์ที่บรรทัดบนสุดของพื้นที่หน้าจอในขณะที่อีก 40 ตัวจะพิมพ์ใกล้กับด้านล่าง

เพื่อล้างสิ่งที่{HOME}และสัญลักษณ์อื่น ๆ แปลเป็น PETSCII จากนั้นนี่คือการคว้าหน้าจอที่นำมาจากตัวจำลองของฉัน:

พลเรือจัตวา 64 scrolly มากกว่าสองบรรทัด

ฉันจะเล่นกอล์ฟเวอร์ชั่นเต็มเมื่อฉันติดตั้ง CBM PRG Studio (หรือเมื่อฉันไม่ได้ทานอาหารกลางวันที่ทำงาน)



0

PHP, 136 ไบต์

<?php
$s="\e[0;31;40m".substr(str_repeat($argv[1],160),0,160);
while(true){for($i=0;$i<=80;$i++){usleep(100000);echo substr($s,$i)."\r";}}die;
  • เรียกว่าพร้อมกับphp -f marquee.php hello\ worldสตริง "สวัสดีโลก" กระโจม
  • ด้วยเหตุผลบางอย่างฉันต้องทำอักขระ 160 ตัวสำหรับสตริงเริ่มต้นมิฉะนั้นเอาต์พุตจะเป็นอะไรที่คล้ายhello worldddddddddddddddddddddddddddddddddddddddกัน แต่มันจะวนซ้ำไปเรื่อย ๆ จนถึง 80 ตัวอักษร - ฉันหวังว่าจะยังคงมีอยู่

https://gyazo.com/4c433abf04d71ca7ebb63a0889ca705d

เป็นวันที่ยาวนานมาแล้วมีบางอย่างที่ฉันสามารถทำได้เพื่อปรับปรุง


0

PHP, 85 ไบต์

for(;;usleep(1e5))echo substr(str_repeat($s=$argv[1],80),$i=++$i%strlen($s),80),"\r";

รับอินพุตจากอาร์กิวเมนต์บรรทัดคำสั่งแรก ทำงานด้วย-nrทำงานด้วย

เริ่มเลื่อนด้วยอักขระตัวที่สอง เพิ่มหนึ่งไบต์เริ่มต้นที่ตัวอักษรตัวแรก:
แทนที่=++$i%ด้วย%=และมี;;;;$i++,

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.