Diberi kunci kombinasi standar seperti yang ada pada gambar. Cara membuka kuncinya adalah dengan menyelaraskan 4 angka dalam kode pada baris kombinasi. Setelah bertahun-tahun pelayanan yang setia, Anda telah dipecat dari pabrik kunci dan telah memutuskan untuk membalas dendam dengan tidak mengacaukan kunci sebelum Anda mengirimnya, sehingga meninggalkan setiap kunci dengan kombinasi untuk membuka kuncinya pada jalur kombinasi.
Anda juga tahu bahwa dengan melihat urutan angka di baris lain, Anda dapat menentukan angka apa yang harus ada pada garis kombinasi (dan karenanya kombinasi untuk membuka kuncinya).
Jika setiap baris pada kunci diberi angka mulai dari baris 0 untuk garis kombinasi (garis yang membuka kunci) ke baris 9. Misalnya, jika angka pada baris 4 adalah 5336
, maka kombinasi untuk membuka kunci akan menjadi 1992
.
Sayangnya kunci sudah dipaket dan pandangan Anda tentang setiap kunci dikaburkan, sehingga Anda hanya dapat melihat angka pada garis kunci yang berbeda.
Tantangan
Diberi 4 pasang digit, di mana digit pertama bilangan bulat mewakili nomor baris dan digit kedua mewakili nomor yang muncul pada garis itu, buat kombinasi ke kunci. Misalnya jika Anda memasukkan:
57 23 99 45
Maka seharusnya output:
2101
Atau
25 78 63 15
dan
3174
Asumsikan input akan selalu menjadi 4 bilangan bulat positif dalam bentuk `25 64 72 18.
Ini adalah kode-golf , sehingga program terpendek dalam jumlah byte menang.
Ini juga pertanyaan pertama saya, jadi setiap umpan balik sangat dihargai.
57 23 99 45
. Itu bukan empat pasang bilangan bulat: itu empat bilangan bulat. Dan beberapa jawaban mengasumsikan mereka mendapatkan itu sebagai string, sedangkan yang lain menganggap bahwa itu sudah siap diurai sebagai 4 int.0
s terkemuka ).Jawaban:
CJam,
98 byteMembaca pasangan digit sebagai argumen baris perintah. Untuk mencoba kode online , perubahan
ea
untuklS/
membaca dari STDIN simulasi.Contoh dijalankan
Bagaimana itu bekerja
Kode karakter digit d adalah 48 + d . Dengan demikian, mengingat string dua digit xy basa 9 angka menghasilkan 9 * (48 + x) + (48 + y) = 10 * (48 + x) + y - x ≡ y - x (mod 10) .
sumber
"99"
sebenarnya ditafsirkan sebagai array[57 57]
olehb
;"xy"9b
diimplementasikan sebagai9 * ord(x) + ord(y)
. Saya harus menambahkan itu ke jawaban saya.CJam,
131211 karakterTerima kasih kepada user23013, sekarang menjadi 11 karakter :)
Penjelasan:
Cobalah online
Saya tahu ini bisa lebih banyak golf. Tapi ini adalah upaya nyata pertama saya di CJam dan saya dibatasi oleh pengalaman :)
Atau, metode lain untuk melakukan hal yang sama dalam 1 karakter tambahan:
atau
atau
sumber
l~]
. Saya merasa seperti mengurai input harus mungkin dengan kurang dari tiga, tapi saya belum pernah menggunakan CJam sebelumnya: /4{ri_A/-A%}*
lebih pendek satu byte.4{Ar:--A%}*
.Golfscript (14
13)Cobalah online di sini
Ini hampir sama dengan solusi Pengoptimal , tetapi dalam bahasa yang berbeda. Sulit untuk mendekatinya dengan cara yang berbeda karena masalahnya cukup sederhana
, jadi ikatannya pasti masuk ke Pengoptimal, yang entri sebelumnya.Untuk jumlah byte yang sama bisa Anda lakukan
sumber
- 10
.GNU dc , 14 byte
Pinjam 9 trik pintar base 9 dari Dennis :
Bilangan bulat input dibaca dari STDIN, satu per baris.
Penjelasan:
Keluaran:
Jawaban Sebelumnya, 18 byte:
Karena saya pikir saya bisa lebih dekat ke bahasa "golf" dengan ini (tetapi tidak):
sumber
9i[?A%nd]dxxxx
C
646356 atau 61Jika input dapat disalurkan dari file
Jika input harus diketik ke stdin
Membaca empat angka dalam satu lingkaran dan kemudian memproses masing-masing dengan mengurangi digit pertama dari nilai dan mencetak hasilnya modulo 10.
Penghematan berkat berbagai komentar di bawah ini dan juga menggunakan putchar bukan printf
sumber
scanf
luarfor()
seperti inia,i;main(){for(;i++-4;printf("%d",(a-a/10)%10))scanf("%d",&a);}
a*.9
bukannyaa-a/10
while
loop dan mendeklarasikana
sebagai argumenmain
:main(a){while(scanf("%d",&a)>0)printf("%d",(a-a/10)%10);}
Python 3, 64
Mudah.
Bisa lebih pendek jika saya diizinkan mencetak, misalnya,
[2, 1, 0, 1]
( 46 ):sumber
str((i-i//10)%10)
langsung alih-alih menggunakan sedetikmap()
. Saya mulai dengan generator juga untuk saya, tetapi menemukan bahwafor
loop sebenarnya berakhir menjadi lebih pendek.print(''.join((i-i//10)%10for i in map(int,input().split())))
. Juga jika ruang yang allowd dalam output Anda dapat menghindarijoin
dan menggunakan tuple-membongkar:print(*((i-i//10)%10for i in map(int,input().split())))
.C, 92
Input dari commandline. Kurangi kode ASCII pertama dari setiap argumen dari argumen kedua, tambahkan 10 dan ambil modulo 10.
Saya pikir ini adalah pertama kalinya saya menulis
printf
dengan empat%
s dan tanpa koma (koma ada di#define.
)sumber
#define f scanf("%c%c ",&a,&b);putchar(48+(9*a+b)%10)
diikuti oleha,b;main(){f;f;f;f;}
akan lebih pendek 18 byte.scanf
diperlukan, mengingat bahwascanf
seharusnya mengurai spasi putih hanya sebagai pemisah. Alchymist memiliki ide yang lebih baik di C. Tapi sepertinya Anda sudah memenangkannya dengan jawaban Cjam Anda.a(n)
dapat dihilangkan, kemudian saya perhatikan bahwa meletakkanprintf("%d%,...)
makro Anda akan menghemat beberapa byte dan akhirnya saya sedikit terbawa ... - Ruang diperlukan karena%c
membaca karakter, apa pun karakter, jadi pada menjalankan kedua itu akan menyimpan 32 ina
. - Mengalahkan CJam dengan C harus terbukti sulit.printf()
sudah selama jawabanku ...Java - 203 byte
Hanya karena ada memiliki untuk menjadi entri Java, saya melihat kesempatan bagus untuk memberikan kode ini bermain golf kesempatan (penyerahan pertama).
Jika ada ruang untuk beberapa perbaikan, saya senang mengetahui tentang mereka ;-)
sumber
Lua - 46 karakter
Membaca tiga karakter sekaligus (beri saya sedikit belas kasihan memasukkan spasi di akhir), dan meskipun a dan b adalah string-y ... ba MAGICALUALY memungkinkan mereka untuk menyusun bilangan bulat bayi yang sehat. Apakah lilitan memeriksa saat mencetak.
sumber
JavaScript ES6 -
5343 byteFungsi yang cukup mudah, menggunakan regex untuk mendapatkan angka. Cobalah di http://jsfiddle.net/efc93986/1/ . Jika fungsi tidak diizinkan, program mandiri berukuran 52 byte:
Karena ES6 saat ini hanya berfungsi di Firefox, kode berikut ini berfungsi pada browser modern apa pun, pada 70 byte
sumber
1+
....?
sebagai gantinya/\d+ ?
. Ruang setelah kembali dapat dihilangkan. Juga, karena tidak ada I / O khusus yang ditentukan, Anda harus dapat menggunakan suatu fungsi.a-a[0]
alih-alih1+a[1]-a[0]
harus bekerja juga.Python 2 - 33 byte
Menerima input pengguna yang dibatasi koma. Misalnya Input:
Keluaran:
Jika output diperlukan untuk sama persis dengan contoh maka itu jauh lebih lama. 47 byte:
sumber
input()
tidak berfungsi pada juru bahasa Python 2 saya.APL, 14
Penjelasan
⎕
mengambil input dari layar. Nilai yang dipisahkan oleh ruang diuraikan sebagai array.{...}¨
untuk setiap nomor, masukkan ke dalam fungsi.⍎¨⍕⍵
mengambil argumen, buat array dari digit-digitnya.--/
menghitung satuan minus puluhan.10|
mod 10.sumber
J -
2015Bentuk non-kata kerja (sebagai pernyataan alih-alih definisi fungsi) lebih pendek 5 karakter:
Bentuk kata kerja yang merupakan kereta yang bagus :
Kata kerja ini digunakan pada contoh input:
sumber
Haskell
6058Digit karakter tunggal, musuh bebuyutan di golf Haskell.
sumber
Perl:
3840Keluaran:
sumber
abs
tidak perlu;x - x/10
tidak boleh negatif. 3. Jika Anda menggunakan flag-040pe
(biasanya dihitung sebagai 5 byte) untuk beralih dari input yang dibatasi ruang, Anda dapat mempersingkat kode Anda menjadi$_=($_-int$_/10)%10
. 4. Jika Anda lebih suka menghindari flag-command-line, Anda masih dapat menyimpan beberapa byte dengan mengatur$/=$;
dan menghapus panggilansplit
.Ruby, 35 byte
Penjelasan
Input diambil sebagai argumen baris perintah.
String#bytes
mengembalikan Array of Integers (kode karakter ASCII). Hanya perbedaan antara kode karakter terakhir dan pertama yang penting, bukan bilangan bulat itu sendiri.sumber
C # & LinqPad: 104
sumber
C ++ 118
sumber
#include<iostream>
danstd::
sebelumcin
dancout
. 2. Anda tidak perlu bersyarat jika dihilangkana=a%10
. 3. Anda tidak memerlukan variabelb
danc
, baris baris dan (dengan sedikit modifikasi) tanda kurung di sekitar for loop.#include<iostream>
danusing namespace std;
PHP - 90 karakter
Pikir saya akan mencoba kode golf jadi ini dia, usaha pertama saya - mungkin bisa golf lebih.
58 karakter (milik Ismael Miguel)
Akses file menggunakan
sumber
<? for($i=0;$i<4;)echo abs($_GET[n][$i]%10);
yang panjangnya 44 karakter. Akses dari browser menggunakanfile.php?n[]=xx&n[]=yy&n[]=xy&n[]=yx
. (kode yang belum diuji)$_GET
tetapi menampilkan 57% 10 dan saya perlu (5-7)% 10<? for($i=0,$a=$_GET[n];$i<4;++$i)echo abs($a[$i][0]-$a[$i++][1]%10);
. Sayangnya, panjangnya 65 byte. (lupa$i
kenaikan yang terakhir) Atau Anda bisa mencoba<? for($i=0;$i<8;)echo abs($_GET[n][$i++]-$_GET[n][$i++]%10);
dan mengakses browser menggunakanfile.php?n[]=x&n[]=y&n[]=x&n[]=y&n[]=x&n[]=y&n[]=x&n[]=y
, menjadi 61 byte.$_GET['n']
. Telah mengedit jawaban saya.<? for($i=0,$a=$_GET[n];$i<8;)echo abs($a[$i++]-$a[$i++]);
. Tidak%10
ada gunanya dan ini hanya terlihat lebih baik. Anda juga dapat mengaksesnya menggunakanfile.php?n[]=xyxyxyxy
. Solusi ini panjangnya 58 byte.Python 3, 60
Input dan output persis seperti yang ditentukan, meskipun tidak mencetak baris tambahan. Dua trik menarik di sini: 1) mengganti dua panggilan menjadi
int()
dengan satu panggilan keeval()
, dan 2) menggunakanjoin()
untuk mendapatkana-b
, kemudian meniadakannyab-a
sesuai kebutuhan. Untungnya operator modulo Python memberikan nilai-nilai positif bahkan jika argumen pertama negatif!sumber
eval('-'.join(x))
triknya brilian.)