Bir sayının çevrilmiş sürümünü döndürme


18

Hesap makinesinde bir sayı gösterildiğinde, bu sayının çeşitli dönüşümlerinin nasıl görüneceğini düşünmek mümkündür. Örneğin, yedi bölümlü bir ekranda 2 şu şekilde gösterilir:

resim açıklamasını buraya girin

Ve yatay olarak çevrildiğinde şöyle görünür:

resim açıklamasını buraya girin

Bu haliyle, 2'nin ayna görüntüsü 5'tir.

Bu görevdeki görev, tek basamaklı bir sayı almak ve ayna görüntüsü olan sayıyı döndürmektir (mümkünse). Ayna görüntüsü bir sayıya benzemiyorsa, 180 derece döndürülmüş sayıyı döndürün (mümkünse). Bunlardan hiçbiri söz konusu değilse -1 döndürün.

Programınızın işlemesi gereken giriş ve çıkışların tam listesi:

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

Bir meydan okuma olarak, en kısa kod kazanır!


17
Son noktanıza katılmıyorum - 7 segmentli bir ekranda 1 diğer tarafa
çevrilir

29
Her rakamı nasıl çevireceğime kafam karıştı. 2 5 olursa, 6 9 değil 9 geriye doğru olmalıdır. Ancak 6 9 olursa, kapak sadece bir dönüş olur, bu yüzden 2 5 değil, 2 olur.
18

6
6, 9 döndürülmüş 180 derece, 2, 5 yatay olarak çevrilmiş ve 1, 3 aslında dikey eksen boyunca kendilerinin yansımalarıdır.
jimmy23013

22
Soruda tanımlanan çeviriler hiç tutarlı değil. Neden 2 ve 5 ters çeviriyor, ama 3 değil?
Rynant

4
Değiştirilebilir sayılar hakkında ilginç bir gerçek fark ettim: ters ikili desenler oluştururlar, yani 2 = 010, 5 = 101. 6 = 0110, 9 = 1001. Herkes bu gerçeği kendi çözümlerinde kullanabilir mi?
Jack Aidley

Yanıtlar:


32

Haskell - 43 31

Hiçbir şey fantezi olmayan 43 karakter.

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

Kısmi bir işlev haline getirerek 31 karaktere kadar indi.

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

4
Güldüm. +1.
seequ

6
+1 Haskell'i tam olarak ne yapmak için kullandığınız için . diyor!
recursion.ninja

1
f=Geçerli bir ifade olduğu için ikinci çözüme ihtiyacınız olduğunu düşünmüyorum
Cyoce 26:16

23

GolfScript, 15 14

Spesifikasyonu tekrar okudum ve girişin bir dize olması gerektiğini buldum.

"0.5..29.86"\?

Koşmak:

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

Eski sürüm (tamsayı girdisi olan):

[0.5..2 9.8 6]?

Yeni olanı (14 bayt) aditsu'nun CJam cevabından biraz ilham alıyor .


1
Bunu düşünmediğime inanamıyorum ...
Dennis


14

Python 2.x - 28

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

2
Python 2.x, özellikle.
seequ

6
Python 3 ile, `s kaldırabilir ve 2 karakter kaydedebilirsiniz.
Rynant


8

CJam, 20 bayt

q25691347`"5296W"er~

Çevrimiçi deneyin.

Çıktı

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

Nasıl çalışır

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 bayt

Sanırım yorumcular haklı, ancak Befunge 2d dil çizgisi olmak biraz farklı. Yine de bu anda yorumcular haklı.

&1g01g-.  
! &  #* )'

Adımlar:

&

Girişi x sayısal değeri olarak okur ve yığının üzerine iter.

1g

X, 1 konumunda c (yani! '= 33 veya' * '= 42 karakter değerini alır. Boş bir hücre = 32).

01g-.

0,1 (33) hücresinin karakter değerini okur, c'den çıkartır ve sayısal bir değer olarak verir.


2
Gayet iyi. +1.
seequ

Lütfen uzunluğu düzeltin: 20 bayt
har-wradim

1
Aslında baytlarınızı yanlış sayıyorsunuz. 19 bayt kullandınız . Yeni satırları ve alanları sayarız. Ancak Befunge 98'e geçerseniz, bir tane kaydedebilirsiniz; 1. satırı şu şekilde değiştirin:&1g'!-.
Justin

8

Java - 49

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

Burada, 0x790a300601istenen çıktılarla doldurulmuş bir değerdir ve bir tanesi onları pozitif yapmak için eklenmiştir. Değerler, değer içindeki nibblelarda saklanır, bu nedenle onları çıkarmak için biraz kaydırma ve maskeleme gerekir.

Java - 100 (eğlence seçeneği)

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

En küçük seçenek değil, ama biraz eğlenceli. X kez (0> = X <= 9) olarak adlandırıldığında doğru değerleri üreten rastgele bir tohum buldum .


Zeki. +1
Cyoce

8

JavaScript (ECMAScript 6) 25

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

JavaScript (ECMAScript 5) 43

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

GÜNCELLEME: edc65 çok daha iyi bir teknik önerdi. diş fırçası çok daha iyi bir dil önerdi. Bu noktada, birincil katkılarım hata ayıklama ve gume.


1
ECMAScript 6 (Firefox'ta desteklenir) olarak değiştirirseniz, bunu yapabilirsiniz x=>[0,-1,5,-1,-1,2,9,-1,8,6][x].
Diş fırçası

İlk başta, neredeyse function(x)[0,-1,5,-1,-1,2,9,-1,8,6][x]Firefox sayesinde yayınladım . Yine de kazanmayacaktım, bu yüzden en yüksek uyumluluk cevabına sadık kalmaya karar verdim. Eğer kısalık için dil değiştirmeye başlarsam, sonunda yaptığım her zorluk için kendi dilimi tanımlamaya başlayacağım. Ama devam edip ECMAScript 6 versiyonundan bahsedeceğim, çünkü bunu
Keen

1
Aynı kavram ama daha kısa (güle güle virgül): x => '106003907' [x] - (x! = 6)
edc65

@ edc65 Bilirsiniz, bir dize kullanmak isterdim ve sonucu tekrar bir sayıya zorlayabileceğim konusunda tamamen boş kalmıştım. Tuhaf bir atlamalı. Ama yine de gelmezdim -(x!=6). Teşekkür ederim.
Keen


6

bash 29

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

Örneğin

$ 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

'Sed ifadesinin çevresini atlayabilirsiniz . Ayrıca g, teknik özelliklerin her seferinde yalnızca bir basamak sağlaması nedeniyle atlayabileceğinizi düşünüyorum
Digital Trauma

Teşekkürler. Sadece örnekte, gönderimin kendisi kullanmıyor '. gDaha uzun giriş için hoşlanıyor !

4

Kona - 29

Bu işlev, öğeyi xdiziden döndürür0 -1 5...

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

Örnekler:

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

Bir vektöre gerçekten izin verilir mi?
seequ

@TheRare: Hmm, "algoritma" diyor bu yüzden sanmıyorum. Değiştireceğim ve daha çok sizinki gibi yapacağım ...
Kyle Kanos

Daha iyi görünüyor, +1.
seequ

4

JavaScript 36 37 41

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

ES6 işlevi olarak - 27:

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

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

@nderscore İnsanların kodlarını geliştirmeyi seviyorsun değil mi?
seequ

3
@TheRare Sadece en kısa javascript kodunu bulmak için bir arayış içindeyim. :) Başka biri zaten iyi bir cevap yayınladıysa, neredeyse yinelenen yeni bir cevap göndermek yerine optimizasyonları bulmak benim için daha mantıklı. Rekabet etmek için burada değilim, sadece bu hedefe ulaşmak için işbirliği yapmak için.
nderscore

@nderscore Fikrim yeterince benzer olduğu sürece aynı zihniyete sahibim. Her neyse, iyi olan.
seequ

@nderscore Bana gerçekten bir motivasyon verdin. Daha kısa yapabilir miyim emin değilim, ama deneyeceğim :)
core1024

4

Kaydırma, 11 karakter

걄럣뉥밈결⓷方分결剩貶

Sonunda, yorumlayıcısını oluşturmak için Visual Studio yüklü bir Windows bilgisayar buldum. Ve GolfScript kodumu kolayca yendi.

18453063256\11\?/11%(GolfScript'te okur .


2
İlginç, ancak GolfScript yanıtınız hala kazanıyor. Soru aksini belirtmedikçe uzunluk bayt cinsinden ölçülür.
Dennis

@Dennis Bu, bu sitedeki 3. ya da 4. cevabımdı. Bilmiyordum. Bence APL bir istisna.
jimmy23013

@Dennis Ve çoğu insan Sclipting'i sevmez. :)
jimmy23013

Gerçekten bir istisna değil, sadece insanların kodlamasını seçmelerine izin veriyoruz. UTF-16 kullanan boyutu bu cevap 22 bayt olur. APL yalnızca 256 farklı karakter kullanır ve bir kez karakterin tam olarak bir bayt olduğu bir APL kod sayfası vardır.
Dennis

@Dennis Ah, haklısın.
jimmy23013

3

J - 28 27 bayt

Ne sevdiğimi biliyorsun? Basitlik (28 bayt). J'de _1negatif bir (-1) olduğuna dikkat edin .

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

Biraz karmaşıklık ekleyin ve 27 baytınız var.

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

Misal:

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

3

CJam - 14

Giriş / çıkış sürümü:

"0 5  29 86"q#

Yığın sürümü (sayının yığında olduğunu varsayar):

[0W5WWY9W8 6]=

Bunları http://cjam.aditsu.net/ adresinde deneyin.


CJAM hakkında Wikipedia makalesi yok ve bağlantı boş bir kemancıya gidiyor. Dil ve yerleşik sürümleri hakkında nereden bilgi edinebilirsiniz?
Panzercrisis


@Panzercrisis cjam.aditsu.net kaynak sayfası sayfasına bağlı "CJam" var
aditsu

3

Perl, 27 26

Kont pbayrağı içerir

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

Kullanımı:

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

Bekle, Perl sadece J'yi dövdü mü? :)


+1 Ben y+0-9+9a4aa70a13+;$_=9-hexaynı uzunlukta, ama senin daha özgün
gönderecekti

1
@ core1024: Ve artık kısaldı;)
Zaid

echo 1 | perl -pe y/2569/5296/,s/[347]/-1/
Olmadı

@ core1024: Özellikleri yanlış okudum, şimdi düzeltilmelidir. Hala J çözümünden daha kısa.
Zaid

J'de bunu yapmanın kesin bir yolu yoktur, çünkü değerler kesinlikle yazılır ve sayılar dizelerle eşleşemez.
seequ

3

Marbelous 34 bayt

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

En kısa çözüm değil, ama en uzun çözüm de değil.

Nasıl çalışır

}0İlk komut satırı girdisini temsil eden bir mermer üretir. Bu mermer bir sonraki keneyi =6hücreye bırakır . =6bir karşılaştırma hücresidir, değeri 6 olan herhangi bir mermeri ve diğerlerini sağa doğru iter. Karşılaştırma hücrelerinin bu dizilimi, mermerleri istenen değere eşit olana kadar iter. 0 ve 8 sadece düşüyor ve tahtanın altından düştüğünde yazdırılıyor, 6 ve 2 ve 9 ve 5 önce bunlardan sırasıyla 3 ekleniyor. Bir mermer istenen değerlerden herhangi birine eşit değilse ?0, herhangi bir mermeri 0 mermere dönüştüren hücreye iner 1 . Bu mermer daha sonra azaltılır ve tahtadan düşer.

1 bir ?nmermer teknik 0 ile n arasında bir mermer herhangi bir mermer döner. Bu, ?0herhangi bir şeyi 0'a dönüştüren güzel yan etkiye sahiptir .


2

MATLAB - 35

Bunu ntek parametre olarak bir fonksiyonda sararım.

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

35 karakter.


2

ECMAScript 6, 24

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

Normal JavaScript kullanıldığında 33 olur:

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

2

TI-BASIC, 24 22

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

Bu, taban-11 kayan nokta sayısı olarak saklanan bir arama tablosundaki olası çıktıları kodlar; ondalık noktasından sonraki (N + 1) .bas-11 basamağı, ters basamağın değerini almak için tablodan çıkarılır. 11 no'lu tabandaki sayı .106003A097ve bu rakamın rakamları tam olarak verilmiştir 0,-1,5,-1,-1,2,9,-1,8,6.

edc65'in 6 durumunda birini çıkarma hilesi, bu ⑩^(tek baytlık bir belirteç olan 24 baytlık bir çözüme yol açar :

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

Dize yaklaşımı 29 bayttır:

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

Dizi yaklaşımı (Ypnpyn'in de kullandığı), sayının X'te saklandığı varsayılarak 30 bayttır:

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

24 -> 22: Sihirli sabitte fazladan iki hassas basamak kaldırıldı.


Bu neredeyse kesinlikle 19'a ve muhtemelen 18'e golf edilebilir; ancak doğru sayıları aramam gerekiyor.
lirtosiast

2

C - 47 bayt [48 bayttı]

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

86 bayt için G / Ç (diğer yanıtların her zaman olmadığı) eklemek için:

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
Vay, böyle bir şey vardı ipucu satır içi dizi değişmezleri vardı. İlk cevap çok güzel ve PPCG'ye hoş geldiniz! (G / Ç işlevi gönderimlerinin tamamen geçerli olduğunu eklemenize gerek yoktur .)
Martin Ender

1

Python - 34

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

1
33 f=lambda n:ord(" "[n])-3alan kodlarıyla
Dylan Madisetti

Bunun nasıl ve neden çalıştığını açıklamak isteyebilirsiniz
Riot

Ascii tablosunu asciitable.com kullanarak seçilen beyaz alanlar python ile yazdırılabilir. aslında &#002;&#002;&#008;&#002;&#002;&#005;&#012;&#002;&#011;&#009;-1 gibi bir boş karakter bıraktığı için eksi 3'e benziyor ve eksi 2
python'a

1

Java, 58 59

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

VEYA

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


@ Barteks2x İyi bir nokta; teşekkürler
Ypnypn

1

JavaScript 42 37

Tarayıcınızın konsolunda çalıştırın

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

1

C - 117 108 106 77 76 bayt

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

Golf için en iyi dil değil, ama iyi ...
Derleyin gcc progname.c -o progname. (Uyarıları yok sayın veya -include stdio.hderleme komutuna ekleyin .)

Kullanım: ./progname <sayı>

DÜZENLE

@ Bebe'nin önerisine göre, girdiyi STDIN'den alan bir örnek:

C - 68 51 bayt

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

kullanarak d=*b[1]-48iyi bir fikir olabilir
bebe

@bebe Ah evet, teşekkürler!
BenjiWiebe

1
main(){printf("%d",(int[]){1,0,6,0,0,3,10,0,9,7}[getchar()-48]-1);}seni bu kadar rahatsız ettiğim için üzgünüm ama bunu biraz daha kısa buluyorum.
bebe

Diziyi global yaparak başka bir karakter kaydedebilirsiniz, böylece oyuncuya ihtiyaç duymazsınız. 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 bayt
bebe

1

J (24, işlev)

(giriş paneli iyi oynamıyor. Aşağıdakileri bir python yorumlayıcısına yapıştırın, cevabım açıklanacak :)

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


1

05AB1E , 13 bayt (rakip olmayan)

0®5®®Y9®8 6¹@

Çevrimiçi deneyin!

Emigna'ya -3 teşekkürler .

Açıklama:

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¹@de çalışmalı.
Emigna

@Emigna Hiçbir fikrim yoktu, teşekkürler!
Outgolfer Erik

İyi fikir @. Sıklıkla kullanılmış olduğunu görmüyorsunuz :)
Emigna

@Emigna )¹èveya ' den daha kısa bir bayt )sè.
Outgolfer Erik


1

Jöle , 14 bayt (rakip olmayan)

ị“-5--29-860”V

Çevrimiçi deneyin!

Açıklama:

ị“-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‡05AB1E
Sihirli Ahtapot Urn
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.