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!

James Williams
sumber
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]!!)
Taylor Fausak
sumber
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 .

jimmy23013
sumber
1
Tidak percaya saya tidak memikirkan itu ...
Dennis
19

PowerShell - 27

'0 5  29 86'.indexof($args)
Rynant
sumber
14

Python 2.x - 28

'015..29.86'.find(`input()`)
Willem
sumber
2
Python 2.x, secara khusus.
seequ
6
Dengan Python 3, Anda dapat menghapus `dan menyimpan 2 karakter.
Rynant
11

JavaScript 37 36

alert("0_5__29_86".search(prompt()))
DarkAjax
sumber
gunakan .search()dan simpan satu byte.
Ismael Miguel
@IsmaelMiguel Bagus, Terima kasih!
DarkAjax
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. ";
Dennis
sumber
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.

AndoDaan
sumber
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).

Duncan Jones
sumber
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.

Tajam
sumber
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

sumber
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
Kyle Kanos
sumber
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
core1024
sumber
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.

jimmy23013
sumber
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
...
seequ
sumber
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/

aditsu
sumber
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
Sepertinya ini dia: sourceforge.net/projects/cjam
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? :)

Zaid
sumber
+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.

overactor
sumber
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.

lukass
sumber
2

ECMASkrip 6, 24

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

Menggunakan JavaScript normal itu akan menjadi 33:

alert(~-++'0n5nn29n86'[prompt()])
ShadowCat7
sumber
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.

lirtosiast
sumber
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);}
NoSeatbelts
sumber
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

sumber
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;}
Ypnypn
sumber
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()])
William Barbosa
sumber
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);}
BenjiWiebe
sumber
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')"
ɐɔıʇǝɥʇu
sumber
1

Clojure - 36

#(case % 2 5 5 2 6 9 9 6 0 0 8 8 -1)
coredump
sumber
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.
Erik the Outgolfer
sumber
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

PHP , 48 39 byte

Terima kasih untuk Jörg Hülsermann

<?=[0,-1,5,-1,-1,2,9,-1,8,6][$argv[1]];

Cobalah online!


Versi yang lebih lama

$m=-1;echo [0,$m,5,$m,$m,2,9,$m,8,6][$argv[1]];

Cobalah online!

ʰᵈˑ
sumber
Hei terima kasih! Lebih baik lagi, haruskah saya memposting?
ʰᵈˑ
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.
Erik the Outgolfer
sumber
ịV = žh‡di 05AB1E
Magic Octopus Mm