Kembalikan versi nomor yang dibalik


18

Ketika angka ditampilkan pada kalkulator, dimungkinkan untuk mempertimbangkan seperti apa transformasi dari angka itu. Misalnya, pada tampilan tujuh segmen, 2 ditampilkan seperti ini:

masukkan deskripsi gambar di sini

Dan ketika dibalik secara horizontal terlihat seperti ini:

masukkan deskripsi gambar di sini

Dengan demikian, gambar cermin 2 adalah 5.

Tugas dalam tantangan ini adalah untuk mengambil nomor satu digit, dan mengembalikan nomor yang merupakan gambar cerminnya (jika mungkin). Jika gambar cerminnya tidak terlihat seperti angka, kembalikan angka yang diputar 180 derajat (jika mungkin). Jika tidak ada yang seperti ini, kembalikan -1.

Berikut daftar lengkap input dan output yang perlu ditangani oleh program Anda:

Input   Output
0       0
1       -1
2       5
3       -1
4       -1
5       2
6       9
7       -1
8       8
9       6

Sebagai tantangan , kode terpendek menang!


17
Saya tidak setuju dengan poin terakhir Anda - 1 pada tampilan 7 segmen hanya akan dibalik ke sisi lain, jadi saya harus tidur siang sampai 1.
Jwosty

29
Saya bingung bagaimana cara membalik setiap digit. Jika 2 menjadi 5, maka 6 harus mundur 9, bukan 9. Tetapi jika 6 menjadi 9, maka flip hanyalah rotasi, jadi 2 menjadi 2 lagi, bukan 5.
kernigh

6
6, 9 diputar 180 deg, 2, 5 membalik secara horizontal, dan 1, 3 sebenarnya adalah refleksi dari diri mereka sendiri di sumbu vertikal.
jimmy23013

22
Terjemahan yang didefinisikan dalam pertanyaan tidak konsisten sama sekali. Mengapa 2 dan 5 flip, tetapi 3 tidak?
Rynant

4
Saya melihat fakta yang aneh tentang angka yang bisa diganti: mereka membentuk pola biner yang berlawanan, yaitu 2 = 010, 5 = 101. 6 = 0110, 9 = 1001. Adakah yang bisa menggunakan fakta ini dalam solusi mereka?
Jack Aidley

Jawaban:


32

Haskell - 43 31

43 karakter tanpa sesuatu yang mewah.

f 0=0
f 8=8
f 2=5
f 5=2
f 6=9
f 9=6
f _= -1

Turunkan menjadi 31 karakter dengan menjadikannya fungsi parsial.

f=([0,-1,5,-1,-1,2,9,-1,8,6]!!)

4
Saya tertawa. Punya +1.
seequ

6
1 Untuk menggunakan Haskell untuk melakukan persis apa spec. kata!
recursion.ninja

1
Saya tidak berpikir Anda perlu f=untuk solusi kedua karena ini adalah ekspresi yang valid
Cyoce

23

GolfScript, 15 14

Saya membaca spec lagi dan menemukan bahwa input harus berupa string.

"0.5..29.86"\?

Untuk berlari:

echo -n 2 | ruby golfscript.rb a.gs

Versi lama (yang memiliki input integer):

[0.5..2 9.8 6]?

Yang lebih baru (14 byte) agak terinspirasi oleh jawaban CJam oleh aditsu .


1
Tidak percaya saya tidak memikirkan itu ...
Dennis


14

Python 2.x - 28

'015..29.86'.find(`input()`)

2
Python 2.x, secara khusus.
seequ

6
Dengan Python 3, Anda dapat menghapus `dan menyimpan 2 karakter.
Rynant


8

CJam, 20 byte

q25691347`"5296W"er~

Cobalah online.

Keluaran

$ for i in {0..9}; { cjam <(echo 'q25691347`"5296W"er~') <<< $i; echo; }
0
-1
5
-1
-1
2
9
-1
8
6

Bagaimana itu bekerja

q          " Read from STDIN. The leaves a string on the stack.            ";
25691347`  " Push the string '25691347'.                                   ";
"5296W"    " Push the string '5296W'.                                      ";
er         " Perform character transliteration.                            ";
~          " Evaluate the result. Examples: '2' returns 2, 'W' returns -1. ";

8

BEFUNGE 93 - 18 14 20 Bytes

Saya kira komentatornya benar, meskipun Befunge menjadi garis bahasa 2d agak berbeda. Namun, saat ini, para komentator benar.

&1g01g-.  
! &  #* )'

Langkah:

&

Membaca input sebagai nilai numerik x, dan mendorongnya di tumpukan.

1g

Mendapat nilai karakter c (jadi, seperti '!' = 33, atau '*' = 42. Sel kosong = 32) pada posisi x, 1.

01g-.

Membaca nilai karakter sel 0,1 (33), mengurangkannya dari c, dan mengeluarkannya sebagai nilai numerik.


2
Cukup bagus. Punya +1.
seequ

Harap perbaiki panjangnya: 20 byte
har-wradim

1
Anda sebenarnya menghitung byte Anda salah. Anda menggunakan 19 byte. Kami menghitung baris dan spasi baru. Tetapi jika Anda beralih ke Befunge 98, Anda dapat menyimpannya; ubah baris 1 ke:&1g'!-.
Justin

8

Jawa - 49

long f(int a){return(0x790a300601L>>(a*4)&15)-1;}

Di sini, 0x790a300601adalah nilai yang diisi dengan output yang diinginkan, dengan satu nilai tambah untuk membuatnya positif. Nilai-nilai tersebut disimpan dalam camilan dalam nilai tersebut, sehingga diperlukan sedikit pergeseran dan penutup untuk menghapusnya.

Java - 100 (opsi menyenangkan)

int f(int a){Random r=new Random(0x2000A2F47D6Fl);int b=0;for(;a>=0;a--)b=r.nextInt(11)-1;
return b;}

Bukan pilihan terkecil, tapi sedikit kesenangan. Saya menemukan seed acak yang menghasilkan nilai yang benar ketika dipanggil X kali (di mana 0> = X <= 9).


Pintar. Punya +1
Cyoce

8

JavaScript (ECMAScript 6) 25

x=>'1060039097'[x]-(x!=6)

JavaScript (ECMAScript 5) 43

function f(x){return'1060039097'[x]-(x!=6)}

UPDATE: edc65 telah menyarankan teknik yang jauh lebih baik. sikat gigi telah menyarankan bahasa yang jauh lebih baik. Pada titik ini, kontribusi utama saya adalah debugging dan keberanian.


1
Jika Anda mengubahnya ke ECMAScript 6 (didukung di Firefox), Anda bisa melakukannya x=>[0,-1,5,-1,-1,2,9,-1,8,6][x].
Sikat gigi

Pada awalnya, saya hampir memposting function(x)[0,-1,5,-1,-1,2,9,-1,8,6][x], juga berkat Firefox. Lagi pula saya tidak akan menang, jadi saya memutuskan untuk tetap dengan jawaban kompatibilitas tertinggi. Jika saya mulai beralih bahasa untuk singkatnya, maka saya akhirnya akan mulai mendefinisikan bahasa saya sendiri untuk setiap tantangan yang saya lakukan. Tapi saya akan melanjutkan dan menyebutkan versi ECMAScript 6, karena Anda menyarankannya
Keen

1
Konsep yang sama tetapi lebih pendek (bye bye koma): x => '106003907' [x] - (x! = 6)
edc65

@ edc65 Anda tahu, saya ingin menggunakan string, dan saya benar-benar bingung karena saya bisa memaksa hasilnya kembali ke nomor. Selang yang aneh. Namun saya masih belum menemukan jawabannya -(x!=6). Terima kasih.
Tertarik


6

bash 29

tr 1-9 x5xx29x86|sed s/x/-1/g

misalnya

$ echo 0 1 2 3 4 5 6 7 8 9 | tr 1-9 x5xx29x86|sed s/x/-1/g
0 -1 5 -1 -1 2 9 -1 8 6

Anda dapat menghilangkan 'sekitar ekspresi sed. Juga saya pikir Anda dapat menghilangkan gkarena spec hanya memasok satu digit pada satu waktu
Digital Trauma

Terima kasih. Hanya saja dalam contoh, pengiriman itu sendiri tidak digunakan '. Menyukai ginput yang lebih lama!

4

Kona - 29

Fungsi ini mengembalikan elemen xdari array0 -1 5...

f:{0 -1 5 -1 -1 2 9 -1 8 6@x}

Contoh:

> f 2
  5
> f 5
  2
> f 8
  8

Apakah vektor dengan sendirinya benar-benar diizinkan?
seequ

@TheRare: Hmm, ia mengatakan "algoritma" jadi saya kira tidak. Saya akan mengubahnya dan menjadikannya lebih seperti milik Anda ...
Kyle Kanos

Tampaknya lebih baik, dapatkan +1.
seequ

4

JavaScript 36 37 41

alert('0x'+'65b558f5ec'[prompt()]-6)

sebagai fungsi ES6 - 27:

f=v=>'0x'+'65b558f5ec'[v]-6

2
28:f=v=>~-[1,,6,,,3,10,,9,7][v]
nderscore

@nderscore Anda suka memperbaiki kode orang, bukan?
seequ

3
@ Theare Saya hanya dalam pencarian untuk menemukan kode javascript terpendek. :) Jika orang lain sudah memposting jawaban yang baik, lebih masuk akal bagi saya untuk menemukan optimasi di dalamnya daripada mengirim jawaban baru yang hampir merupakan duplikat. Saya di sini bukan untuk bersaing, hanya untuk bekerja sama dalam mencapai tujuan ini.
nderscore

@nderscore Saya memiliki mentalitas yang sama selama ide saya cukup mirip. Bagaimanapun, bagus.
seequ

@nderscore Anda benar-benar memberi saya motivasi. Saya tidak yakin apakah saya bisa membuatnya lebih pendek, tapi saya akan coba :)
core1024

4

Sclipting, 11 karakter

걄럣뉥밈결⓷方分결剩貶

Akhirnya saya menemukan komputer Windows dengan Visual Studio diinstal untuk membangun interpreternya. Dan itu telah mengalahkan kode GolfScript saya dengan mudah.

Bunyinya 18453063256\11\?/11%(dalam GolfScript.


2
Menarik, tetapi jawaban GolfScript Anda masih menang. Kecuali jika pertanyaan menyatakan sebaliknya, panjang diukur dalam byte.
Dennis

@ Dennis Ini adalah jawaban ke-3 atau ke-4 saya di situs ini. Saya tidak tahu. Dan saya pikir APL adalah pengecualian.
jimmy23013

@ Dennis Dan kebanyakan orang tidak suka Sclipting. :)
jimmy23013

Bukan pengecualian, kami hanya membiarkan orang memilih penyandian mereka. Jawaban ini akan mencetak 22 byte, karena itu ukurannya menggunakan UTF-16. APL hanya menggunakan 256 karakter berbeda, dan ada halaman kode APL di mana dulu karakternya persis satu byte.
Dennis

@ Dennis Ah, Anda benar.
jimmy23013

3

J - 28 27 byte

Anda tahu apa yang saya sukai? Kesederhanaan (28 byte). Perhatikan bahwa dalam J, _1negatif satu (-1).

f=:{&0 _1 5 _1 _1 2 9 _1 8 6

Tambahkan sedikit kerumitan dan Anda memiliki 27 byte.

f=:-{&0 2 _3 4 5 3 _3 8 0 3

Contoh:

   f 2
5
   f 6
9
   f 5
2
...

3

CJam - 14

Versi input / output:

"0 5  29 86"q#

Versi tumpukan (menganggap nomor ada di tumpukan):

[0W5WWY9W8 6]=

Cobalah di http://cjam.aditsu.net/


Tidak ada artikel Wikipedia tentang CJAM, dan tautannya hanya menuju fiddler kosong. Di mana Anda akan menemukan informasi tentang bahasa dan rilis yang sudah ada?
Panzercrisis


@Panzercrisis cjam.aditsu.net memiliki "CJam" yang terhubung ke halaman sourceforge
aditsu

3

Perl, 27 26

Hitung termasuk pbendera

y/2569/5296/,s/[1347]/-1/

Pemakaian:

$ echo 7 | perl -pe y/2569/5296/,s/[1347]/-1/
-1

Tunggu, apakah Perl baru saja mengalahkan J? :)


+1 Saya akan memposting y+0-9+9a4aa70a13+;$_=9-hex, yang memiliki panjang yang sama, tetapi Anda lebih asli;)
core1024

1
@ core1024: Dan itu semakin pendek;)
Zaid

Itu tidak:echo 1 | perl -pe y/2569/5296/,s/[347]/-1/
core1024

@ core1024: Saya salah membaca spesifikasi, harus diperbaiki sekarang. Ini masih lebih pendek dari solusi J.
Zaid

Tidak ada cara ringkas untuk melakukan ini dalam J, karena nilainya diketik dengan ketat dan angka tidak dapat menyamai string.
seequ

3

Marbelous 34 byte

}0
=6=9=2=5=0=8?0
+3-3+3-3....--

Ini bukan solusi terpendek, tetapi juga bukan yang terpanjang.

Bagaimana itu bekerja

}0memunculkan marmer yang mewakili input baris perintah pertama. Marmer ini menurunkan centang berikutnya, ke =6sel. =6adalah sel pembanding, itu mendorong setiap marmer dengan nilai 6 ke bawah dan semua yang lain ke kanan. Line-up sel perbandingan ini mendorong kelereng sampai mereka menyamai nilai yang diinginkan. 0 dan 8 hanya jatuh dan dicetak ketika teh jatuh dari papan bawah, 6 dan 2, dan 9 dan 5 pertama-tama mendapat 3 ditambahkan ke mereka, dikurangi dari masing-masing. Jika marmer tidak sama dengan nilai yang diinginkan, ia akan mendarat di ?0sel, yang mengubah marmer menjadi 0 marmer 1 . Marmer ini kemudian dikurangi dan jatuh dari papan.

1 A ?nmarmer teknis ternyata marmer apapun menjadi marmer antara 0 dan n. Ini memiliki efek samping yang bagus yang ?0mengubah apa pun menjadi 0.


2

MATLAB - 35

Saya akan membungkus ini dalam suatu fungsi dengan nsebagai satu-satunya parameter.

f=[0,-1,5,-1,-1,2,9,-1,8,6];
f(n+1)

35 karakter.


2

ECMASkrip 6, 24

f=x=>~-++'0n5nn29n86'[x]

Menggunakan JavaScript normal itu akan menjadi 33:

alert(~-++'0n5nn29n86'[prompt()])

2

TI-BASIC, 24 22

-1+int(11fPart(11^Ans.0954191904

Ini mengkodekan kemungkinan output dalam tabel pencarian yang disimpan sebagai nomor floating-base base-11; angka (N + 1) basis-11 setelah titik desimal diekstraksi dari tabel untuk mendapatkan nilai digit terbalik. Di base 11 angkanya .106003A097, dan digit yang kurang ini persis 0,-1,5,-1,-1,2,9,-1,8,6.

Trik edc65 untuk mengurangi satu dalam kasus 6 mengarah ke solusi 24-byte ini, di mana ⑩^(adalah token satu-byte tunggal:

-(Ans≠6)+int(10fPart(.1060039097⑩^(Ans

Pendekatan string adalah 29 byte:

-(Ans≠6)+expr(inString("1060039097",Ans+1,1

Pendekatan array (yang juga diambil Ypnpyn) adalah 30 byte, dengan asumsi nomor disimpan dalam X:

{1,0,6,0,0,3,10,0,9,7}-1:Ans(X+1

24 -> 22: Menghapus dua digit ekstra presisi dalam konstanta sihir.


Ini hampir bisa dipastikan golf ke 19, dan mungkin ke 18; Namun, saya perlu mencari nomor yang benar.
lirtosiast

2

C - 47 byte [adalah 48 Bytes]

f(i){return(int[]){1,0,6,0,0,3,10,0,9,7}[i]-1;}

Untuk menambahkan I / O (yang jawaban lainnya tidak selalu) untuk 86 byte:

main(i){i=(int[]){1,0,6,0,0,3,10,0,9,7}[getchar()-48]-1;i<0?puts("-1"):putchar(i+48);}

1
Wow, saya tidak punya petunjuk literal inline array seperti ini. Jawaban pertama yang sangat bagus, dan selamat datang di PPCG! (Tidak perlu menambahkan pengiriman fungsi I / O yang benar-benar valid .)
Martin Ender

1

Python - 34

f=lambda n:ord("A@F@@CJ@IG"[n])-65

1
33 f=lambda n:ord(" "[n])-3bekerja dengan angkasa codeskulptor.org/#user34_Q7NbNvQy55_0.py
Dylan Madisetti

Anda mungkin ingin menjelaskan bagaimana dan mengapa ini berhasil
Kerusuhan

Menggunakan tabel ascii asciitable.com , spasi putih yang dipilih dapat dicetak dengan python. itu benar-benar terlihat seperti &#002;&#002;&#008;&#002;&#002;&#005;&#012;&#002;&#011;&#009;Ini minus 3 karena -1 meninggalkan karakter nol yang tidak baik, dan minus 2 meninggalkan umpan baris yang dicadangkan dalam python
Dylan Madisetti

1

Jawa, 58 59

int f(int i){int[]a={1,0,6,0,0,3,10,0,9,7};return a[i]-1;}

ATAU

int f(int i){return new int[]{1,0,6,0,0,3,10,0,9,7}[i]-1;}

Anda dapat membuat kode Anda sedikit lebih pendek jika Anda menambahkan 1 untuk setiap nilai dalam array dan setelah [i] kurangi 1.
barteks2x

@ Barteks2x Poin bagus; terima kasih
Ypnypn

1

JavaScript 42 37

Jalankan di konsol browser Anda

alert(~-[1,,6,,,3,10,,9,7][prompt()])

1

C - 117 108 106 77 76 byte

a[]={1,0,6,0,0,3,10,0,9,7};main(int c,char**b){printf("%d",a[*b[1]-48]-1);}

Bukan bahasa terbaik untuk bermain golf, tapi oh well ...
Kompilasi dengan gcc progname.c -o progname. (Abaikan peringatan, atau tambahkan -include stdio.hke perintah kompilasi.)

Penggunaan: ./progname <number>

EDIT

Sesuai saran @ bebe, berikut adalah contoh yang mengambil input dari STDIN sebagai gantinya:

C - 68 51 byte

main(){printf("%d","106003:097"[getchar()-48]-49);}

menggunakan d=*b[1]-48bisa menjadi ide yang bagus
bebe

@ Bebe Ah ya, terima kasih!
BenjiWiebe

1
main(){printf("%d",(int[]){1,0,6,0,0,3,10,0,9,7}[getchar()-48]-1);}maaf telah mengganggu Anda sejauh ini tetapi saya menemukan ini sedikit lebih pendek.
bebe

Anda dapat menyimpan karakter lain dengan membuat array global sehingga Anda tidak perlu pemain. a[]={1,0,6,0,0,3,10,0,9,7};main(){printf("%d",a[getchar()-48]-1);}
Allbeert

2
main(){printf("%d","106003:097"[getchar()-48]-49);}51 bytes
bebe

1

J (24, fungsi)

(panel input tidak berfungsi dengan baik. Tempelkan yang berikut dengan juru bahasa python dan jawaban saya akan terungkap :)

print "f=:{&(_3+3 u:'^C^B^B^E^L^B^K\t')"


1

05AB1E , 13 byte (tidak bersaing)

0®5®®Y9®8 6¹@

Cobalah online!

-3 Terima kasih kepada Emigna .

Penjelasan:

0®5®®Y9®8 6¹@ Takes an integer from STDIN.
0®5®®Y9®8 6   Push 0, r=-1, 5, r=-1, r=-1, Y=2, 9, r=-1, 8, 6.
           ¹  Push first input item.
            @ Pop and push the 0-indexed stack item at the respective index.

0®5®®Y9®8 6¹@harus bekerja juga.
Emigna

@Emigna saya tidak tahu, terima kasih!
Erik the Outgolfer

Pemikiran yang bagus dengan @. Tidak sering Anda melihat yang digunakan :)
Emigna

@ Emigna A byte lebih pendek dari )¹èatau )sè.
Erik the Outgolfer


1

Jelly , 14 byte (tidak bersaing)

ị“-5--29-860”V

Cobalah online!

Penjelasan:

ị“-5--29-860”V Takes argument as an integer.
 “-5--29-860”  "-5--29-860" (1-indexed string).
ị              Return the xth char of the string above (y) (x=argument).
             V Eval. - is the same as -1.

ịV = žh‡di 05AB1E
Magic Octopus Mm
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.