Bir tuval etrafında 8 bit tarzı zıplayan top


20

Commodore 64 Kullanıcı Kılavuzu'ndan bu listeden esinlenmiştir:

10 PRINT "{CLR/HOME}"
20 POKE 53280,7 : POKE 53281,13
30 X = 1 : Y = 1
40 DX = 1 : DY = 1
50 POKE 1024 + X + 40 * Y, 81
60 FOR T = 1 TO 10 : NEXT
70 POKE 1024 + X + 40 * Y, 32
80 X = X + DX
90 IF X <= 0 OR X >= 39 THEN DX = -DX
100 Y = Y + DY
110 IF Y <= 0 OR Y >= 24 THEN DY = -DY
120 GOTO 50

Terminalinizde, ekranınızda, tuvalinizde veya diğer görsel görüntüleme alanınızda top benzeri bir nesneyi zıplatmak için seçtiğiniz dilde / platformda benzer bir program yapın.

C64'ün PETSCII grafiklerini tam olarak taklit etmek zorunda değilsiniz, basit Oveya oyapacaksınız ya da GOTOhala kendi dilinizde mevcutsa komutu kullanmanız gerekmez . Topunuz tuvalinizin en üstünde başladığı ve bir tuval sınırına ulaşana kadar çapraz olarak seyahat ettiği ve ardından aşağıdaki gibi sıçradığı sürece:

  • Aşağı ve sağa hareket ederek ekran alanının altına çarpar, seker ve sağa doğru devam eder;
  • Yukarı ve sağa seyahat ederek en sağdaki sınıra ulaşır ve sola ve yukarı sıçrar;
  • Sola ve yukarı hareket etmek ve tepeye vurmak, sola ve aşağı sıçramak;
  • Sola ve aşağı seyahat etmek ve en soldaki sınıra ulaşmak, sağa ve aşağı sıçramak;
  • Herhangi bir köşeye çarpar ve yönü tersine çevirir;

O zaman hepimiz iyiyiz.

C64'teki BASIC listesinde olduğu gibi, topu bir seferde 8 piksel taşımanız gerekmez; hangisinin en uygun olduğunu düşünüyorsanız, bir kerede bir karakter bloğu veya bir piksel taşıyabilirsiniz.

Bu TEMEL listenin çalıştığını görmek için, tarayıcınızın Flash'ı desteklemesini sağlayan bu çevrimiçi Commodore 64 öykünücüsü ile yazabilirsiniz .


2
JavaScript tuvali. Ah D'.
Matthew Roh

Bugünlerde ekran dediğinizden emin değilim. Eskiden televizyon setiniz veya VDU'nuz aracılığıyla sadece ekran ve kenarlık alanını görüntülüyordunuz ... ve şimdi terminaller, pencereler, tuvaller, stdout vb. Var ... hepsi benim için çok kafa karıştırıcı.
Shaun Bebbers

Sabit bir piksel boyutu değerine sahip olsaydık daha iyi olurdu.
Matthew Roh

4
1x1 ekran boyutunu varsayabilir ve sonsuza dek yazdırabilir miyiz?
Matthew Roh

Yanıtlar:


3

6502 makine kodu (C64), 90 89 91 bayt

Bir yük adresine ihtiyaç duyduğu için +2 bayt (kendi kendine değişiklik nedeniyle PIC değil)

00 C0 20 44 E5 CA D0 FD C6 FC D0 F9 A2 20 86 FC A9 D8 85 9E A9 03 85 9F A4 CA
18 A5 9E 69 28 85 9E 90 02 E6 9F 88 10 F2 A4 C9 8A 91 9E C9 20 D0 08 E6 C9 E6
CA A2 51 10 D7 A5 C9 F0 04 C9 27 D0 08 AD 2F C0 49 20 8D 2F C0 A5 CA F0 04 C9
18 D0 B4 AD 31 C0 49 20 8D 31 C0 D0 AA

Çevrimiçi demo

Kullanımı: sys49152

Boyutu azaltmak için çok çalıştım (örneğin zamanlama için IRQ'ları DEĞİL, bunun yerine aptal boş döngüler), Titus'un golf yaptığı C64 BASIC seviyesine ulaşmak hala imkansız : o oh, iyi. Ama daha az titrek görünüyor;)

Açıklama: (mengene sökme)

00 C0       .WORD $C000         ; load address
20 44 E5    JSR $E544           ; clear screen
CA          DEX
D0 FD       BNE $C003           ; inner wait (256 decrements)
C6 FC       DEC $FC
D0 F9       BNE $C003           ; outer wait (32 decrements in zeropage)
A2 20       LDX #$20            ; wait counter and screen code for "space"
86 FC       STX $FC             ; store wait counter
A9 D8       LDA #$D8            ; load screen base address ...
85 9E       STA $9E             ; ... -40 (quasi row "-1") ...
A9 03       LDA #$03            ; ... into vector at $9e/$9f
85 9F       STA $9F
A4 CA       LDY $CA             ; load current row in Y
18          CLC                 ; clear carry flag
A5 9E       LDA $9E             ; add ...
69 28       ADC #$28            ; ... $28 (40 cols) to ...
85 9E       STA $9E             ; ... vector
90 02       BCC $C023
E6 9F       INC $9F             ; handle carry
88          DEY                 ; count rows down
10 F2       BPL $C018
A4 C9       LDY $C9             ; load current col in Y
8A          TXA                 ; copy screen code from X to A
91 9E       STA ($9E),Y         ; store at position of screen
C9 20       CMP #$20            ; screen code was "space"
D0 08       BNE $C037           ; if not, ball was drawn
E6 C9       INC $C9             ; next column   | opcodes are modified
E6 CA       INC $CA             ; next row      | here for directions
A2 51       LDX #$51            ; screen code for "ball"
10 D7       BPL $C00E           ; and back to drawing code
A5 C9       LDA $C9             ; load current column
F0 04       BEQ $C03F           ; if zero, change X direction
C9 27       CMP #$27            ; compare with last column (39)
D0 08       BNE $C047           ; if not equal, don't change X direction
AD 2F C0    LDA $C02F           ; load opcode for X direction
49 20       EOR #$20            ; toggle between ZP INC and DEC
8D 2F C0    STA $C02F           ; store back
A5 CA       LDA $CA             ; load current row
F0 04       BEQ $C04F           ; if zero, change Y direction
C9 18       CMP #$18            ; compare with last row (24)
D0 B4       BNE $C003           ; if not equal, don't change Y direction
AD 31 C0    LDA $C031           ; load opcode for Y direction
49 20       EOR #$20            ; toggle between ZP INC and DEC
8D 31 C0    STA $C031           ; store back
D0 AA       BNE $C003           ; -> main loop

Sadece eğlence için, top için bir sprite kullanan ve 385 baytta vurulduğunda ( yerinde kullanılan sprite verilerini içeren) daha profesyonel bir varyant :

00 C0 AD 15 D0 F0 30 A9 CC 85 FC A9 04 20 A2 C0 A9 97 8D 00 DD A9 15 8D 18 D0 
A9 00 8D 15 D0 8D 1A D0 A2 81 8E 0D DC A2 31 8E 14 03 A2 EA 8E 15 03 58 A6 D6 
4C F0 E9 A9 04 85 FC A9 CC 20 A2 C0 A2 31 86 01 A2 10 A9 D0 85 FC B1 FB C6 01 
91 FB E6 01 C8 D0 F5 E6 FC CA D0 F0 A9 37 85 01 A9 94 8D 00 DD A9 35 8D 18 D0 
8D 27 D0 A2 05 8E F8 CF A2 01 8E 15 D0 8E 1A D0 8E 12 D0 86 FD 86 FE A2 18 8E 
00 D0 A2 1B 8E 11 D0 A2 32 8E 01 D0 A2 7F 8E 0D DC AE 0D DC AE 20 D0 86 FB A2 
C1 8E 14 03 A2 C0 D0 8A 85 FE 8D 88 02 A9 00 85 FB 85 FD A2 04 A0 00 78 B1 FB 
91 FD C8 D0 F9 E6 FC E6 FE CA D0 F2 60 A6 FB 8E 20 D0 CE 19 D0 A5 FD F0 20 AD 
00 D0 18 69 04 8D 00 D0 90 03 EE 10 D0 C9 40 D0 2C AD 10 D0 29 01 F0 25 20 38 
C1 C6 FD F0 1E AD 00 D0 38 E9 04 8D 00 D0 B0 03 CE 10 D0 C9 18 D0 0C AD 10 D0 
29 01 D0 05 20 38 C1 E6 FD A5 FE F0 14 AD 01 D0 18 69 04 8D 01 D0 C9 E6 D0 19 
20 38 C1 C6 FE F0 12 AD 01 D0 38 E9 04 8D 01 D0 C9 32 D0 05 20 38 C1 E6 FE 4C 
31 EA A9 01 8D 20 D0 60 00 00 00 7E 00 03 FF C0 07 FF E0 1F FF F8 1F FF F8 3F 
FF FC 7F FF FE 7F FF FE FF FF FF FF FF FF FF FF FF FF FF FF 7F FF FE 7F FF FE 
3F FF FC 1F FF F8 1F FF F8 07 FF E0 03 FF C0 00 7E 00 00 00 00 

Çevrimiçi demo - | - ca65 birleştirici kaynağına göz atın

Zıplayan topu ile başlatın ve durdurun sys49152.

  • Bu $C000, ekran içeriğinin ve karakter setinin (yazı tipi) kopyalanmasını gerektiren VIC-II adres alanını yukarı hareket ettirerek yapılan C64 BASIC'i çalışır durumda bırakır .
  • Sistem IRQ'suna bağlanır ve titremeyi önlemek için, bu IRQ'nun kaynağını VIC-II grafik yongasına değiştirir, böylece her zaman çerçeveler arasında güncellemeler yapılır.
  • Oyun hataları:
    1. RUN/STOP + RESTORE kırık, deneme.
    2. IRQ kaynağı olarak VIC-II ile imleç biraz daha yavaş yanıp söner ve TI$aynı zamanda geride kalır.
    3. kenarlık yanıp sönerken dururken (çok olası değil, ancak mümkün), beyaz kalır - manuel olarak geri yüklemeniz gerekir.

1
Tamamen bağımsız değil, değil mi? İki mutlak LDA ve iki STA görüyorum. Yine de büyük iş!
Titus

Kahretsin haklısın: o Kendini değiştirmeyi unuttum! PC'de olur olmaz güncelleme yapacağım.
Felix Palmen

1
@Titus düzeltildi ... ve sadece eğlence için, "daha iyi" bir varyant ekledi :)
Felix Palmen

Sprite'ı paketlemeyi düşündün mü? (? Hmm ... charset ROM kullanın) Ve razı olmama tercih inc $d020üzerinde jsr flash;) hitshimselfwithalargetrout İt's muhteşem!
Titus

1
@Titus 2 bayt tasarruf ederdi, evet. Yükleme adresine gelince, geçerli bir .prgdosyanın parçası ve burada aldığım meta sorumdan dahil etmeliyim ... kod konumdan bağımsız olsaydı muhtemelen dışarıda bırakabilirdim.
Felix Palmen

14

Bash + Unix hizmeti 125 117 bayt

for((x=y=u=v=1;;x+=u,y+=v,u=(x<1||x>=`tput cols`-1)?-u:u,v=(y<1||y>=`tput lines`-1)?-v:v)){
tput cup $y $x
sleep .1
}

Örnek çalışma animasyonu:

Örnek çalışma animasyonu


6
Tam köşeye çarptı! : O
mbomb007

11

CP-1610 montajı, 6764 62 DECLEs = 78 bayt

Bu kodun bir Intellivision üzerinde çalıştırılması amaçlanmıştır . MOB (Mobil Nesne için) olarak bilinen donanım spritelarından birini kullanıyor.

Bir CP-1610 op kodu, 'DECLE' olarak bilinen 10 bitlik bir değerle kodlanır. Bu program 62 DECLE uzunluğunda, 4800 $ 'dan başlayıp 483D $' da bitiyor.

Onaltılık döküm + kaynak

                            ROMW  10            ; use 10-bit ROM
                            ORG   $4800         ; start program at address $4800

                    FRAME   EQU   $17E          ; frame #

                            ;; ------------------------------------------------ ;;
                            ;;  main entry point                                ;;
                            ;; ------------------------------------------------ ;;
                    main    PROC

4800 0001                   SDBD                ; load Interrupt Service Routine
4801 02B8 002B 0048         MVII  #isr,   R0    ; into R0

4804 0240 0100              MVO   R0,     $100  ; update ISR
4806 0040                   SWAP  R0
4807 0240 0101              MVO   R0,     $101

4809 02B9 0208              MVII  #$0208, R1    ; initialize R1 = X
480B 02BA 0108              MVII  #$0108, R2    ; initialize R2 = Y
480D 02BB 0001              MVII  #1,     R3    ; initialize R3 = DX
480F 009C                   MOVR  R3,     R4    ; initialize R4 = DY

4810 0002                   EIS                 ; enable interrupts

                            ;; ------------------------------------------------ ;;
                            ;;  main loop                                       ;;
                            ;; ------------------------------------------------ ;;
4811 0280 017E      @@loop  MVI   FRAME,  R0    ; R0 = current frame #

4813 0340 017E      @@spin  CMP   FRAME,  R0    ; wait for next frame
4815 0224 0003              BEQ   @@spin

4817 00D9                   ADDR  R3,     R1    ; X += DX

4818 0379 02A0              CMPI  #$2A0,  R1    ; reached right border?
481A 0204 0003              BEQ   @@updDx

481C 0379 0208              CMPI  #$208,  R1    ; reached left border?
481E 002F                   ADCR  PC

481F 0023           @@updDx NEGR  R3            ; DX = -DX

4820 00E2                   ADDR  R4,     R2    ; Y += DY

4821 037A 0160              CMPI  #$160,  R2    ; reached bottom border?
4823 0204 0003              BEQ   @@updDy

4825 037A 0108              CMPI  #$108,  R2    ; reached top border?
4827 002F                   ADCR  PC

4828 0024           @@updDy NEGR  R4            ; DY = -DY

4829 0220 0019              B     @@loop        ; loop forever

                            ENDP

                            ;; ------------------------------------------------ ;;
                            ;;  ISR                                             ;;
                            ;; ------------------------------------------------ ;;
                    isr     PROC

482B 01DB                   CLRR  R3            ; clear a bunch of STIC registers
482C 02BC 0020              MVII  #$20,   R4

482E 0263           @@clear MVO@  R3,     R4    ; (including background color,
482F 037C 0032              CMPI  #$32,   R4    ; border color, etc.)
4831 0226 0004              BLE   @@clear

4833 0259                   MVO@  R1,     R3    ; update X register of MOB #0
4834 0242 0008              MVO   R2,     $8    ; update Y register of MOB #0
4836 02BB 017E              MVII  #$017E, R3    ; update A register of MOB #0
4838 0243 0010              MVO   R3,     $10   ; (using a yellow "O")

483A 0298                   MVI@  R3,     R0    ; increment frame #
483B 0008                   INCR  R0
483C 0258                   MVO@  R0,     R3

483D 00AF                   JR    R5            ; return from ISR

                            ENDP

Çıktı

çıktı


10

HTML (Microsoft Edge / Internet Explorer), 81 bayt

Bu yuvalanmış <marquee>etiketlerle 1998 yılı olduğunu düşünün :

<marquee behavior=alternate direction=down><marquee behavior=alternate width=99>O

Microsoft Edge'de test edildi, ancak IE'de okuduğumdan yine de kayan çerçeveleri desteklemesi gerekiyor. Kesinlikle yok değil Chrome'da çalışır.

Ayar direction=up2 bayt tasarruf eder, ancak topun tuvalin üstünde başlaması gerektiği kuralını ihlal eder.


Maalesef, top meydan okumanın gerektirdiği şekilde çapraz olarak seyahat etmediğinden bu geçersiz bir cevaptır.
El'endia Starman

Microsoft Edge'de denediniz mi? Chrome bu directionözelliği desteklemiyor gibi görünüyor .
Jack Brounstein

Ha, özür dilerim - Edge'de çalışıyor. Chrome'da çalışmadığını onaylayabilirim ve Firefox ve Internet Explorer'da çalıştığını doğrulayabilirim. Dörtte üçü kötü değil (ve bu cevabın geçerli olması için sadece birine ihtiyacınız var). +1
El'endia Starman

1
+1 için marquee, bu oldukça yaratıcı!
Metoniem

Chrome'da benim için çalıştı.
ckjbgames

8

TI-BASIC, 71 70

1->A
1->B
1->C
1->D
While 1
ClrHome
Output(B,A,0
A+C->A
B+D->B
If A<2 or A>15
~C->C
If B<2 or B>7
~D->D
End

Kelimenin tam çevirisi, daha küçük yapmak için hileler varsa şaşırmazdım.

Ekran 16x8 ve 1 dizinli olduğundan sabitler farklıdır.

~ olumsuzluk sembolü yazmanın SourceCoder yoludur.

zıplayan O gif

Donanımda daha pürüzsüz görünüyor.


Bunun 70 bayt olduğundan emin misiniz? Bundan daha az gibi görünüyor.
12Me21

@ 12Me21 Kaç bayt sayıyorsunuz? Bunu bir hesap makinesine kaydedersem 80 bayt ve sayımla uyumlu boş bir program için 10 bayt alırım.
Harold

Oh, sanırım o zaman yanlış saydım.
12Me21

7

Befunge, 209 bayt

>10120130pppp>"l52?[J2["39*,,,,39*,,,,,,v
v+56/+55\%+55:+1g01*83-"6!"7\-"6!?"8-*86<
>00g1+:55+%\55+/"+!6"-48*,68>*#8+#6:#,_v$
v:+g03g01p02+-\g02*2!-*64\*2!:p00:+g02g<$
>10p:!2*\"O"-!2*30g\-+30p"2"::**>:#->#1_^

Bu, ekran boyutunun 80x25 olduğunu varsayar, ancak "O"son satırdaki (79) *64ve ikinci son satırdaki (24) değiştirerek aralığı kolayca değiştirebilirsiniz ( son son satırın sağdan sola yürütüldüğüne dikkat edin). Hız "2", son satırdaki (50) değiştirilerek de ayarlanabilir .


7

Java, 184176 bayt

class A{public static void main(String[]a)throws Exception{for(int X=1,Y=1,x=1,y=1;;System.out.print("\033["+X+";"+Y+"H"),Thread.sleep(50),X+=x=X%25<1?-x:x,Y+=y=Y%85<1?-y:y);}}

Bu, bir terminal ekranının etrafında dönen nesne olan imleci yeniden konumlandırmak için ANSI Kaçış Dizilerini kullanır 85 x 25. Adlı bir dosyaya kaydedin A.java.

Ungolfed

class Terminal_Bouncing_Ball {
    public static void main(String[] args) throws InterruptedException {
        int X = 0, Y = 0, dx = 1, dy = 1;
        while (true) {
            System.out.print(String.format("\033[%d;%dH",X,Y));
            Thread.sleep(50);
            dx = (X < 1) ? 1 : (X > 71) ? -1 : dx;
            dy = (Y < 1) ? 1 : (Y > 237) ? -1 : dy;
            X += dx;
            Y += dy;
        }
    }
}

gösteri

Misal


Bu kod golf, bu yüzden kaldırmak isteyeceksiniz Thread.sleep(50). Ve golf oynadığınız ve golf oynadığınız programlarınız uyuşmuyor.
Jakob

4

Clojure, 398 380 375 bayt

(ns g(:require[quil.core :as q]))(def w 1e3)(def h 1e3)(def f 100)(def b(atom{:x f :y f :n 1 :m 1}))(q/defsketch . :size[w h]:setup #(do(q/text-font(q/create-font""f))(q/fill 255 255 255)):draw #(let[s 9{x :x y :y n :n m :m}@b c(+ x(* n s))u(+ y(* m s))](q/background 0 0 0)(reset! b{:x c :y u :n(if(< 0 c(- w f))n(* -1 n)):m(if(<(+ 0 f)u h)m(* -1 m))})(q/text"O"(:x @b)(:y @b))))

Yazı tipi adını varsayılan olarak boş bir dize olarak değiştirerek, sınır kontrollerini satır içine alarak ve alt sınır sorununu (GIF'de görebilirsiniz) düzelterek -18 bayt. Gerçekten kaydedilen bayt düzeltildi.

Daha özlü bir yıkıcı sözdizimine geçerek ve topu bir piksel küçülterek -5 bayt.

Quil kullanır .

İşlevsel moda geçmeye çalıştım, ancak fazladan kod gerektiriyordu ve daha pahalıydı.

(ns bits.golf.ball-bounce
  (:require [quil.core :as q]))

(def width 1000)
(def height 1000)

(def font-size 100)

; Mutable state holding the properties of the ball. n and m are the directions on the x and y axis.
(def ball (atom {:x 300 :y 600 :n 1 :m 1}))

(q/defsketch b
  :size [width height] ; Window size

  :setup #(do
            (q/text-font (q/create-font "Arial" font-size)) ; Set the font
            (q/fill 255 255 255)) ; And the text color

  :draw
  #(let [speed 9
         ; Deconstruct the state
         {:keys [x y n m]} @ball
         next-x (+ x (* n speed))
         next-y (+ y (* m speed))

         ; I'm adding/subtracting the font-size so it stays in the window properly
         x-inbounds? (< 0 next-x (- width font-size))
         y-inbounds? (< (+ 0 font-size) next-y height)]

     ; Wipe the screen so the ball doesn't smear
     (q/background 0 0 0)

     ; Reset the state
     (reset! ball
             {:x next-x
              :y next-y
              :n (if x-inbounds? n (* -1 n))
              :m (if y-inbounds? m (* -1 m))})

     ; Draw the ball
     (q/text "O" (:x @ball) (:y @ball))))

Bölüm GIF

(Yeni sürümün, GIF'de olduğu gibi ekranın altından erken çıkmadığını unutmayın.)


Az (+ 0 font-size)önce orada olduğumu fark ettim . Bu utanç verici. Bunu bir sonraki sürümde düzeltirim. Beni 5 bayt gibi kurtarmalı.
Şubat'ta Carcigenicate

4

Raket 247 bayt

(let*((w 500)(h(* w 0.6))(x 100)(y 0)(d 10)(e d)(G(λ(t)(set! x(+ x d))(when(or(> x w)(< x 0))
(set! d(* d -1)))(set! y(+ y e))(when(or(> y h)(< y 0))(set! e(* e -1)))
(underlay/xy(rectangle w h"solid""white")x y(circle 10"solid""black")))))(animate G))

Ungolfed:

(require 2htdp/image
         2htdp/universe) 

(let* ((wd 500)            ; define variables and their initial values
       (ht 300)
       (x 100)
       (y 0)
       (dx 10)
       (dy 10)

       (imgfn              ; define function to draw one frame; called repeatedly by animate fn; 
        (λ (t)             ; t is number of ticks till now- sent by animate fn; ignored here;

                           ; update location (x and y values):
          (set! x (+ x dx))
          (when (or (> x wd) (< x 0))
            (set! dx (* dx -1)))             ; invert direction at edges
          (set! y (+ y dy))
          (when (or (> y ht) (< y 0))
            (set! dy (* dy -1)))             ; invert direction at edges

                           ; draw image: 
          (underlay/xy
           (rectangle wd ht "solid" "white") ; draw background
           x y                               ; go to location (x,y)
           (circle 10 "solid" "black")       ; draw ball
          ))))

  (animate imgfn))         ; animates the images created by imgfn (default rate 28 times/sec)

Çıktı:

resim açıklamasını buraya girin


1
Raket ile Raketbol Oynamak!
ckjbgames

Bu iyi bir tanesi!
rnso

"Raket", "Şema" programlama dilinden türetilir: Şemadan (kederli bir plan) sonra Raket (bir aldatmaca veya dolandırıcılık) vardır!
rnso

Daha iyi!
ckjbgames

3

Jöle, 37 bayt

“ñc‘Ọ24ḶŒḄṖ⁸ị⁷x⁸µ80ḶŒḄṖ⁸ị⁶x⁸‘œS.1
Ç1¿

Döngü ve kaçış karakterleri doğru almak için bu cevap bazı yardım ile . Şu anda 80x24 ekranda dolaşıyor, ancak kodda kolayca değiştirilebilir.

Her yöndeki koordinatlar, iki listenin öğeleri olarak temsil edilebilir [0, 1,..., 24, 23,..., 1]ve [0, 1,..., 80, 79,..., 1]bunları diyelim Yve Xbunlar sonsuz tekrarlanır. Bu sonsuz tekrar, modüler indeksleme kullanılarak - Jelly'de kullanılarak taklit edilebilir . Örnek: iyinelemede top pozisyondadır (X[i%|X|], Y[i%|Y|]) = (iịY, iịX). Hareketli top , iịYyeni satırlar ve iịXboşluklar yayarak konumlandırılan imleçtir .

gösteri

https://i.gyazo.com/b8eac64097cb6d3a18185877c2f4c945.gif

açıklama

“ñc‘Ọ24ḶŒḄṖ⁸ị⁷x⁸µ80ḶŒḄṖ⁸ị⁶x⁸‘œS.1        Monadic helper link - argument i.
                                         Resets the terminal, prints Y[i] newlines,
                                         X[i] spaces and returns i + 1.
“ñc‘                                     Set the output to [27, 99]
    Ọ                                    Convert to characters and print (\x1bc)
                                          -> Cursor is at position (0,0)
     24Ḷ                                 Lowered range of 24. Yields [0,...,23].
        ŒḄ                               Bounce. Yields [0,...,23,22,...,0].
          Ṗ                              Pop. Yields [0,...,23,22,...,1] = Y.
           ⁸ị                            Modular index i (⁸) into Y. The current
                                         value is the Y coordinate, y.
              x                          Repeat y times
             ⁷                           the newline character ('\n').
               ⁸                         Output that (y times '\n') and continue
                                         with value i.
                                          -> Cursor is at position (0, y)
                µ                        Monadic chain separation.
                 80ḶŒḄṖ                  Same as above, but this time yielding X.
                       ⁸ị                Modular index i into X, yielding the
                                         value for x.
                          x              Repeat x times
                         ⁶               the whitespace character.
                           ⁸             Output that (x times ' ') and continue
                                         with value i.
                                         -> Cursor is at position (x, y), the
                                            final position.
                             œS.1        Wait 0.1 seconds.
                            ‘            Return i + 1.

Ç1¿                                      Main (niladic) link.
 1¿                                      While true.
Ç                                        Call the helper link. The first time
                                         there is no argument and i will be [],
                                         which is cast to 0 when used as integer
                                         (e.g. try ‘¶Ç). After that, the previous
                                         return value (i + 1) is used.

2

SmileBASIC, 85 74 bayt

SPSET.,9M=MAINCNT
SPOFS.,ASIN(SIN(M/5))*122+192,112+71*ASIN(SIN(M/3))EXEC.

Topun konumu 2 üçgen dalga ile modellenebilir ve bunları SmileBASIC'te üretmenin en kısa yolu kemerin (sinüs (x)) idi. (SB MODyerine algoritma MOD kullandığından daha uzundu %)


2

CSS / HTML, 200 + 7 = 207 bayt

p{position:relative}a{position:absolute;animation:infinite linear alternate;animation-name:x,y;animation-duration:7.9s,2.3s}@keyframes x{from{left:0}to{left:79ch}}@keyframes y{from{top:0}to{top:24em}}
<p><a>O

Bu sürüm, tuvalin boyutunu gösterir ve ayrıca animasyona daha pikselli bir his verir:


2

Dyalog APL, 44 bayt

{⎕SM∘←0,G←⍺+⍵⋄G∇⍵×1-2×⊃1 G∨.≥G⎕SD⊣⎕DL.1}⍨1 1

Açıklama:

  • {... }⍨1 1: verilen işlevi ⍺ = ⍵ = 1 ile çağırın 1
    • ⎕SM∘←0,G←⍺+⍵: Mağaza ⍺+⍵içinde G, bir görüntüler 0söz konusu konumda ⎕SMpencereye.
    • ⎕DL.1: saniyenin 1 / 10'unu bekleyin
    • ⊃1 G∨.≥G⎕SD: Onay Golan ⎕SMcam sınır ( 1≥Gya da G≥⎕SD, ⎕SDbir s creen d imensions)
    • 1-2×: seyahat yönünü çevirmek için harita [1,0]üzerine[¯1,1]
    • ⍵×: mevcut seyahat yönünü bununla çarpın
    • G∇: özyineleme, Gyeni konum ( ) ve ⍵....yeni yön ( ) olsun.

Bunun terminalleri sürekli olarak açıp kapatması gerekiyor mu? Terminal bir saniyenin onda birini kapattığından ve yeniden açtığından (en azından Windows'ta) bunun çalışmasını durdurmak oldukça zordur.
ren

1
@wptreanor: sabit
marinus

harika, mükemmel iş!
ren

2

PHP 112 97 94 103 102 bayt

for(;;usleep(1e5),$i%=624)echo($r=str_repeat)(A^K,99),$r(A^a,abs($i%78-39)),O,$r(A^K,abs($i++%48-24));

Osağ üst köşeden başlayarak 40x25 ızgaradaki bir sermayeyi zıplar;
ekranı temizlemek için 99 satır yazdırır.

İle çalıştırın -nr.

A^K= chr(10)= yeni satır
A^a= chr(32)= boşluk


1
Merhaba Titus yine benim. for($d=$e=-1;;usleep(1e5))echo($r=str_repeat)(A^K,99),$r(A^a,$x+=$d*=$x%79?1:-1),O,$r(A^K,$y+=$e*=$y%24?1:-1);. Modulo 0 ve N'de yanlıştır ve yönü geri döndürür. Ne yazık ki -1 $ ve -1 $ -1 başlatmak zorunda ama yine de biraz tasarruf almak. $x%79<=>.5aynı bayt için de çalışır.
Christoph

1
Hey @Christoph tekrar hoş geldiniz. Garip: Eşyalarını kopyaladığımda 110 yerine 116 bayt vardı. Ama bana çok daha kısa bir şeye ilham verdi.
Titus

Biz kesinlikle iyi bir takımız;) Kopyalama konusunda garip bir şey var.
Christoph

2

Simons´ BASIC (C64), 66 65 bayt

@ShaunBebbers sayesinde bir bayt kurtarıldı.

Burada sadece bir satıra ihtiyacım var, çünkü Simons´ Basic bir modulo fonksiyonuna sahip.
AfaIk, bu fiziksel bir C64 ve bir Simons BASIC modülü
(veya modişlevi olan herhangi bir BASIC uzantısı ) gerektirir.

0fori=0to623:print"{CLR}":poke1024+40*abs(mod(i,48)-24)+abs(mod(i,78)-39),81:next:goto

Şu 69 karakteri yazın:

0fOi=0TO623:?"{CLR}":pO1024+40*aB(mod(i,48)-24)+aB(mod(i,78)-39),81:nE:gO

{CLR}olduğu PETSCII ekranını temizler 147. Yazmak için Shift + CLR / HOME tuşlarını kullanın.

bytecount

Diske kaydedilen zaman komutlar simgeleþtirilmiþ, bunun nedeni, 65 bayt alır:
for, to, poke, abs, nextve gotoher bayt biridir; modiki bayt alır.
Bu da 59 bayt kod artı işaretçiler için 4 bayt ve satır numarası için 2 bayt yapar.

Referans için, bkz . C64'ü eşleme ve $800(BASIC Program Metni) öğesini arama .
(Video Ekranı Bellek Alanını adresinde bulabilirsiniz $400.)

Yıkmak

Program I0 ila 623 arasında döngüye girer (= 48 ve 78 eksi 1 LCM). Döngünün içinde

  • ekran temizlendi
  • I sırasıyla 39..0..38 ile eşleştirilir 24..0..23
  • ve damla (PETSCII 81) video belleğinde
    (orijinal programın yaptığı gibi) ilgili konuma yerleştirilir .

Döngü tamamlandığında, program 0 satırına atlayarak yeniden başlatılır.

C64 BASIC, 77 76 bayt

0fori=0to623:print"{CLR}"
1poke1024+40*abs(i-48*int(i/48)-24)+abs(i-78*int(i/78)-39),81:next:goto

Ne yazık ki iki satıra ihtiyacım var, çünkü tüm olası kısaltmalar ile bile 83 karakter alacaktı - C64 satır editörünü kullanmak için çok fazla:

0fOi=0to623:?"{CLR}":pO1024+40*aB(i-48*int(i/48)-24)+aB(i-78*int(i/78)-39),81:nE:gO

(Onaltılık bir düzenleyici daha uzun bir satır oluşturmak için kullanılabilir - bu da 73 bayt yapar.)


1
Commodore komut ayırıcılar vardır :ve değil;
Shaun Bebbers

1
Ayrıca sıfır satırından başlarsanız, BASIC 2gotogotogoto 0
Shaun Bebbers

C64 BASIC listenizde daha fazla komut almak istiyorsanız, 128 modda bir C128'e girin, diske kaydedin ve tekrar C64 moduna yükleyin, C128'in varsayılan olarak 160 karakter sınırı vardır, böylece bu bariyer Commodore anahtar kelime kısaltmaları kullanarak.
Shaun Bebbers

@ShaunBebbers bilmek güzel. Çok uzun zaman oldu. Ben de bunu makine kodunda uygulamak istedim ... çekirdek rutinlerini tekrarlamaya çalışarak; ne kayıtları ne zaman yedeklemeniz gerektiğinden emin değilim; tam çekirdek listesi çevrimiçi ; Daha fazla kazmak için zaman ayıramam. Sen tamamlamak ister misiniz bu ?
Titus

Bir MC versiyonu hazırlayacaktım, ancak kendi zorluğuma göndermenin benim için bile fazla hoşgörülü olacağını düşünüyorum. En hızlı şekilde gelen doğrudan ekrana byte yazmak olacaktır $0400için $07e7; veya sprite kullanın. Çekirdeği $ffd2(çıkış akümülatörü) ile kullanmak, imleç üzerindeki X ve Y konumunu yeterince kolayca ayarlayabildiğiniz için işe yarayacaktır (bunun için çağrıyı hatırlamıyorum), ancak zorlaması durumunda son karakter konumundan kaçınmanız gerekebilir satır besleme.
Shaun Bebbers

1

Python 2, 176168 Bayt

Bu, terminal boyutunun 80x24 olduğunu varsayar. Kesinlikle optimal değil ama ben golf yeni evet.

import time;x=y=d=e=1
while 1:
 m=[[' 'for i in' '*80]for j in' '*24];x+=d;y+=e;m[y][x]='O';time.sleep(.1)
 if x%79<1:d=-d
 if y%23<1:e=-e 
 for r in m:print''.join(r)

X <1 veya x> 79 yerine x% 79 <1 ve y için ditto önerdiği için R. Kap'a teşekkürler.


Sen değiştirerek birkaç byte kaydedebilirsiniz x<1or x>78ile x%79<0ve y<1or y>22ile y%23<1.
R. Kap

1

Rebol / Görünüm, 284266 bayt

rebol[]p: 3x9 d:[3 3]view layout[b: box blue 99x99 effect[draw[circle p 2]]rate :0.01 feel[engage: func[f a e][if a = 'time[case/all[p/x < 2[d/1: abs d/1]p/y < 2[d/2: abs d/2]p/x > 98[d/1: negate d/1]p/y > 98[d/2: negate d/2]]p/x: p/x + d/1 p/y: p/y + d/2 show b]]]]

Ungolfed:

rebol []

p: 3x9     ;; starting position
d: [3 3]   ;; direction

view layout [
    b: box blue 99x99 effect [
        draw [
            circle p 2
        ]
    ]

    rate :0.01 feel [
        engage: func [f a e] [
            if a = 'time [
                case/all [
                    p/x < 2  [d/1: abs d/1]
                    p/y < 2  [d/2: abs d/2]
                    p/x > 98 [d/1: negate d/1]
                    p/y > 98 [d/2: negate d/2]
                ]
                p/x: p/x + d/1
                p/y: p/y + d/2
                show b
            ]
        ]
    ]
]

1

C 294 bayt

#include<graphics.h> f(){int d=0;g,x,y,a=0,b=0;initgraph(&d,&g,NULL);x=30;y=30;while(1){x+=6;y+=7;if(y<60)b=0;if(x<60)a=0;if((y>getmaxy()-40)) b=!b;if((x>getmaxx()-40))a=!a;if(b){y-=18;x+=3;}if(a){x-=15;y+=2;}usleep(10000);setcolor(4);cleardevice();circle(x, y,30);floodfill(x,y,4);delay(45);}}

Ungolfed sürümü:

#include<graphics.h>
void f()
{
 int d=DETECT,g,x,y,r=30,a=0,b=0;
 initgraph(&d,&g,NULL);
 x=30;
 y=30;

 while(1)
 {
   x+=6;
   y+=7;

   if(y<60)
     b=0;
   if(x<60)
     a=0;     

   if((y>getmaxy()-40))
        b=!b;

   if((x>getmaxx()-40))
        a=!a;

    if(b)
    {       
        y-=18;
        x+=3;
    }

    if(a)
    {       
       x-=15;
       y+=2;               
    } 
    usleep(10000);
    setcolor(RED);
    cleardevice();
    circle(x,y,r);
    floodfill(x,y,RED);
    delay(45);

  }   

}

açıklama

  • Yani bu ile başlamak için, ben almak zorunda graphics.hbenim de /usr/includedizindeki. Bu nedenle, aradım ve bulduğum şey bu . Linux için SDL kullanan bir TurboC Graphics uygulamasıdır. Ayrıca OpenGL kullanılabilir. Windows'ta, sanırım zaten yüklü, MacOS hakkında emin değilim.
  • void initgraph(int *graphdriver, int *graphmode, char *pathtodriver);sistemi başlatır ve grafik moduna geçirir, bu durumda grafik sürücüsü otomatik olarak algılanır. Daha fazla ayrıntı için lütfen bu bağlantıya bakın.
  • xve ytopun konumunu belirleyen koordinatlardır.
  • ave bbayrak vardır aolduğunda sıfıra ayarlanır xdeğeri 60 altına düşerse ve bsıfıra ayarlanır y60 altına düşer.
  • Bayraklar konum değiştirir zaman edilir xve ypencerenin sınır değerlerini aşan ve koordinatları buna göre ayarlanır.
  • usleepCPU'mun strese girmemesi için bir koydum .
  • closegraph()Pencereyi kapatmak için normalde bir çağrı kullanılmalıdır . Ama burada eksik.

Bağlayıcı bayrağıyla derlenmelidir -lgraph

Gerçek donanımda daha sorunsuz çalışır. :)

Zıplayan Kırmızı Top


Bu programı çalıştırmak için içe aktarma ifadeleri gerekli mi?
Kritixi Lithos

@KritixiLithos Evet efendim; Güncellenmiş! dahil etmeniz gerekir graphics.h. Bu cevap askubuntu.com/questions/525051/… yardımcı oldu.
Abel Tom

1

MATL , 42 bayt

1thXH_XI`Xx8E70hZ"79HZ}&(DH4M\1>EqI*XIH+XH

70 × 16 ekran ve karakter kullanır O. Birkaç sıçrama beklerseniz topun köşeye çarptığını görürsünüz.

MATL Online'da deneyin!

Ekran boyutu kodda kolayca değiştirilebilir. İlgili kısım, 8E70iten 8, ikiye katlayan ve iten kısımdır 70. Örneğin, 80 × 25 ekran için yerine 5W80itin 5, iten , kareler ve iten 80(veya değiştirin 25 80, ancak bu bir bayt daha gerektirir).

Ayrıca, tDkodun sonuna ekleme geçerli konumu gerçek zamanlı olarak gösterir (dikey, sonra yatay, 1 1sol üsttür). Örnek olarak, bir 80×18ekran için,

1thXH_XI`Xx9E80hZ"79HZ}&(DH4M\1>EqI*XIH+XHtD

Siz de deneyin!

açıklama

Bu sonsuz bir döngü kullanır. Konum panoda H1 × 2 vektör olarak tutulur ve yön panoda I1 × 2 vektör olarak girişlerle tutulur 1veya -1.

Her yineleme ekranı temizler, bir boşluk matrisi tanımlar O, ilgili konuma bir yazar ve görüntüler. Ardından konum ve directio güncellenmelidir.

Konum 1esaslıdır ve bu nedenle ekranın kenarları 1ve maksimum ekran boyutudur. Dolayısıyla, konum modülo ekran boyutu birinci veya ikinci bileşen verirse 0ya da 1sırasıyla ya dikey ya da yatay bir kenara ulaştığımız anlamına gelirse , yön vektörünün bu bileşeni ihmal edilir. Bundan sonra, yeni pozisyonu elde etmek için mevcut pozisyona yeni yön eklenir.


1

İşte ZX Spectrum listesi.

  10 FOR n=0 to 7
  20 READ a: POKE USR "a"+n, a
  30 NEXT n
  40 DATA 60,126,243,251,255,255,126,60
  50 LET x=10:LET y=10:LET vx=1: LET vy=1
  60 PRINT AT y,x;"\a"
  70 IF x<1 OR x>30 THEN LET vx=-vx
  80 IF y<1 OR x>20 THEN LET vy=-vy
  90 LET x=x+vx: LET y=y+vy
 100 PRINT AT y-vy,x-vx;" ": GO TO 60

Güzel ilk giriş DrlB - lütfen bir bayt sayısı ekleyebilir misiniz? Bu 16K makineleri de dahil olmak üzere herhangi bir Speccy üzerinde çalışacağını varsayalım?
Shaun Bebbers

Merhaba bu 201 bayt, ilk 4 satır atlayabilirsiniz ama sonra sadece bir zıplayan "a" karakteri olsun ama size 64 bayt kaydeder. Optimize etmeye çalışacağım. Bu hiçbir şey fantezi ve herhangi bir Spectrum model üzerinde çalışacaktır :)
DrIB

Tamam, top grafiklerini düşürmeden çizgileri biraz yoğunlaştırarak 185'e indirmeyi başardım. Yine de biraz daha az okunabilir ama daha hızlı.
DrIB

1

C + lanetleri, 190 bayt

#include<curses.h>
w;h;x;y;d;main(e){initscr();curs_set(0);getmaxyx(stdscr,h,w);for(d=e;;usleep(20000),mvaddch(y,x,32)){mvaddch(y+=d,x+=e,48);if(!y||y>h-2)d=-d;if(!x||x>w-2)e=-e;refresh();}}

Açıklama:

#include<curses.h>
w;h;x;y;d;
main(e)
{
    initscr();
    curs_set(0);
    getmaxyx(stdscr,h,w);

    // initialize distances to 1 (e is 1 when called without arguments)
    // wait for 1/5 second, then write space character at current pos
    for(d=e;;usleep(20000),mvaddch(y,x,32))
    {
        // advance current pos and write ball character (`0`)
        mvaddch(y+=d,x+=e,48);

        // check and change direction:
        if(!y||y>h-2)d=-d;
        if(!x||x>w-2)e=-e;

        // trigger output to screen:
        refresh();
    }
}

1

Lua ( LÖVE 2D ), 130 bayt

x,y,a,b=0,0,1,1
function love.draw()a=(x<0 or x>800)and-a or a
b=(y<0 or y>600)and-b or b
x=x+a
y=y+b
love.graphics.points(x,y)end

Lua, kod golf konusunda en iyi dil değil, ama işte gidiyorsunuz! Bahsetmeye değer birkaç nokta:

  • Varsayılan tuval boyutu 800 x 600'dür. Yapılandırma dosyasında değiştirilebilir, ancak boyut kısıtlaması görmedim, bu yüzden olduğu gibi bıraktım.

  • love.draw()LÖVE çizim işlevidir ve önceden belirlenmiş bir adı vardır. Olacağını kullanılabilecek alternatif Aşk fonksiyonları love.update(dt)ve love.run()sonsuz döngüye yerleşik ilk varlık uzun, bayt ve sonuncusuna kısa, evet, ama olmadan -. Bu nedenle, draw()burada en iyi bahisimiz gibi görünüyor.

  • Yukarıdaki versiyon love.graphics.pointstopu çizmek için kullanılır. Daha kısa olmasına rağmen, izin verildiğinden emin değilim. İşte nasıl çalıştığına dair bir GIF:

Animasyonlu ekran görüntüsü - nokta

Gördüğünüz gibi (veya belki de göremediğiniz), ekranda tek bir piksel hareket ediyor. Bu bayt tasarrufu sağlarken, sonuçlardan en tatmin edici değildir.

Bu yüzden alternatif bir 131 bayt çözüm hazırladım :

x,y,a,b=0,0,1,1
function love.draw()a=(x<0 or x>795)and-a or a
b=(y<0 or y>595)and-b or b
x=x+a
y=y+b
love.graphics.print(0,x,y)end

Bu, love.graphics.print- metni basan - ve 0bir top olarak kullanır , bu da onu daha görünür ve çekici hale getirir.

Animasyonlu ekran görüntüsü - sıfır


1

CHIP-8, 36 34 28 bayt

FF29 'LDF I,vF //load digit sprite for the value of vF (should be 0)

4000 'SNE v0,0 //if x is 0...
6201 'LD v2,1 //set x velocity to 1
403C 'SNE v0,3C //if x is 3C...
62FF 'LD v2,FF //set x velocity to -1
4100 'SNE v1,0 //if y is 0...
6301 'LD v3,1 //set y velocity to 1
411B 'SNE v1,1B //if y is 1B...
63FF 'LD v3,FF //set y velocity to -1

D015 'DRW v0,v1,5 //draw sprite
D015 'DRW v0,v1,5 //draw sprite again to clear it.
8024 'ADD v0,v2 //add x velocity to x
8134 'ADD v1,v3 //add y velocity to y

1202 'JMP 202 //jump to second instruction

Burada süslü numara yok ...

Sprite'ları doğru bir şekilde çizen bir tercüman gerektirir (çerçeve başına yalnızca bir sprite çizilebilir, bu da programı görebilmeniz için yeterince yavaşlar).

Düşük kaliteli video


0

ZX Spectrum BASIC - 179 bayt

Burada biraz yoğunlaşmış. Top grafikleri dahil 179 bayt

  10 LET a=10: LET b=10: LET c=1: LET d=-1: FOR e=0 TO 7: READ f: POKE USR "a"+e, f: NEXT e
  20 DATA 60, 126,243,251,255,255,126,60
  30 PRINT AT b,a;"\a"
  40 IF a<1 OR a>30 THEN LET c=-c
  50 IF b<1 OR b>20 THEN LET d=-d
  60 LET a=a+c: LET b=b+d: PRINT AT b-d, a-c;" ": GO TO 30

Lütfen, karakteri kullanarak da yanıtlar için kullanılan işaretlemeye bakın oveya Osembolik listeye bazı baytları kaydedebilirsiniz; aynı soruyu yeniden yanıtlamak yerine, çözümleriniz olduğunda önceki yanıtları da düzenleyebilirsiniz
Shaun Bebbers
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.