Aku terlalu dingin, naikkan suhunya


53

Ini adalah kontes golf pertamaku.

Apa yang kamu butuhkan

Bangun saya, dalam jumlah sesingkat mungkin, sistem kendali jarak jauh AC saya. Kamar saya terlalu dingin sekarang, dan saya kehilangan remote saya.

Sekarang, saya tidak ingin Anda benar-benar membangunnya atau apa pun, hanya bermain golf ini:

Peningkatan suhu yang lambat, mulai dari 40 derajat, dan berakhir tepat pada 72. Waktu kenaikan harus selalu 500 milis per kenaikan. Itu bisa menunggu 500ms lagi di akhir. Saya lebih suka berhenti. Peningkatan itu sendiri harus naik dua kali setiap kali, seperti jarak jauh saya.

Anda tidak harus menghapus layar. Anda harus memiliki baris baru.

Apa yang harus terjadi?

Contoh output (semua yang ada di tanda kurung tidak boleh di-output).

40
(wait 500 millis)
42
(wait 500 millis)
44
(..repeat until 72..)
72
(stop or wait 500ms)

Perlu diingat Ini adalah golf pertama saya, jadi saya minta maaf jika ini terlalu sulit untuk golf. :(

Semoga beruntung, pegolf!


3
Hal kecil, tetapi "harus selalu 500 juta" pada dasarnya terlalu ketat untuk perangkat yang masuk akal. Saya akan merekomendasikan menentukan varians, sekitar +/- 10%.
FryAmTheEggman

1
Bisakah Anda menunggu 500 ms sebelum menampilkan output awal?
FlipTack

35
-1 untuk menggunakan Fahrenheit (tidak juga, tetapi Anda setidaknya harus mengatakan Anda menggunakannya; 40 derajat celsius tidak terlalu dingin sedikit pun)
John Dvorak

20
+1 untuk menggunakan Fahrenheit, ia memiliki resolusi yang lebih baik daripada Celsius dan sama sewenang-wenangnya dengan apa pun yang bukan Kelvin atau Rankine
Nick T

8
@NickT maka Anda kurang beruntung karena resolusi jarak jauh ini adalah 2 ° F yang lebih tinggi dari 1 ° C. Dan Anda bisa mendapatkan resolusi yang lebih tinggi dalam Celcius daripada Fahrenheit dengan remote yang dapat menampilkan 0,5 dan lebih banyak lagi jika dapat ditampilkan hingga 0,1. Pokoknya saya orang yang sederhana dan tidak dapat membedakan antara 22 dan 23 ° C sehingga resolusi tinggi dalam hal ini tidak berguna bagi saya
phuclv

Jawaban:


43

Utilitas Bash + linux, 19

seq 40 2 72|pv -qlL2

seqmenghasilkan output numerik. pvratelimits ke 2 baris / detik.


2
Output -qmenekan pergi ke STDERR, jadi saya tidak berpikir Anda membutuhkannya.
Dennis

14
Peragaan yang sangat baik dari "lakukan satu hal dan lakukan dengan baik" dengan alat yang tepat untuk pekerjaan itu. :)
Gagang Pintu

2
Mendekati "anti-golfscript anti-golf" wilayah.
Vi.

42

Minecraft 1.9.0+, 204 162 byte + 58 36 28 24 20 blok = 262 240 232 186 182 blytes

Solusi ini diturunkan, dan tidak dapat dilihat secara keseluruhan dalam satu, atau bahkan dua tangkapan layar. Menggunakan dua gangguan dan menyalahgunakan dua fitur permainan lainnya

LARI!  MINECRAFT AKAN MEMBUNUH ANDA!

Solusi ini menggunakan prinsip yang sama dengan yang di bawah ini, hanya 4 blok desain yang lebih kompak.

  • Menyalahgunakan fakta bahwa blok perintah rantai (blok hijau) tidak dapat ditenagai oleh redstone, hanya dengan singal dari blok perintah impuls (oranye).

  • Menyalahgunakan piston fakta butuh 0,30 detik untuk memperpanjang sepenuhnya, dan redstone hanya perlu 0,10 detik untuk mendaftarkan sinyal.

  • Juga menyalahgunakan kesalahan berlipat ganda untuk mematikan timer (TNT): redstone di sebelah timer (TNT) tidak hanya diberi daya, tetapi juga berpikir bahwa TNT adalah redstone lain dan memperkuatnya.

  • Di atas semua pelanggaran ini, shortener sinyal (hal di bawah TNT) adalah salah satu digunakan, setelah itu akan didukung perubahan bentuk, yang memungkinkan untuk melewatkan sinyal melalui ke "incrementer" (paling atas blok orange)

Sedikit penjelasan tentang fungsi dari bagian-bagian yang berbeda dapat dilihat pada solusi yang lebih lama (tetapi yang terbaik di bagian bawah). Anda juga dapat mencobanya secara offline! (solusi disederhanakan bertambah 4, hanya bekerja di 1.11+) dengan menjalankan perintah ini di blok perintah .


Solusi lama, Minecraft 1.9.0+, 186 blytes:

PENYALAHGUNAAN MINECRAFT

Karena TNT biasanya meledak setelah 3.0s di Minecraft, TNT harus ditempatkan dengan perintah ( /setblock) dengan sekering yang ditentukan. Juga menggunakan desain yang lebih kompak untuk menghapus blok perintah yang berlebihan (mengandung 42 byte) dan redstone terhadap versi yang lebih lama. Saya yakin ini tidak bisa lebih rendah ...

Solusi yang lebih lama, Minecraft 1.9.0+, 232 blytes:

Ups, saya mengetahui peningkatan solusi yang lebih lama ini pada 4 ...

golfcraft

Menggunakan fitur rantai blok perintah 1.9 (green block thing) untuk menyimpan blok. Juga menggunakan pemendek sinyal yang lebih kompak daripada solusi yang lebih lama

Solusi yang lebih tua, Minecraft 1.7.0+, 240 blytes:

monster tanpa jiwa

Menggunakan timer yang lebih ringkas (TNT) kemudian solusi pertama (di bawah).

Solusi terlama, Minecraft 1.7.0+, 262 blytes:

monster tua


Ini sangat lama karena cara Minecraft menangani variabel:

  • Untuk mendefinisikan variabel (int): scoreboard objectives add <variable> dummy

  • Untuk menetapkan nilai ke variabel (setiap entitas termasuk pemain memiliki nilai variabel sendiri): scoreboard players set <entity> <variable> <value>

    • *dapat digunakan <entity>untuk memilih semua entitas dan menyimpan byte.

    • hanya variabel yang ditentukan yang dapat digunakan

    • nilai variabel harus diatur ke angka, bukan variabel

  • Untuk menambah var1 oleh var2: scoreboard players operation <entity> var1 += <entity> var2

    • <entity>harus berupa entitas tunggal, mis. @ptidak*

Tangkapan layar adalah milik saya sendiri, dua lisensi di bawah WTFPL dan lisensi SE apa yang memutuskan untuk digunakan hari ini (saat ini cc by-sa 3.0 with attribution required) :-)


2
Wow! Anda menggunakan Minecraft, itu jenius! +1 :)
IMustBeSomeone

1
@IMustBeSomeone Tunggu, saya menemukan cara untuk bermain golf ini :)
RudolfJelin

1
... Sirkuit Anda meledak sendiri saat selesai.
SuperJedi224

@ SuperJedi224 Ya. Apakah itu salah?
RudolfJelin

2
@ RudolfL.Jelínek Saya cukup yakin itu tidak benar-benar melanggar aturan, tapi agak aneh. Kemudian lagi, itu bagian dari apa yang dimaksud dengan kode golf.
SuperJedi224

18

Vim, 24 , 23 byte / penekanan tombol

i40<esc>qq:sl500m
Yp2<C-a>q15@q

Satu byte disimpan berkat @Kritixi Lithos!

Ditulis dari ponsel saya, diuji dalam vim seluler (yang tampaknya merupakan hal yang nyata).

Berikut ini gif dari itu berjalan:

masukkan deskripsi gambar di sini

Dan inilah penjelasan perintah-demi-perintah:

i40<esc>            " Insert '40' into the buffer
        qq          " Start recording into register 'q'
          :sl500m   " Sleep form 500 ms
Y                   " Yank this line
 p                  " and paste it on a newline
  2<C-a>            " Increment this line twice
        q           " Stop recording
         15@q       " Callback register 'q' 15 times

The sdalam msadalah opsional, Anda dapat menghapusnya untuk menyimpan byte :)
Kritixi Lithos

@ KritixiLithos Saya tahu itu! Bagaimana saya mengabaikannya? Terima kasih!
DJMcMayhem

8
Siswa telah menjadi guru: P
Kritixi Lithos

1
"Saya akan memposting gif dan penjelasan nanti setelah saya memiliki akses ke komputer" menunggu setengah tahun (tidak cukup)
HyperNeutrino

@HyperNeutrino Hahahahaha, saya benar-benar lupa tentang jawaban ini. Apakah itu lebih baik: P
DJMcMayhem

10

JavaScript (ES6), 52 byte

f=(i=40)=>console.log(i)|i-72&&setTimeout(f,500,i+2)

f()


Berikut adalah lebih rapi penataan kembali jawaban Anda untuk Anda: f=(i=40)=>setTimeout(i>70||f,500,i+2,console.log(i)). Sayangnya, masih sama 52 byte.
Ismael Miguel

Bukankah ini harus 50byte karena Anda tidak perlu menghitung f=berdasarkan pada konsensus meta bahwa deklarasi fungsi anonim diizinkan?
R. Kap

1
@ R.Kap tangkapan bagus, tetapi dalam kasus ini, f=diperlukan karena fungsi perlu memanggil dirinya sendiri (sebagai parameter pertama ke setTimeout).
ETHproduksi

8

Jelly , 13 12 byte

40µṄœS.+2µ⁴¡

Cobalah online! Program Jelly dibungkus dengan skrip Bash untuk mengawali setiap baris output dengan cap waktu.

Bagaimana itu bekerja

40µṄœS.+2µ⁴¡  Main link. No arguments.

40             Set the return value to 40.
  µ      µ⁴¡  Execute the chain between the two µ 16 times.

   Ṅ           Print the return value, followed by a linefeed.
      .        Yield 0.5.
    œS         Sleep for 0.5 seconds. Yield the previous result.
       +2      Add 2.

Setelah iterasi terakhir, nilai akhir dari 72 dicetak secara implisit dan program keluar.


Wow, apakah itu fitur yang dimaksudkan, bisa memanggil bahasa lain dari Bash in tio?
miles

2
Ya, itu dimaksudkan. Anda harus dapat melakukan hal yang sama dari semua bahasa yang mendukung panggilan sistem atau fitur serupa.
Dennis

Untuk bahasa yang memenangkan tantangan golf dan bagian dari tantangan yang bertambah dengan nilai konstan, ini terlihat sangat lama bagi saya :)
AlexRacer

6

Perl 6 , 30 byte

for 20..36 {sleep .5;say 2*$_}

Maaf sepertinya kode un-golfed, saya tidak melihat cara untuk membuatnya lebih pendek ...

Versi yang berhenti tepat setelah nomor terakhir, akan menjadi 37 byte:

for 20..36 {sleep .5 if $++;say 2*$_}

Apakah Anda membutuhkan ruang setelahnya 36?
NoOneIsHere

2
.say&sleep(.5) for 40,42...7229 byte
ugexe

@ugexe: Mengandalkan efek samping dari argumen operator non-hubungan pendek yang terjadi secara berurutan, terasa seperti peretasan khusus implementasi bagi saya, karena AFAIK spesifikasi bahasa tidak menjamin hal ini. OTOH, mungkin untuk golf kode tidak apa-apa?
smls

@SeeOneRhino: Ya. Tanda {kurung mengikuti ekspresi lain tanpa spasi putih, ditafsirkan sebagai awal dari subkrip hash ("array asosiatif"). Perl 6 ketat seperti itu, karena tata bahasanya sengaja dirancang untuk memungkinkan one-pass parsing kode sumber dengan (hampir) tidak ada backtracking.
smls

6

Pyth - 12 byte

Sangat sederhana, menggunakan for for dari 0-17.

V17+40yN.d.5

Terkecil sejauh ini, Anda terikat untuk tempat pertama :)
IMustBeSomeone

6

TI-Basic (CE atau CSE saja), 16 byte

:For(A,40,72
:Pause A,.5
:End

Perhatikan bahwa banyak perintah adalah token byte tunggal.


Saya melihat 29 byte? Apakah mungkin bagi Anda untuk menampilkan kode 8 byte?
redstarcoder

1
TI-Basic memiliki set karakternya sendiri. For(, Pause , End, Dan titik dua pada awal garis semua byte tunggal.
Julian Lachniet

Aneh ... baiklah, sepertinya jawaban lain juga melakukannya.
redstarcoder

1
Yang terbaik sejauh ini! Namun, saya tidak tahu apakah saya akan menghitung set karakter itu.
IMustBeSomeone


5

MATL , 14 byte

17:E38+".5Y.@D

Cobalah di MATL Online! Anda mungkin perlu memuat ulang halaman tersebut jika tidak berfungsi pada awalnya.

Penjelasan

17:     % Push array [1 2 ... 17]
E       % Multiply by 2, element-wise
38+     % Add 38, element-wise. This gives [40 42 ... 72]
"       % For each k in that array
  .5Y.  %   Pause 0.5 seconds
  @D    %   Push k and display
        % End (implicit)

Versi lama (sebelum perubahan spesifikasi), membersihkan layar

17:E38+"5&Xx@D

Cobalah di MATL Online!


Anda tidak perlu menghapus layar.
Adám

@ Adam Terima kasih. Saya tahu, tetapi butuh jumlah byte yang sama dan terlihat lebih bagus :-)
Luis Mendo

1
@LuisMendo Tantangan golf menyatakan sesuatu tentang tidak membersihkan layar, setelah diedit / diklarifikasi (mungkin setelah posting Anda)
Thomas Ward

@ThomasWard Terima kasih atas head-up! OP benar-benar harus memberi tahu para penjawab tentang perubahan itu
Luis Mendo

4

Dyalog APL , 20 byte

{⎕DL.5⊣⎕←⍵}¨38+2×⍳17

{ fungsi anonim

⎕DL menunda...

.5⊣ setengah (satu detik) daripada nilai

⎕← cetak (dengan baris baru)

 argumen

diterapkan untuk masing-masing

38+ tiga puluh delapan plus

dua kali

⍳17 bilangan bulat dari 1 hingga 17


4

C dikompilasi dengan Dentang 3.8.1 di Linux, 62 59 58 byte

2 byte disimpan berkat @ranisalt

s=38;main(){for(;s<74;printf("%d\n",s+=2))usleep(500000);}

59 byte

s=38;main(){for(;s<73;printf("%d\n",s+=2+usleep(500000)));}

62 Bytes

s=38;main(){for(;s!=72;){printf("%d\n",s+=2);usleep(500000);}}

s=38                # Initializes a global (int) variable, this is only possible in C, in other languages from the C family variables must have an explicit type.
main()              # Is the main entry point, again as before, in case a type isn't specified C defaults to int
printf("%d\n",s+=2) # printf outputs to stdout based on the pattern defined in the first parameter 
                    # %d is a placeholder for an int variable
                    # \n appends a newline to stdout
                    # The second parameter increments the s variable and afterwards it goes in the placeholder's spot.
usleep(500000)      # This function is Linux specific, it takes an int as parameter, it represents how much time the app needs to sleep in microseconds

2
Terima kasih atas jawabannya, dan selamat datang di situs ini. Bisakah Anda menambahkan sedikit penjelasan bagi mereka yang tidak terbiasa dengan bahasa Anda?
isaacg

1
Terima kasih telah menyambut saya. Ya tentu, saya bisa melakukannya. Juga, bagaimana cara membuat posting saya menghitung berapa banyak byte yang dibutuhkan? Saya menulis itu sendiri, tetapi dalam posting orang lain itu terlihat berbeda.
Wade Tyler

Semua orang menulis sendiri, tidak ada fitur penghitungan otomatis. Header Anda digunakan ** ... **dalam markup, sedangkan header tradisional di situs ini menggunakan # .... Saya telah mengedit jawaban Anda sehingga Anda dapat melihat bagaimana hasilnya.
isaacg

1
@isaacg Terima kasih banyak. Itu memang terlihat lebih baik sekarang.
Wade Tyler

1
Menggunakan s<72menyimpan byte lain.
ranisalt

4

Gores, 5 blok

(ruang disk 56.0kb)

img

(maaf untuk resolusi rendah!)

Cukup jelas, sungguh. Nilai variabel ditampilkan dalam kotak di "panggung".


Apakah ini tidak memiliki selisih 4? (Bertentangan dengan 2 sebagai permintaan)
VisualMelon

1
@VisualMelon Ah, terima kasih atas pemberitahuannya - Saya telah salah paham pertanyaannya sebelum diedit; Saya kemudian membacanya lagi dan mengedit jawaban saya yang lain sambil melupakan yang ini. Terima kasih!
RudolfJelin

3

Mathematica, 34 byte

Pause[Print@#;.5]&/@Range[40,72,2]

Program lengkap. Tidak membawa input dan output ke STDOUT.


3

R, 49 byte

x=38;while(x<72){Sys.sleep(.5);x=x+2;cat(x,"\n")}

Solusi yang sangat sepele tetapi itu berhasil.


Awal x = 40 tidak mencetak 40 saat mulai. Anda harus mulai dengan x = 38.
rnso

Lucu, ide yang sama tetapi dengan for-loop sama panjangnya.
JAD

3

Perl 6 , 27 byte

sleep .say/2 for 40,42...72

saymengembalikan True, yang dipaksa ke numerik 1ketika dibagi dengan 2.

Shenanigans Unicode dapat menurunkannya hingga 23 karakter:

sleep .say/2 for ㊵,㊷…72

Tapi itu 29 byte UTF-8-encoded.


3

Python 2, 57 56 55 Bytes

import time
a=40
while a<73:print a;time.sleep(.5);a+=2

SUNTING:

-1 Byte berkat Mega Man

-1 Byte, terima kasih kepada Flp.Tkc


1
Anda bisa menghemat satu byte dengan menggunakan 0,5 bukannya 0,5
Mega Man

@MegaMan Terima kasih, saya tidak menyadari itu bisa bekerja
sonrad10

Mengapa tidak melepas tanda kurung di sekitar pernyataan cetak dan menggunakan Python 2?
FlipTack


3

C #, 95 byte

()=>{for(int i=40;i<73;i+=2){System.Console.WriteLine(i);System.Threading.Thread.Sleep(500);}};

Ini adalah loop sederhana, menunggu 500ms ekstra di akhir.


3

QBIC , 21 byte

[44,72,4|?a┘'sleep 1.

QBIC memulai loop-FOR, berjalan dari 44 ke 72 dan menambah penghitung dengan 4 pada setiap loop. Kemudian tidur selama 1 detik. QBasic tidak memiliki kontrol yang lebih rumit sleep, jadi saya telah menambahkan .untuk mensimulasikan pemberian .5sebagai argumen.


3

Kotlin, 47 byte

Saya kira itu tidak dikatakan dalam pernyataan masalah bahwa solusi harus benar-benar mengandung selisih dua, jadi 40+2*ilegal di sini.

Jika ditulis sebagai sumber Kotlin biasa dengan main:

fun main(args:Array<String>){(0..16).map{println(40+2*it);Thread.sleep(500)}}

(77 byte)

UPD : Di Kotlin 1.3, args:Array<String>dapat dihapus, jadi lebih sedikit 18 byte.

Dan dalam Skrip Kotlin, seluruh program akan menjadi

(0..16).map{println(40+2*it);Thread.sleep(500)}

(47 byte)


Program pertama Anda tampaknya pertama kali menunggu lama, lalu menampilkan semua hasilnya.
devRicher

1
@devRicher, sepertinya Anda menjalankannya di try.kotlinlang.org. Jika demikian, itu masalah lingkungan, sepertinya stdout tidak memerah atau semacamnya. Ketika saya menjalankannya secara lokal, berperilaku seperti yang dimaksudkan.
hotkey


2

Haskell, 67 byte

import System.Posix.Unistd
mapM((>>usleep 500000).print)[40,42..70]

Jika Anda ingin menggunakan ghc saja, Anda dapat menyimpan beberapa byte dengan mengimpor GHC.Concdan menggunakan threadDelaybukan usleep.


2

php, 38 byte

for(;35>$t+=2;usleep(5e5))echo$t+38,_;

menggunakan garis bawah sebagai pembatas. Jalankan dengan -nr.


2

Clojure, 54 byte

(doseq[t(range 32 73 2)](println t)(Thread/sleep 500))

Kaki ketiga. Hanya mengulangi rentang, mencetak dan tidur setiap iterasi. Tidur di akhir.

Tidak Disatukan:

(doseq [t (range 32 73 2)]
    (println t)
    (Thread/sleep 500)))

Versi yang tidak tidur pada akhirnya, 66 byte

(doseq[t(range 32 73 2)](println t)(if(< t 72)(Thread/sleep 500)))

Catatan, ini adalah program lengkap karena instruksi tidak menentukan. Tambahkan byte ke masing-masing jika fungsi diperlukan.


2

Racket 46 byte

(for((i(range 40 73 2)))(println i)(sleep .5))

Tidak Disatukan:

(define (f)
  (for ((i (range 40 73 2)))
    (println i)
    (sleep .5)))

Perintah untuk dijalankan: (f)


1
Ingat, tidak harus berhenti di 72, itu bisa menunggu 500 ms lagi. :)
IMustBeSomeone

2

Oktaf, 38 35 byte

Disimpan 3 byte berkat @LuisMendo dengan mengubah endforkeend

for i=20:36;disp(2*i);sleep(.5);end

Cobalah online!

Saya baru mengenal Octave, jadi solusi ini mungkin masih bisa dimainkan lebih lanjut. Ada tips yang diterima!

Tidak disatukan

for i=20:36
  disp(2*i)
  sleep(.5)
end

2

Python 2, 57 58 Bytes

Sunting

Dihitung sebagai 57 byte pada perangkat saya, tetapi TIO mengatakan 58 sekarang saya kembali pada mesin saya sendiri sehingga itulah tawaran terakhir saya. Yang cukup menarik, TIO tampaknya tidak menghargai batas waktu dan hanya menunggu dan kemudian mencetak seluruh daftar sekaligus. Bekerja pada QPython untuk Android dan Python 2 pada kotak Ubuntu saya jadi itu cukup baik untuk saya.

import time
for x in range(40,74,2):print x;time.sleep(.5)

Cobalah online!

Akan menjadi 58 59 di Python 3 jadi tidak mengalahkan @ sonrad10.


1
Ini akan menimbulkan kesalahan sintaksis, Anda memerlukan titik dua (bukan titik koma) setelahrange(...)
FlipTack

Terima kasih @ Flp.Tkc. Itu diketik langsung di berguna saya kesalahan ketik.
ElPedro

2

R, 44 42 byte

Langsung untuk-loop, ada kemungkinan cara golf. (Juga, mencoret 44 masih teratur 44 ...)

for(i in 20:36*2)cat(i,"\n",Sys.sleep(.5))

2

F #, 60 byte

async{for i in 40..2..72 do printfn"%d"i;do!Async.Sleep 500}

Ini adalah ekspresi async, untuk menjalankannya meneruskannya ke Async.Startatau Async.RunSynchronously.


2

Noodel , 10 byte tidak bersaing

Tidak dapat bersaing karena Noodel lahir setelah tantangan diciptakan :(

40Ḷ16ñ++ḍh

Cobalah:)

Bagaimana itu bekerja

40         # Creates the literal number 40 and places it into the pipe.
  Ḷ16      # Loop the following code 16 times.
     ñ     # Print what is in the front of the pipe with a new line.
      ++   # Increment what is in the pipe by two.
        ḍh # Delay for a half a second (500ms).

Tidak ada versi Noodel yang mendukung sintaks yang digunakan dalam jawaban ini. Ini adalah versi yang benar:

kȥḶ16ñ⁺2ḍh

<div id="noodel" code="kȥḶ16ñ⁺2ḍh" input="" cols="10" rows="17"></div>

<script src="https://tkellehe.github.io/noodel/noodel-latest.js"></script>
<script src="https://tkellehe.github.io/noodel/ppcg.min.js"></script>

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.