Trả về phiên bản lật của một số


18

Khi một số được hiển thị trên một máy tính, bạn có thể xem xét các biến đổi khác nhau của số đó sẽ như thế nào. Ví dụ: trên màn hình bảy đoạn, 2 được hiển thị như sau:

nhập mô tả hình ảnh ở đây

Và khi lật theo chiều ngang, nó trông như thế này:

nhập mô tả hình ảnh ở đây

Như vậy, hình ảnh phản chiếu của 2 là 5.

Nhiệm vụ trong thử thách này là lấy một số có một chữ số và trả về số đó là hình ảnh phản chiếu của nó (nếu có thể). Nếu hình ảnh phản chiếu của nó không giống như một số, hãy trả về số được xoay 180 độ (nếu có thể). Nếu cả hai trường hợp này đều không, hãy trả về -1.

Dưới đây là danh sách đầy đủ các đầu vào và đầu ra mà chương trình của bạn cần xử lý:

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

Như một thử thách , mã ngắn nhất sẽ thắng!


17
Tôi không đồng ý với điểm cuối cùng của bạn - màn hình 1 trên màn hình 7 đoạn đơn giản sẽ bị lật sang phía bên kia, vì vậy 1 nên ngủ trưa đến 1.
Jwosty

29
Tôi bối rối về cách lật từng chữ số. Nếu 2 trở thành 5, thì 6 nên trở thành 9, không phải 9. Nhưng nếu 6 trở thành 9, thì lật chỉ là một vòng quay, vì vậy 2 trở thành 2 khác, không phải 5.
kernigh

6
6, 9 xoay 180 độ, 2, 5 lật theo chiều ngang và 1, 3 trên thực tế là các phản xạ của chính chúng qua trục dọc.
jimmy23013

22
Các bản dịch được xác định trong câu hỏi không nhất quán. Tại sao 2 và 5 lật, nhưng 3 không?
Rynant

4
Tôi nhận thấy một sự thật tò mò về các số có thể chuyển đổi: chúng tạo thành các mẫu nhị phân đối diện, tức là 2 = 010, 5 = 101. 6 = 0110, 9 = 1001. Bất cứ ai cũng có thể sử dụng thực tế này trong giải pháp của họ?
Jack Aidley

Câu trả lời:


32

Haskell - 43 31

43 ký tự mà không có gì lạ mắt.

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

Giảm xuống còn 31 ký tự bằng cách biến nó thành một phần chức năng.

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

4
Tôi bật cười. Có +1.
xem

6
+1 Để sử dụng Haskell để thực hiện chính xác thông số kỹ thuật. nói!
đệ

1
Tôi không nghĩ bạn cần f=giải pháp thứ hai vì đó là một biểu thức hợp lệ
Cyoce

23

GolfScript, 15 14

Tôi đọc lại thông số kỹ thuật và thấy rằng đầu vào phải là một chuỗi.

"0.5..29.86"\?

Chạy:

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

Phiên bản cũ (có đầu vào số nguyên):

[0.5..2 9.8 6]?

Cái mới hơn (14 byte) được lấy cảm hứng từ câu trả lời của CJam bởi aditsu .


1
Không thể tin rằng tôi đã không nghĩ về điều đó ...
Dennis


14

Con trăn 2.x - 28

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

2
Python 2.x, cụ thể.
Seequ

6
Với Python 3, bạn có thể xóa `s và lưu 2 ký tự.
Rynant


8

CJam, 20 byte

q25691347`"5296W"er~

Hãy thử trực tuyến.

Đầu ra

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

Làm thế nào nó hoạt động

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 byte

Tôi đoán các nhà bình luận là đúng, mặc dù Befunge là một dòng ngôn ngữ 2d thì hơi khác. Tuy nhiên, ngay lập tức, các nhà bình luận là đúng.

&1g01g-.  
! &  #* )'

Các bước:

&

Đọc đầu vào dưới dạng giá trị số x và đẩy nó lên ngăn xếp.

1g

Nhận giá trị ký tự c (vì vậy, như '!' = 33 hoặc '*' = 42. Một ô trống = 32) tại vị trí x, 1.

01g-.

Đọc giá trị ký tự của ô 0,1 (33), trừ nó khỏi c và xuất ra dưới dạng giá trị số.


2
Khá đẹp. Có +1.
xem

Vui lòng sửa độ dài: 20 byte
har-wradim

1
Bạn đã thực sự đếm sai byte của bạn. Bạn đã sử dụng 19 byte. Chúng tôi đếm dòng mới và không gian. Nhưng nếu bạn chuyển sang Befunge 98, bạn có thể lưu một cái; đổi dòng 1 thành:&1g'!-.
Justin

8

Java - 49

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

Ở đây, 0x790a300601là một giá trị được nhồi với các đầu ra mong muốn, với một giá trị được thêm vào để làm cho chúng dương. Các giá trị được lưu trữ trong các nibble trong giá trị, do đó, một chút dịch chuyển và mặt nạ được yêu cầu để bật chúng ra.

Java - 100 (tùy chọn thú vị)

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

Không phải là lựa chọn nhỏ nhất, nhưng một chút thú vị. Tôi tìm thấy một hạt giống ngẫu nhiên tạo ra các giá trị chính xác khi được gọi là X lần (trong đó 0> = X <= 9).


Tài giỏi. Có +1
Cyoce

8

JavaScript (ECMAScript 6) 25

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

JavaScript (Bản thảo 5) 43

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

CẬP NHẬT: edc65 đã đề xuất một kỹ thuật tốt hơn nhiều. bàn chải đánh răng đã gợi ý một ngôn ngữ tốt hơn nhiều. Tại thời điểm này, đóng góp chính của tôi là gỡ lỗi và tính toán.


1
Nếu bạn thay đổi nó thành ECMAScript 6 (được hỗ trợ trong Firefox), bạn có thể chỉ cần làm x=>[0,-1,5,-1,-1,2,9,-1,8,6][x].
Bàn chải đánh răng

Lúc đầu, tôi gần như đăng bài function(x)[0,-1,5,-1,-1,2,9,-1,8,6][x], cũng nhờ Firefox. Dù sao tôi cũng sẽ không giành chiến thắng, vì vậy tôi quyết định tôi chỉ cần có câu trả lời tương thích cao nhất. Nếu tôi bắt đầu chuyển đổi ngôn ngữ cho ngắn gọn, thì cuối cùng tôi sẽ bắt đầu xác định ngôn ngữ của riêng mình cho mọi thử thách tôi làm. Nhưng dù sao tôi cũng sẽ tiếp tục và đề cập đến phiên bản ECMAScript 6, vì bạn đã đề xuất nó
Keen

1
Cùng một khái niệm nhưng ngắn hơn (bye bye dấu phẩy): x => '106003907' [x] - (x! = 6)
edc65

@ edc65 Bạn biết đấy, tôi muốn sử dụng một chuỗi và tôi đã hoàn toàn trắng trợn về việc tôi có thể ép buộc kết quả trở lại một con số. Một sai lầm kỳ quái. Tuy nhiên, tôi vẫn sẽ không đến với -(x!=6). Cảm ơn bạn.
Keen


6

bash 29

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

ví dụ

$ 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

Bạn có thể bỏ qua các 'biểu hiện xung quanh sed. Ngoài ra tôi nghĩ bạn có thể bỏ qua gvì thông số kỹ thuật chỉ cung cấp một chữ số tại một thời điểm
Chấn thương kỹ thuật số

Cảm ơn. Đó chỉ là trong ví dụ, bản thân bài nộp không sử dụng '. Thích gđầu vào lâu hơn!

4

Kona - 29

Hàm này trả về phần tử xtừ mảng0 -1 5...

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

Ví dụ:

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

Là một vector của chính nó thực sự được phép?
xem

@TheRare: Hmm, nó nói "thuật toán" nên tôi cho là không. Tôi sẽ thay đổi nó và làm cho nó giống với bạn hơn ...
Kyle Kanos

Có vẻ tốt hơn, có +1.
hẹn gặp

4

JavaScript 36 37 41

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

như chức năng ES6 - 27:

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

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

@nderscore Bạn chỉ thích cải thiện mã của mọi người, phải không?
xem

3
@TheRare Tôi chỉ đang trong một nhiệm vụ để tìm mã javascript ngắn nhất. :) Nếu ai đó đã đăng một câu trả lời hay, thì sẽ hợp lý hơn khi tôi tìm thấy sự tối ưu hóa trong đó thay vì đăng một câu trả lời mới gần như là một bản sao. Tôi không ở đây để cạnh tranh, chỉ để hợp tác để đạt được mục tiêu này.
nderscore

@nderscore Tôi có cùng tâm lý miễn là ý tưởng của tôi đủ tương tự. Dù sao, một trong những tốt đẹp.
hẹn gặp

@nderscore Bạn thực sự đã cho tôi một động lực. Tôi không chắc mình có thể làm cho nó ngắn hơn không, nhưng tôi sẽ thử :)
core1024

4

Sclipting, 11 ký tự

걄럣뉥밈결⓷方分결剩貶

Cuối cùng tôi đã tìm thấy một máy tính Windows có cài đặt Visual Studio để xây dựng trình thông dịch của nó. Và nó đã đánh bại mã GolfScript của tôi một cách dễ dàng.

Nó đọc 18453063256\11\?/11%(trong GolfScript.


2
Thú vị, nhưng câu trả lời GolfScript của bạn vẫn thắng. Trừ khi các câu hỏi khác, chiều dài được đo bằng byte.
Dennis

@Dennis Đây là câu trả lời thứ 3 hoặc thứ 4 của tôi trên trang web này. Tôi không biết. Và tôi nghĩ APL là một ngoại lệ.
jimmy23013

@Dennis Và hầu hết mọi người không thích Sclipting. :)
jimmy23013

Không thực sự là một ngoại lệ, chúng tôi chỉ để mọi người chọn mã hóa của họ. Câu trả lời này sẽ ghi được 22 byte, vì đó là kích thước của nó khi sử dụng UTF-16. APL chỉ sử dụng 256 ký tự khác nhau và có một trang mã APL trong đó một ký tự chính xác là một byte.
Dennis

@Dennis Ah, bạn nói đúng.
jimmy23013

3

J - 28 27 byte

Bạn biết những gì tôi thích? Đơn giản (28 byte). Lưu ý rằng trong J, _1là số âm (-1).

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

Thêm một chút phức tạp và bạn có 27 byte.

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

Thí dụ:

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

3

CJam - 14

Phiên bản đầu vào / đầu ra:

"0 5  29 86"q#

Phiên bản ngăn xếp (giả sử số nằm trên ngăn xếp):

[0W5WWY9W8 6]=

Hãy thử chúng tại http://cjam.aditsu.net/


Không có bài viết Wikipedia nào về CJAM, và liên kết chỉ đến một fiddler trống. Bạn sẽ tìm thấy thông tin về ngôn ngữ và các bản phát hành được thiết lập ở đâu?
Panzercrisis

Có vẻ như đây là: sourceforge.net/projects/cjam
Panzercrisis

@Panzercrisis cjam.aditsu.net có "CJam" được liên kết đến trang sourceforge
aditsu

3

Perl, 27 26

Đếm bao gồm pcờ

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

Sử dụng:

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

Đợi đã, Perl vừa đánh J? :)


+1 Tôi sẽ đăng bài y+0-9+9a4aa70a13+;$_=9-hex, có cùng độ dài, nhưng bản gốc của bạn hơn;)
core1024

1
@ core1024: Và nó chỉ có ngắn hơn;)
Zaid

Nó không:echo 1 | perl -pe y/2569/5296/,s/[347]/-1/
core1024

@ core1024: Tôi đọc sai thông số kỹ thuật, nên sửa ngay. Nó vẫn ngắn hơn giải pháp J.
Zaid

Thực sự không có cách nào ngắn gọn để làm điều này trong J, vì các giá trị được gõ đúng và các số không khớp với các chuỗi.
xem

3

34 byte đáng tin cậy

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

Đây không phải là giải pháp ngắn nhất, nhưng cũng không phải là giải pháp dài nhất.

Làm thế nào nó hoạt động

}0sinh ra một viên bi đại diện cho đầu vào dòng lệnh đầu tiên. Đá cẩm thạch này rơi xuống đánh dấu tiếp theo, vào =6tế bào.=6là một ô so sánh, nó đẩy bất kỳ viên bi nào có giá trị 6 xuống và tất cả các ô khác ở bên phải. Dòng tế bào so sánh này đẩy các viên bi phải cho đến khi chúng bằng một giá trị mong muốn. 0 và 8 chỉ rơi qua và được in khi tehy rơi xuống dưới cùng của bảng, 6 và 2, và 9 và 5 trước tiên được thêm 3 vào chúng, trừ đi tương ứng với chúng. Nếu một viên bi không bằng bất kỳ giá trị mong muốn nào, nó sẽ nằm trên ?0ô, biến bất kỳ viên bi nào thành 0 viên bi 1 . Đá cẩm thạch này sau đó bị giảm và rơi ra khỏi bảng.

1 Một viên ?nbi về mặt kỹ thuật biến bất kỳ viên bi nào thành một viên bi giữa 0 và n. Điều này có tác dụng phụ tốt đẹp ?0biến bất cứ điều gì thành 0.


2

MATLAB - 35

Tôi sẽ bọc cái này trong một hàm với ntham số duy nhất.

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

35 ký tự.


2

Bản thảo 6, 24

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

Sử dụng JavaScript bình thường sẽ là 33:

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

2

TI-BASIC, 24 22

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

Điều này mã hóa các đầu ra có thể có trong bảng tra cứu được lưu dưới dạng số dấu phẩy động cơ sở 11; chữ số cơ sở (N + 1) sau chữ số thập phân được trích xuất từ ​​bảng để lấy giá trị của chữ số ngược. Trong cơ sở 11 số là .106003A097, và các chữ số của số này ít hơn là chính xác 0,-1,5,-1,-1,2,9,-1,8,6.

Thủ thuật của edc65 là trừ đi một trong trường hợp 6 dẫn đến giải pháp 24 byte này, trong đó ⑩^(là một mã thông báo một byte duy nhất:

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

Cách tiếp cận chuỗi là 29 byte:

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

Cách tiếp cận mảng (mà Ypnpyn cũng đã lấy) là 30 byte, giả sử số này được lưu trữ trong X:

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

24 -> 22: Loại bỏ hai chữ số chính xác thêm trong hằng số ma thuật.


Điều này gần như chắc chắn có thể được đánh gôn đến 19, và có thể đến 18; tuy nhiên, tôi cần tìm kiếm những con số chính xác.
lirtosiast

2

C - 47 byte [là 48 byte]

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

Để thêm I / O (mà các câu trả lời khác không phải lúc nào cũng có) cho 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, tôi không có nghĩa đen mảng nội tuyến như thế này là một điều. Câu trả lời đầu tiên rất hay và chào mừng bạn đến với PPCG! (Không cần thêm chức năng gửi I / O là hoàn toàn hợp lệ .)
Martin Ender

1

Con trăn - 34

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

1
33 f=lambda n:ord(" "[n])-3làm việc với mã không giankulptor.org/#user34_Q7NbNvQy55_0.py
Dylan Madisetti

Bạn có thể muốn giải thích cách thức và lý do tại sao điều này hoạt động
Riot

Sử dụng bảng ascii asciitable.com, các khoảng trắng được chọn có thể in bằng python. Nó thực sự trông giống như &#002;&#002;&#008;&#002;&#002;&#005;&#012;&#002;&#011;&#009;nó trừ 3 vì lý do -1 để lại một ký tự không tốt và trừ 2 để lại một nguồn cấp dữ liệu được dành riêng cho trăn
Dylan Madisetti

1

Java, 58 59

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

HOẶC LÀ

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

Bạn có thể làm cho mã của mình ngắn hơn một chút nếu bạn thêm 1 vào mỗi giá trị trong mảng và sau khi [i] trừ 1.
barteks2x

@ Barteks2x Điểm tốt; cảm ơn
Ypnypn

1

JavaScript 42 37

Chạy nó trên bảng điều khiển của trình duyệt của bạn

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);}

Không phải ngôn ngữ tốt nhất để chơi gôn, nhưng ồ ...
Biên dịch với gcc progname.c -o progname. (Bỏ qua các cảnh báo hoặc thêm -include stdio.hvào lệnh biên dịch.)

Cách sử dụng: ./progname <number>

CHỈNH SỬA

Theo đề xuất của @ @ bebe, đây là một ví dụ lấy đầu vào từ STDIN thay thế:

C - 68 51 byte

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

sử dụng d=*b[1]-48có thể là một ý tưởng tốt
bebe

@bebe À đúng rồi, cảm ơn!
BenjiWiebe

1
main(){printf("%d",(int[]){1,0,6,0,0,3,10,0,9,7}[getchar()-48]-1);}xin lỗi vì đã làm phiền bạn nhiều như vậy nhưng tôi thấy điều này ngắn hơn một chút.
bebe

Bạn có thể lưu một nhân vật khác bằng cách tạo mảng toàn cầu để bạn không cần diễn viên. 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 byte
bebe

1

J (24, chức năng)

(bảng điều khiển đầu vào không hoạt động tốt. Dán phần sau vào trình thông dịch python và câu trả lời của tôi sẽ được tiết lộ :)

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


1

05AB1E , 13 byte (không cạnh tranh)

0®5®®Y9®8 6¹@

Hãy thử trực tuyến!

-3 cảm ơn Emigna .

Giải trình:

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¹@nên làm việc như là tốt.
Emigna

@Emigna Mình không có ý kiến, cảm ơn!
Erik the Outgolfer

Suy nghĩ tốt với @. Không thường xuyên bạn thấy rằng được sử dụng :)
Emigna

@Emigna Một byte ngắn hơn )¹èhoặc )sè.
Erik the Outgolfer


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.