Zwraca odwróconą wersję numeru

18

Gdy liczba jest wyświetlana na kalkulatorze, można rozważyć, jak wyglądałyby różne przekształcenia tej liczby. Na przykład na siedmiosegmentowym wyświetlaczu 2 pokazuje się tak:

wprowadź opis zdjęcia tutaj

A po odwróceniu w poziomie wygląda to tak:

wprowadź opis zdjęcia tutaj

W związku z tym odbicie lustrzane 2 wynosi 5.

Zadaniem w tym wyzwaniu jest pobranie liczby jednocyfrowej i zwrócenie liczby, która jest jej odbiciem lustrzanym (jeśli to możliwe). Jeśli jego odbicie lustrzane nie wygląda jak liczba, zwróć liczbę obróconą o 180 stopni (jeśli to możliwe). Jeśli nie ma żadnego z tych przypadków, zwróć -1.

Oto pełna lista wejść i wyjść, które Twój program musi obsłużyć:

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

Jako wyzwanie do wygrywa najkrótszy kod!

James Williams
źródło
17
Nie zgadzam się z twoim ostatnim punktem - wyświetlacz 1 na 7 segmentach byłby po prostu odwrócony na drugą stronę, więc 1 powinien
drzemać
29
Jestem zdezorientowany, jak przerzucić każdą cyfrę. Jeśli 2 staje się 5, wtedy 6 powinno być 9, a nie 9 wstecz. Ale jeśli 6 staje się 9, to flip jest tylko rotacją, więc 2 staje się kolejnym 2, a nie 5.
kernigh
6
6, 9 obrócone o 180 stopni, 2, 5 obrócone w poziomie, a 1, 3 w rzeczywistości są ich odbiciami na osi pionowej.
jimmy23013
22
Tłumaczenia zdefiniowane w pytaniu wcale nie są spójne. Dlaczego 2 i 5 odwracają się, a 3 nie?
Rynant,
4
Zauważyłem ciekawy fakt na temat przełączalnych liczb: tworzą one przeciwne wzory binarne, tj. 2 = 010, 5 = 101. 6 = 0110, 9 = 1001. Czy ktoś może wykorzystać ten fakt w swoim rozwiązaniu?
Jack Aidley,

Odpowiedzi:

32

Haskell - 43 31

43 znaków bez niczego fantazyjnego.

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

Ograniczono go do 31 znaków, czyniąc z niego funkcję częściową.

f=([0,-1,5,-1,-1,2,9,-1,8,6]!!)
Taylor Fausak
źródło
4
Śmiałem się. Masz +1.
patrz
6
+1 Za użycie Haskell do robienia dokładnie tego , co specyfikacja. mówi!
recursion.ninja
1
Nie wydaje mi się, że potrzebujesz f=drugiego rozwiązania, ponieważ jest to prawidłowe wyrażenie
Cyoce
23

GolfScript, 15 14

Przeczytałem specyfikację ponownie i stwierdziłem, że dane wejściowe muszą być ciągiem.

"0.5..29.86"\?

Biegać:

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

Stara wersja (z wprowadzoną liczbą całkowitą):

[0.5..2 9.8 6]?

Nowszy (14 bajtów) jest nieco zainspirowany odpowiedzią CJam autorstwa aditsu .

jimmy23013
źródło
1
Nie mogę uwierzyć, że o tym nie pomyślałem ...
Dennis
19

PowerShell - 27

'0 5  29 86'.indexof($args)
Rynant
źródło
14

Python 2.x - 28

'015..29.86'.find(`input()`)
Willem
źródło
2
W szczególności Python 2.x.
patrz
6
W Pythonie 3 możesz usunąć `s i zapisać 2 znaki.
Rynant,
11

JavaScript 37 36

alert("0_5__29_86".search(prompt()))
DarkAjax
źródło
użyj .search()i zapisz bajt.
Ismael Miguel
@IsmaelMiguel Nice one, Thanks!
DarkAjax
8

CJam, 20 bajtów

q25691347`"5296W"er~

Wypróbuj online.

Wynik

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

Jak to działa

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
źródło
8

BEFUNGE 93 - 18 14 20 bajtów

Wydaje mi się, że komentatorzy mają rację, chociaż Befunge jest linią 2d języka, jest trochę inna. Jednak w tej chwili komentatorzy mają rację.

&1g01g-.  
! &  #* )'

Kroki:

&

Odczytuje dane wejściowe jako wartość liczbową x i wypycha je na stos.

1g

Pobiera wartość znaku c (tak jak „!” = 33 lub „*” = 42. Pusta komórka = 32) w pozycji x, 1.

01g-.

Odczytuje wartość znaku komórki 0,1 (33), odejmuje ją od c i wysyła jako wartość liczbową.

AndoDaan
źródło
2
Całkiem miło. Masz +1.
patrz
Popraw długość: to 20 bajtów
har-wradim
1
Właściwie źle policzyłeś bajty. Użyłeś 19 bajtów. Liczymy znaki nowej linii i spacje. Ale jeśli przejdziesz na Befunge 98, możesz zapisać jeden; zmień 1. linię na:&1g'!-.
Justin
8

Java - 49

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

Tutaj 0x790a300601jest wartość wypełniona pożądanymi wyjściami, z jedną dodaną, aby były dodatnie. Wartości są przechowywane w wartościach liczbowych w obrębie wartości, więc aby je wyskoczyć, konieczne jest trochę przesunięcia i maskowania.

Java - 100 (opcja zabawy)

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

Nie jest to najmniejsza opcja, ale trochę zabawy. Znalazłem losowe ziarno, które generuje prawidłowe wartości, gdy jest wywoływane X razy (gdzie 0> = X <= 9).

Duncan Jones
źródło
Sprytny. Zdobądź +1
Cyoce
8

JavaScript (ECMAScript 6) 25

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

JavaScript (ECMAScript 5) 43

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

AKTUALIZACJA: edc65 zasugerował znacznie lepszą technikę. szczoteczka do zębów sugeruje znacznie lepszy język. W tym momencie moim podstawowym wkładem jest debugowanie i gumowanie.

Zapalony
źródło
1
Jeśli zmienisz go na ECMAScript 6 (obsługiwany w Firefoksie), możesz po prostu to zrobić x=>[0,-1,5,-1,-1,2,9,-1,8,6][x].
szczoteczka do zębów
Na początku prawie pisałem function(x)[0,-1,5,-1,-1,2,9,-1,8,6][x], również dzięki Firefoxowi. Zresztą i tak nie zamierzałem wygrywać, więc zdecydowałem się trzymać odpowiedzi o najwyższej kompatybilności. Jeśli zacznę zmieniać języki dla zwięzłości, w końcu zacznę definiować własny język dla każdego wyzwania, które podejmę. Ale i tak wspomnę o wersji ECMAScript 6, skoro ją zasugerowałeś
Keen
1
Ta sama koncepcja, ale krótsza (żegnaj przecinki): x => '106003907' [x] - (x! = 6)
edc65
@ edc65 Wiesz, chciałem użyć łańcucha i całkowicie nie rozumiem, że mogę zmusić wynik do powrotu do liczby. Dziwny upływ czasu. Jednak wciąż nie wymyśliłbym tego -(x!=6). Dziękuję Ci.
Keen
6

uderzenie 29

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

na przykład

$ 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

źródło
Możesz pominąć 'wyrażenie sed. Myślę też, że można pominąć, gponieważ specyfikacja dostarcza tylko jedną cyfrę na raz
Digital Trauma
Dzięki. Tylko w tym przykładzie samo zgłoszenie nie korzysta '. Polubienie gna dłuższy wkład!
4

Kona - 29

Ta funkcja zwraca element xz tablicy0 -1 5...

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

Przykłady:

> f 2
  5
> f 5
  2
> f 8
  8
Kyle Kanos
źródło
Czy sam wektor naprawdę jest dozwolony?
patrz
@TheRare: Hmm, mówi „algorytm”, więc chyba nie. Zmienię to i sprawię, że będzie bardziej podobny do twojego ...
Kyle Kanos
Wydaje się lepiej, mieć +1.
patrz
4

JavaScript 36 37 41

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

jako funkcja ES6 - 27:

f=v=>'0x'+'65b558f5ec'[v]-6
rdzeń 1024
źródło
2
28:f=v=>~-[1,,6,,,3,10,,9,7][v]
nderscore
@nderscore Uwielbiasz poprawiać kody ludzkie, prawda?
patrz
3
@ TheRare Właśnie szukam najkrótszego kodu javascript. :) Jeśli ktoś już opublikował dobrą odpowiedź, sensowniej jest dla mnie znaleźć w niej optymalizacje niż opublikować nową odpowiedź, która jest prawie duplikatem. Nie jestem tu po to, by konkurować, tylko po to, by współpracować w osiąganiu tego celu.
nderscore
@nderscore Mam taką samą mentalność, o ile mój pomysł jest wystarczająco podobny. W każdym razie miło.
patrz
@nderscore Naprawdę dałeś mi motywację. Nie jestem pewien, czy uda mi się to skrócić, ale spróbuję :)
core1024,
4

Sclipting, 11 znaków

걄럣뉥밈결⓷方分결剩貶

Wreszcie znalazłem komputer z systemem Windows z zainstalowanym programem Visual Studio, aby zbudować jego interpreter. I z łatwością pokonał mój kod GolfScript.

Czyta 18453063256\11\?/11%(w GolfScript.

jimmy23013
źródło
2
Ciekawe, ale twoja odpowiedź na GolfScript nadal wygrywa. O ile pytanie nie stanowi inaczej, długość jest mierzona w bajtach.
Dennis
@Dennis To była moja trzecia lub czwarta odpowiedź na tej stronie. Nie wiedziałem I myślę, że APL jest wyjątkiem.
jimmy23013
@Dennis I większość ludzi nie lubi Sclipting. :)
jimmy23013
To nie jest wyjątek, po prostu pozwalamy ludziom wybrać ich kodowanie. Ta odpowiedź uzyskałaby 22 bajty, ponieważ jest to jej rozmiar przy użyciu UTF-16. APL używa tylko 256 różnych znaków i istnieje strona kodowa APL, na której jeden znak ma dokładnie jeden bajt.
Dennis
@Dennis Ah, masz rację.
jimmy23013
3

J - 28 27 bajtów

Wiesz co lubię? Prostota (28 bajtów). Zauważ, że w J _1jest ujemny (-1).

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

Dodaj trochę złożoności, a masz 27 bajtów.

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

Przykład:

   f 2
5
   f 6
9
   f 5
2
...
patrz
źródło
3

CJam - 14

Wersja wejścia / wyjścia:

"0 5  29 86"q#

Wersja stosu (zakłada, że ​​numer znajduje się na stosie):

[0W5WWY9W8 6]=

Wypróbuj je na http://cjam.aditsu.net/

aditsu
źródło
Nie ma artykułu w Wikipedii o CJAM, a link prowadzi do pustego skrzypka. Gdzie można znaleźć informacje o języku i jego ustalonych wersjach?
Panzercrisis,
Wygląda na to, że to jest to: sourceforge.net/projects/cjam
Panzercrisis
@Panzercrisis cjam.aditsu.net ma link „CJam” powiązany ze stroną sourceforge
aditsu
3

Perl, 27 26

Liczba obejmuje pflagę

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

Stosowanie:

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

Zaraz, czy Perl właśnie pokonał J? :)

Zaid
źródło
+1 Zamierzałem y+0-9+9a4aa70a13+;$_=9-hex
pisać
1
@ core1024: I właśnie stało się krótsze;)
Zaid
Nie:echo 1 | perl -pe y/2569/5296/,s/[347]/-1/
core1024,
@ core1024: Źle odczytałem specyfikacje, powinny zostać teraz naprawione. Jest wciąż krótszy niż rozwiązanie J.
Zaid
Naprawdę nie ma zwięzłego sposobu na zrobienie tego w J, ponieważ wartości są ściśle wpisywane, a liczby nie mogą pasować do ciągów.
patrz
3

Cudowne 34 bajty

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

To nie jest najkrótsze rozwiązanie, ale też nie jest najdłuższe.

Jak to działa

}0spawnuje marmur reprezentujący pierwszą linię poleceń. Ten marmur upuszcza następny cel na =6komórkę. =6jest komórką porównawczą, popycha każdy marmur o wartości 6 w dół, a wszystkie inne w prawo. Ten zestaw komórek porównawczych przesuwa kulki w prawo, aż osiągną pożądaną wartość. 0 i 8 po prostu spadają i są drukowane, gdy spadną z dołu planszy, 6 i 2, a 9 i 5 najpierw dodają 3 do nich, odpowiednio odejmowane. Jeśli marmur nie równa żadnej z pożądanych wartości, wyląduje na ?0komórki, który zamieni każdy marmuru w 0 marmuru 1 . Ten marmur następnie ulega zmniejszeniu i spada z planszy.

1?n marmur marmurem dowolnego technicznie obraca się marmuru z zakresu od 0 do n. Ma to fajny efekt uboczny, który ?0zmienia wszystko w 0.

overactor
źródło
2

MATLAB - 35

Chciałbym zawinąć to w funkcję z njako jedynym parametrem.

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

35 znaków.

lukass
źródło
2

ECMAScript 6, 24

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

Przy normalnym JavaScript byłoby to 33:

alert(~-++'0n5nn29n86'[prompt()])
ShadowCat7
źródło
2

TI-BASIC, 24 22

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

To koduje możliwe dane wyjściowe w tabeli odnośników przechowywanej jako liczba zmiennoprzecinkowa base-11; (N + 1) dziesiąta cyfra podstawowa po wyciągnięciu kropki dziesiętnej z tabeli w celu uzyskania wartości cyfry odwróconej. W bazie 11 liczba ta wynosi.106003A097 , a cyfry tego mniejszego są dokładnie 0,-1,5,-1,-1,2,9,-1,8,6.

Sztuczka edc65 polegająca na odjęciu jednego w przypadku 6 prowadzi do tego 24-bajtowego rozwiązania, w którym ⑩^(jest jeden jednobajtowy token:

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

Podejście łańcuchowe ma 29 bajtów:

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

Podejście tablicowe (które również Ypnpyn) ma 30 bajtów, przy założeniu, że liczba jest przechowywana w X:

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

24 -> 22: Usunięto dwie dodatkowe cyfry precyzji w stałej magicznej.

lirtosiast
źródło
Można prawie na pewno zagrać w golfa do 19, a być może do 18; muszę jednak wyszukać prawidłowe liczby.
lirtosiast
2

C - 47 bajtów [było 48 bajtów]

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

Aby dodać We / Wy (które inne odpowiedzi nie zawsze) dla 86 bajtów:

main(i){i=(int[]){1,0,6,0,0,3,10,0,9,7}[getchar()-48]-1;i<0?puts("-1"):putchar(i+48);}
Brak pasów bezpieczeństwa
źródło
1
Wow, nie miałem pojęcia, że ​​takie dosłowne tablice literackie to coś. Bardzo miła pierwsza odpowiedź i witamy w PPCG! (Nie ma potrzeby dodawania, że funkcje funkcji we / wy są całkowicie poprawne .)
Martin Ender
1

Python - 34

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

źródło
1
33 f=lambda n:ord(" "[n])-3współpracuje z kosmos codekulptor.org/#user34_Q7NbNvQy55_0.py
Dylan Madisetti
Możesz wyjaśnić, jak i dlaczego to działa
Riot
Za pomocą tabeli ascii asciitable.com wybrane białe znaki można wydrukować w pythonie. faktycznie wygląda to tak: &#002;&#002;&#008;&#002;&#002;&#005;&#012;&#002;&#011;&#009;Jest minus 3 z tego powodu, że -1 pozostawia znak null, co nie jest dobre, a minus 2 pozostawia kanał, który jest zarezerwowany w pythonie
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;}

LUB

int f(int i){return new int[]{1,0,6,0,0,3,10,0,9,7}[i]-1;}
Ypnypn
źródło
Możesz nieco skrócić swój kod, jeśli dodasz 1 do każdej wartości w tablicy i po [i]
odejmie
@ Barteks2x Dobry punkt; dzięki
Ypnypn
1

JavaScript 42 37

Uruchom go na konsoli przeglądarki

alert(~-[1,,6,,,3,10,,9,7][prompt()])
William Barbosa
źródło
1

C - 117 108 106 77 76 bajtów

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

Nie najlepszy język do gry w golfa, ale cóż ...
Kompiluj się gcc progname.c -o progname. (Zignoruj ​​ostrzeżenia lub dodaj -include stdio.hdo polecenia kompilacji).

Zastosowanie: ./progname <numer>

EDYTOWAĆ

Zgodnie z sugestią @ bebe, oto przykład, który bierze dane wejściowe z STDIN zamiast:

C - 68 51 bajtów

main(){printf("%d","106003:097"[getchar()-48]-49);}
BenjiWiebe
źródło
używanie d=*b[1]-48może być dobrym pomysłem
bebe
@bebe Ah tak, dzięki!
BenjiWiebe,
1
main(){printf("%d",(int[]){1,0,6,0,0,3,10,0,9,7}[getchar()-48]-1);}przepraszam, że tak bardzo wam przeszkadzam, ale uważam, że jest to nieco krótsze.
bebe
Możesz uratować inną postać, ustawiając tablicę globalną, aby nie była potrzebna obsada. 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 bajtów
bebe
1

J (24, funkcja)

(panel wprowadzania nie gra ładnie. Wklej poniższy tekst do interpretera Pythona, a moja odpowiedź zostanie ujawniona :)

print "f=:{&(_3+3 u:'^C^B^B^E^L^B^K\t')"
.ıʇǝɥʇuʎs
źródło
1

Clojure - 36

#(case % 2 5 5 2 6 9 9 6 0 0 8 8 -1)
rdzeń rdzeniowy
źródło
1

05AB1E , 13 bajtów (niekonkurujące)

0®5®®Y9®8 6¹@

Wypróbuj online!

-3 dzięki Emignie .

Wyjaśnienie:

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
źródło
0®5®®Y9®8 6¹@powinien również działać.
Emigna
@Emigna Nie miałem pojęcia, dzięki!
Erik the Outgolfer
Dobre myślenie z @.
Nieczęsto
@Emigna Bajt krótszy niż )¹èlub )sè.
Erik the Outgolfer
1

Galaretka , 14 bajtów (niekonkurencyjna)

ị“-5--29-860”V

Wypróbuj online!

Wyjaśnienie:

ị“-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
źródło
ịV = žh‡w 05AB1E
Magic Octopus Urn