Berapa lama saya harus menjalankan microwave?

33

Saya lapar. Mari kita microwave sesuatu. Diberikan input numerik antara 1 dan 4 digit, hasilkan jumlah detik yang harus dijalankan microwave.

Detail

Triknya adalah mencari tahu apakah pengguna memasukkan detik atau kombinasi detik dan menit. Yang dan puluhan tempat harus ditafsirkan sebagai detik dan ratusan dan ribuan tempat harus menit. Misalnya, nilai 1234harus ditafsirkan sebagai 12 menit, 34 detik dan 9876harus 98 menit, 76 detik. Mengetik 130dan 90keduanya menghasilkan waktu memasak 90 detik.

Berikut adalah beberapa input dan output lainnya:

  • 1 = 1
  • 11 = 11
  • 111 = 71
  • 1111 = 671
  • 9 = 9
  • 99 = 99
  • 999 = 639
  • 9999 = 6039

Aturan

Ini adalah , jadi program terpendek dalam byte menang. Tidak ada celah standar. Entri yang menang harus mengembalikan jawaban yang benar ketika diberikan input integer dari 1 hingga 9999.

Andrew Brēza
sumber
@WheatWizard, saya senang mengedit pertanyaan. Apakah Anda memiliki saran untuk apa yang harus saya katakan di bagian Detail? Mungkin saya bisa memperjelas kalimat ini: "Yang dan puluhan tempat harus ditafsirkan sebagai detik dan ratusan dan ribuan tempat harus menit."
Andrew Brēza
@WheatWizard Saya baru saja menambahkan lebih detail, beri tahu saya jika Anda pikir saya harus menambahkan lebih banyak.
Andrew Brēza
Apakah itu bekerja dengan input 9876?
Andrew Brēza
1
Aneh, saya baru saja akan
mengirim
Untuk apa hasilnya 190?
OldBunny2800

Jawaban:

9

Japt , 6 byte

ìL ì60

Uji secara online! ìLmengkonversi ke basis-100, dan ì60mengkonversi kembali ke basis 60, menghasilkan floor(n/100)*60 + n%100. Juga berfungsi dengan jam ( 10000 -> 3600, jumlah detik dalam satu jam).

Produksi ETH
sumber
1
Persis seperti yang saya miliki :)
Shaggy
7

C, C ++, Java, C #, D: 36 byte

D: 35 byte

C: 28 byte

Pertama kali saya punya jawaban sesingkat itu!

int r(int i){return i/100*60+i%100;}

D dapat memiliki optimasi khusus karena sistem template golf:

T r(T)(T i){return i/100*60+i%100;}

C memiliki optimasi khusus dengan int implisit:

r(i){return i/100*60+i%100;}

Kode untuk diuji

Dalam C (harus menyertakan stdio.h):

int main() {
    int testArr[] = {1,11,111,1111,9,99,999,9999};
    for(int i=0;i<8; ++i) {
        printf("%d = %d\n",testArr[i],r(testArr[i]));
    }
    return 0;
}

TIO Link

Dalam C ++ (harus menyertakan iostream):

int main() {
    std::initializer_list<int> testList{
        1,11,111,1111,9,99,999,9999
    };

    for (auto x : testList) {
        std::cout << r(x) << '\n';
    }
}

Cobalah online!

Di Jawa :

public class MainApp {

    int r(int i){return i/100*60+i%100;}

    public static void main(String[]a) {
        MainApp m = new MainApp();
        int testArr[] = new int[]{
                1,11,111,1111,9,99,999,9999
        };

        for (int v : testArr) {
            System.out.println(v + " = " + m.r(v));
        }
    }
}

Cobalah online!

Dalam C #

class Program {
    int r(int i){return i/100*60+i%100;}
    static void Main(string[] args) {
        var p = new Program();
        int[] testArr = new int[8]
        {
            1,11,111,1111,9,99,999,9999
        };
        foreach(int a in testArr) {
            Console.WriteLine(a + " = " + p.r(a));
        }
    }
}

Di D (harus mengimpor std.stdio) (tepatnya, saya tidak tahu cara menggunakan array di D):

void main() {
    int[] arr = [1,11,111,1111,9,9,999,9999];
    for(int i = 0; i < arr.length; i++)
        writeln(arr[i]," = ",r(arr[i]));
} 

TIO Link

HatsuPointerKun
sumber
Kode uji D menjadi catatan kaki dari TIO ini: tio.run/… , dan saya melihat Anda telah mempelajari sistem template :). (Ada foreachdalam D, saya hanya lupa bagaimana menggunakannya dengan sedih)
Zacharý
C dapat di-golf hingga 28 byte menggunakan C89 implisit-int.
pizzapants184
Anda harus memposting semua ini sebagai jawaban terpisah.
MD XF
6

Pyth - 9 8 byte

Mengonversi input ke basis 100, lalu mengartikannya sebagai basis 60 angka.

ijQ*TT60

Test Suite .

Maltysen
sumber
6

TI-Basic (83 series), 8 byte

Ans-40int(sub(Ans

Membutuhkan OS versi 1.15 atau lebih tinggi.

Misha Lavrov
sumber
6

dc , 10 byte

?9A~r60*+p

Cobalah online!

Penjelasan: di dc ketika Anda mendorong sth. pada tumpukan itu berjalan di atas

?         # read and push the input number on the stack
9A        # push 100: 9 * 10^1 + A[10] * 10^0 :D
~         # divide 2nd nr. by the top nr., push quotient, then remainder
r60*      # swap top 2 nr., then multiply the top by 60
+p        # add top 2 nr., then print result
seshoumara
sumber
5

Bash bc + sed, 30 28 byte

-2 byte terima kasih kepada @seshoumara .

bc<<<0`sed 's/..\?$/*60+&/'`

Cobalah online!

Mengambil input dari stdin. Pergi untuk pendekatan yang lebih kreatif: menyisipkan *60+sebelum 1 atau 2 digit terakhir, dan menambahkan 0ke awal untuk memperhitungkan input dengan hanya 1 atau 2 digit. Hasilnya kemudian diteruskan ke bc.

Justin Mariner
sumber
1
Jika Anda menghapus -rdan menggunakan \?, Anda bisa kehilangan 2 byte.
seshoumara
3

Perl 5, 15 + 1 (-p) byte

/..$/;$_-=40*$`
  • -l switch tidak dihitung karena untuk keterbacaan tes

Cobalah online

Nahuel Fouilleul
sumber
2

JavaScript, 21 byte

a=>(a/100^0)*60+a%100

Cobalah online!


sumber
Simpan 4 byte dengan menggunakan trik ovs - a- (a / 100 ^ 0) * 40
IanF1
1
@ IanF1. Terima kasih, tapi saya pikir itu akan mencuri ide mereka.
ya kamu benar. Terlalu antusias, maaf.
IanF1
3
@ThePirateBay Anda tidak benar-benar memenuhi nama Anda;)
kamoroso94
2

J , 12 byte

-40*&<.%&100

Ini adalah solusi Python 2 ovs yang dinyatakan dalam J. Terdiri dari hook dan fork:

┌─┬───────────────────────┐
│-│┌──┬────────┬─────────┐│
│ ││40│┌─┬─┬──┐│┌─┬─┬───┐││
│ ││  ││*│&│<.│││%│&│100│││
│ ││  │└─┴─┴──┘│└─┴─┴───┘││
│ │└──┴────────┴─────────┘│
└─┴───────────────────────┘

       %&100  - divides the number by 100
   *&<.       - finds the floor of the left argument and multiplies it to the left arg.
 40           - 
-             - subtracts the result of the above fork from the input 

Cobalah online!

Galen Ivanov
sumber
1
Jumlah byte yang sama dengan 60#.0 100#:].
FrownyFrog
@FrownyFrog - solusi Anda terlihat lebih cantik, tepuk tangan!
Galen Ivanov
2

Batch, 23 byte

@cmd/cset/a%1-%1/100*40
Neil
sumber
2

Haskell , 18 byte

f t=t-t`div`100*40

Cobalah online!

Pelabuhan Anotha.

Solusi pointfree, 21 byte

(-)<*>(*40).(`div`40)
benar-benar manusiawi
sumber
2

Labirin , 19 byte

?:_100%}#00/_60*{+!

Cobalah online!

Penjelasan

?      Read input.
:      Duplicate.
_100%  Mod 100.
}      Move off to auxiliary stack.
#00/   Divide by 100, using the stack depth to get a 1, instead of _1.
_60*   Multiply by 60.
{+     Retrieve the earlier result and add it.
!      Print.

IP kemudian mencapai jalan buntu dan mulai bergerak mundur. Ketika mencapai /itu mencoba divisi dengan nol yang mengakhiri program.

Martin Ender
sumber
2

Jeli , 5 byte

Sebagai tautan monadik (terima kasih untuk informasi sebelumnya, caird!):

b³ḅ60

Cobalah online!

... Atau sebagai program lengkap:

bȷ2ḅ60

Ini dapat diangkut dengan mudah ke 05AB1E, jadi:

05AB1E , 5 byte

тв60β

Cobalah online!

Cukup konversikan integer input ke basis 100 dan kemudian ubah hasilnya dari basis 60 ke integer. Oleh karena itu, ini setara dengan Input% 100 + 60 * ⌊ Input / 100⌋

Tuan Xcoder
sumber
Sebagai fungsi, 5 byte
caird coinheringaahing
@cairdcoinheringaahing Saya pikir Anda maksud ini , tapi terima kasih atas kepala-up pula
Mr. Xcoder
2

Excel VBA, 29 Bytes

Fungsi jendela langsung VBE anonim yang mengambil input dari jarak [A1]dan keluaran ke jendela langsung VBE.

?[A1]Mod 1E2+60*[Int(A1/100)]
Taylor Scott
sumber
2

APL (Dyalog) , 11 10 byte

600 100⊤⊢

Cobalah online!

Bagaimana?

0 100⊤ - disandikan di basis 100, berhenti di LSB kedua, memproduksi secara efektif n ÷ 100, n % 100 .

60⊥ - dekode di basis 60

Uriel
sumber
2

PARI / GP , 16 byte

Mudah:

n->n\100*60+n%100

Sayangnya metode yang bagus ini terlalu panjang untuk digunakan:

n->[60,1]*divrem(n,100)
Charles
sumber
2

Memaksa , 10 9 byte

Kevin mengungguli saya dalam bahasa saya sendiri ... (menggunakan pendekatan dari jawaban ovs )

2dH/40*-#

Cobalah online!

10 byte

sjvj60*^+#

Cobalah online!

s             \ Split input into digits
 jvj          \ Join the first two and the last two
    60*       \ Multiply the first by 60
       ^+     \ Add the values
         #    \ Print

11 byte

Untuk satu byte lagi kita bisa menggunakan Input % 100 + 60 * ⌊Input / 100⌋pendekatan:

H2d%}/60*+#

Cobalah online!

FlipTack
sumber
1
9 byte dengan menciptakan pelabuhan @ovs' Python 2 jawaban : 2dH/40*-#. Belum pernah diprogram di Pushy sebelumnya, tetapi sepertinya bahasa yang cukup keren. :)
Kevin Cruijssen
1
@KevinCruijssen itu cukup umum berdasarkan bahasa stack, saya kira satu-satunya hal yang sedikit berbeda yang dibawa ke meja adalah double stack ... tapi terima kasih, dan terima kasih untuk golfnya :)
FlipTack
1

05AB1E , 9 byte

т÷60*¹т%+

Cobalah online!

Penjelasan:

т÷60*¹т%+

т         // Push number 100
 ÷        // Integer division with the input
  60      // Push number 60
    *     // Multiply with the previous result
     ¹    // Push input
      т   // Push 100 again
       %  // Modulo
        + // Add the first and the second result

Mungkin ada beberapa trik dengan konversi basis yang dapat dicapai di 05AB1E, tetapi saya tidak dapat menemukannya.


sumber
1

bash, 20 byte

echo $[$1-$1/100*40]

Cobalah online

Nahuel Fouilleul
sumber
1

Retina , 11 byte

.{100}
60$*

Cobalah online!

Input dan output di unary . Test suite mengkonversi dari dan ke desimal untuk kenyamanan.

Melakukan konversi basis semacam ini hanya untuk dua digit sangat mudah dilakukan di unary. Kami hanya mencocokkan run 100 1dan menggantinya dengan 60 1detik. Apa pun yang tersisa akan sesuai dengan dua digit terakhir dalam representasi desimal dan tetap tidak berubah.

Martin Ender
sumber
1

Alice , 19 byte

/o
\i@/.'d%~'d:'<*+

Cobalah online!

Penjelasan

Sayang sekali saya menghapus divmod dari bahasa, saya kira ...

/o
\i@/...

Ini hanya kerangka kerja biasa untuk program linier dengan I / O desimal yang beroperasi murni dalam mode Kardinal (aritmatika).

.     Duplicate input.
'd%   Mod 100.
~     Swap with other copy.
'd:   Divide by 100.
'<*   Multiply by 60.
+     Add.
Martin Ender
sumber
1

Bima Sakti , 10 byte

':Z/v40*-!

pemakaian: ./mw code.mwg -i 9999

Penjelasan:

code       explanation                          stack

'          push input to stack                  [input]
 :         duplicate ToS                        [input, input]
  Z        push 100                             [input, input, 100]
   /v      integer division (divide and floor)  [input, ⌊input/100⌋]
     40    push 40                              [input, ⌊input/100⌋, 40]
       *   multiply                             [input, ⌊input/100⌋*40]
        -  subtract                             [input - ⌊input/100⌋*40]
         ! print
ovs
sumber
1

R , 21 byte

x=scan();x-x%/%100*40

Cobalah online!

Menandai
sumber
1
Saya membuat solusi saya sendiri di R dan itu jauh kurang elegan dari ini.
Andrew Brēza
Anda dapat memotong scankarena sebagian besar jawaban hanya menganggap variabel sudah ditentukan.
Andrew Brēza
Aturannya sangat tidak konsisten dalam hal itu. Satu tantangan lain yang paling Anda harus memiliki fungsi atau memindai untuk menangkap nilai.
Tandai
1

REXX, 25 byte

arg t
say t%100*60+t//100

(Hanya terjemahan lain dari @ovs)

idrougge
sumber
0

05AB1E , 7 byte

т‰ć60*+

Cobalah online!

Penjelasan

         command                              current stack
т‰ć60*+  full program. push input implicitly  [1234]
т        push 100                             [1234] [100]
 ‰       push divmod                          [12, 34]
  ć      push head extracted (n[1:], n[0])    [34] [12]
   60*   multiply by 60                       [34] [720]
      +  add and display implicitly           [754]
Cinari
sumber
0

Python Simbolik , 66 byte

___=-~-~_-_
__=___*___
__=__*__*___+___*__
_=_-_/(__+__+__/___)*__

Cobalah online!


Penjelasan

Symbolic Python          values

___=-~-~_-_              ___=2
__=___*___               __=2*2=4
__=__*__*___+___*__      __=4*4*2+2*4=32+8=40
_=_-_/(__+__+__/___)*__  _=_-_/(40+40+40/2)*40=_-_/100*40
ovs
sumber