7 segmentli farklar


26

Sanırım buradaki çoğu insan, rakamlar için 7 segmentli bir ekranın ne olduğunu biliyor:

 _         _   _         _    _    _    _    _ 
| |    |   _|  _|  |_|  |_   |_     |  |_|  |_|
|_|    |  |_   _|    |   _|  |_|    |  |_|   _|

İki basamak arasındaki 7 bölüm farkını ( 7 SD) , birinden diğerine geçmek için değiştirilmesi gereken bölüm sayısı olarak tanımlayabiliriz . Örneğin arasında 7SD ve bir 5 (üç yatay segmentler ve alt iki dikey segmentler konuma getirilebilir gerekir), ve 6 ve 8 arasında 7SD 1 .12

Ayrıca, iki sayı arasındaki 7SD'yi, karşılık gelen haneler arasındaki 7SD'lerin toplamı olarak tanımlayabiliriz. Bir sayı diğerinden daha uzunsa, sağa hizalı olduklarını varsayıyoruz ve daha büyük sayının diğer en önemli basamağını görüntülemek için gereken segment sayısını ekledik. Örnek olarak, 12345ve arasındaki 7SD'yi düşünün 549:

  x:  1 2 3 4 5
  y:      5 4 9
7SD:  2+5+2+0+1 = 10

Göreviniz etmektir arasındaki 7SD hesaplamak n ve n + 1 , verilen n .

Kolaylık sağlamak için, bireysel rakamlar arasındaki 7SD'lerin tam tablosu. Satır _boş bir konumu temsil eder.

   _ 0 1 2 3 4 5 6 7 8 9

_  0 6 2 5 5 4 5 6 3 7 6
0  6 0 4 3 3 4 3 2 3 1 2
1  2 4 0 5 3 2 5 6 1 5 4
2  5 3 5 0 2 5 4 3 4 2 3
3  5 3 3 2 0 3 2 3 2 2 1
4  4 4 2 5 3 0 3 4 3 3 2
5  5 3 5 4 2 3 0 1 4 2 1
6  6 2 6 3 3 4 1 0 5 1 2
7  3 3 1 4 2 3 4 5 0 4 3
8  7 1 5 2 2 3 2 1 4 0 1
9  6 2 4 3 1 2 1 2 3 1 0

Giriş

  • Giriş, tek bir pozitif tamsayıdır n.
  • STDIN (veya en yakın alternatif), komut satırı argümanı veya işlev argümanı üzerinden girdi alarak bir program veya işlev yazabilirsiniz.
  • Girişin, dilinizin standart tamsayı tipinde temsil edilebilecek en büyük sayıdan daha küçük olduğunu ve bu tip en az 127 olan ve en az 127 değer içeren değerleri desteklediği sürece kabul edebilirsiniz.

Çıktı

  • Tek bir tamsayı arasındaki 7SD yazdırmalıdır nve n+1.
  • STDOUT (veya en yakın alternatif), fonksiyon dönüş değeri veya function (out) argümanı ile çıkış alabilirsiniz.

puanlama

Standart kuralları uygulanır, en kısa kod (bayt cinsinden) kazanır.

Test Kılıfları

Bazı belirsiz nedenlerden dolayı, bu dizi henüz OEIS'de değildir, ancak yakından ilgili sekans A123587 vardır . İşte ilk 100 sayı (başlayarak n = 1, 2, 3, ...):

5, 2, 3, 3, 1, 5, 4, 1, 4, 4, 5, 2, 3, 3, 1, 5, 4, 1, 7, 4, 5, 2, 3, 3, 1, 
5, 4, 1, 4, 4, 5, 2, 3, 3, 1, 5, 4, 1, 5, 4, 5, 2, 3, 3, 1, 5, 4, 1, 5, 4, 
5, 2, 3, 3, 1, 5, 4, 1, 3, 4, 5, 2, 3, 3, 1, 5, 4, 1, 7, 4, 5, 2, 3, 3, 1, 
5, 4, 1, 6, 4, 5, 2, 3, 3, 1, 5, 4, 1, 3, 4, 5, 2, 3, 3, 1, 5, 4, 1, 6, 4

7SD'nin 9'dan büyük olduğu ilk girdi, 11'ini 1999vermelidir. İşte daha büyük bazı örnekler:

n          7SD
1999        11
12345        1
999999      14
5699999     15
8765210248   1

Yanıtlar:


8

Jöle , 25 22 21 20 bayt

‘DṁDḟ"DFị9979482ḃ5¤S

Çevrimiçi deneyin! veya tüm test durumlarını doğrulayın .

Arka fon

İlk önce n girişini arttırır ve n + 1'in tüm rakamlarını atarız değişmemiş .

Örneğin, n ise 5699999 , aşağıdakileri olsun.

n     : 5700000
n + 1 : 5699999
Result:  700000

Bu sonuçtaki tüm rakamlar, geçiş yapılması gereken sabit bir bölüm sayısına sahiptir. Bazı baytları kaydetmek için seçim listesini bijektif tabanına 5 dönüştürebiliriz .

digit:   1 2 3 4 5 6 7 8 9 0
toggles: 4 5 2 3 3 1 5 4 1 2

Çıktı basitçe bireysel geçişlerin toplamıdır.

Çoğu değerleri için bu eserler n ise ancak özel bakım alınmalıdır n + 1 den fazla basamak vardır n . Bu durumda, tüm rakamların 9 ' olması gerekir ve bu sorunu n + 1' den 0 a keserek çözeriz .

Örneğin, n ise 999999 , aşağıdakileri olsun.

n     :  999999
n + 1 : 1000000
Result: 100000

Bu çalışmalar gelen nedeni 1 değerlendirir için 4 geçiş yapar (arasındaki mesafe , 0 ve 1 ), geçiş yapar gerçek miktarı ise 2 (mesafe arasında 0 ve 1 ), ve arka bir bastırma 0 onun kaldırır 2 geçişi toplamdan .

Nasıl çalışır

‘DṁDḟ"DFị9979482ḃ5¤S  Main link. Argument: n

‘                     Compute n+1.
 D                    Convert n+1 from integer to base 10.
   D                  Convert n from integer to base 10.
  ṁ                   Mold the left result as the right result.
                      This chops of a 0 if n+1 has more digits than n.
    ḟ"D               Vectorized filter-false with the base 10 digits of n.
                      This removes the digits from n+1 that are identical to
                      the corresponding digits of n.
       F              Flatten the resulting list of lists.
         9979482ḃ5¤   Convert 9979482 to bijective base 5.
                      This yields [4, 5, 2, 3, 3, 1, 5, 4, 1, 2].
        ị             Retrieve the digits at the right that correspond to the
                      indices at the left.
                   S  Compute the sum of the results.

10

JavaScript (ES6), 46 40 bayt

f=n=>n?+"452331541"[n%10]||f(n/10|0)+2:2

Alternatif formülasyon, ayrıca 46 40 bayt:

f=n=>n?26523308>>n%10*3&7||f(n/10|0)+2:2

Düzenleme: @ xsot sayesinde 6 bayt kaydedildi.


ES6'daki mantıksal veya operatör python'daki gibi davranırsa, ikinci kodunuzu daha da kısaltabilirsiniz. Örnek olarak gönderimime bakın.
xsot

@ xsot Aslında ikisini de kısaltabilirim! Sıfır özel durumu değiştirmeme yardımcı olacağını sanmıyorum, çünkü bu sadece 4 bayt.
Neil

Vay, ilki çalıştığına şaşırdım. Bir hata bekleniyor.
xsot

@ xsot javascript sadece hata vermez. Javascript'in doğduğu on gün boyunca en doğru yaklaşım gibi görünen şey sadece budur. . Daha sonraki sürümler biraz daha katı bir davranış sergilemenize izin verir, ancak neden burada biri bunu yapsın? Mantıksal operatörlerin kısa dolaşımı davranışları oldukça yaygın olsa da, yalnızca PHP her zaman bir boole döndürerek yanlış şeyi yapıyor.
John Dvorak

@JanDvorak Aslında, dizginin uzunluğundan daha büyük bir dizginin dizinine erişebildiğinize şaşırdım.
xsot

10

Python, 50 48 bayt

f=lambda n:26523308-0**n*2>>n%10*3&7or f(n/10)+2

açıklama

Bu işlev, sayının en az önemli basamağında çalışır nve ilk rakam olmayana kadar bir artırma yapıldığında rakamların 7SD'sini toplar 9.

26523308basamak için eşlemeyi kodlayan bir bit maskesidir 0-8. Ne zamann=0 zaman husule gelir, ki, naşağıdakileri içerir: yalnızca 9s, iki ile kapalı olacaktır. Bu ifade ile telafi edilir 0**n*2. Rakam gelince 9, bit maskesi 2, 7SD'ye eklerken özyinelemeli çağrıyı tetikleyecek olan sıfırı değerlendirir .


Dönüşümün nasıl gerçekleştiğine dair bir açıklama yapabilir miyiz? Yani, zekalılık için +1 ama zekice kayboldum.
CAD97

8

05AB1E , 31 30 28 27 26 bayt

Kod:

9Ü©T%•2X›ùì•sè¹g®g-·¹Ú9Q·O

Açıklama ( eski ):

9Ü                              # Trim off trailing 9's
  ©                             # Copy this into the register
   T%                           # Get the last non-9 digit
     žh                         # Short for 0123456789
       •2X›ù앧                 # Compressed version of 4523315412
               ‡                # Transliterate

Aşağıdakileri 9 olmayan son basamağa değiştiriyoruz:

0 -> 4
1 -> 5
2 -> 2
3 -> 3
4 -> 3
5 -> 1
6 -> 5
7 -> 4
8 -> 1
9 -> 2

Özel durumlar için:

                ¹g              # Get the length of the input
                  ®g            # Get the length of the input with all trailing 9 gone
                    -           # Substract, giving the number of 9's at the end of 
                                  the input
                     2*         # Multiply by two
                       O        # Sum everything up
                        ¹Ú      # Uniquify the input
                          9Qi   # If this is equal to 9 (only 9's in the input)
                             Ì  #   Increment by 2 (_ -> 1)

CP-1252 kodlamasını kullanır . Çevrimiçi deneyin! .

28 baytlık bir alternatif: D[¤©•2X›ùì•sès®9Ê#¨]\rÚ9Q4*O.



3

MATL , 61 39 36 bayt

tQvV15\'3dAsMh818RG5'6Y27WZaw)Z}Z~Bz

Çevrimiçi deneyin!

açıklama

tQv            % Implicit input. Duplicate, add 1, concatenate vertically
V              % Convert to 2D char array: each number in a row, possibly left-padded 
               % with a space
15\            % Modulo 15. With modular indexing this corresponds to the order
               % '9', ' ', '0', '1', ..., '8'
'3dAsMh818RG5' % This string encodes active segments for each of the 11 chars
6Y2            % Source alphabet printable ASCII chars (predefined literal)
7W             % Target alphabet: [0 1 ... 127]
Za             % Base conversion: decode string into vector of 11 numbers, where each
               % number from 0 to 127 encodes the 7-segment representation of a digit,
               % in the order '9', ' ', '0', '1', ..., '8'
w              % Swap top two elements in stack
)              % Use as index. Gives 2-row array, where each column is a digit 
Z}             % Split into the two rows
Z~             % Bitwise XOR, elementwise
B              % Convert to binary. Each number gives a row
z              % Number of nonzero elements. Implicitly display

3

Julia, 44 bayt

!x=x<1?2:(t=x%10÷1)<9?3045058÷6^t%6:2+!.1x

Burada dene.

Dennis bir bayt kurtardı!


1
Meraktan, neden sadece rakamları kullanmıyorsun?
Conor O'Brien,

Bir Julia TIO olduğuna inanamıyorum. Welp, Julia'yı öğrenmenin zamanı geldi ...
Mama Fun Roll

3

Python, 71 66 bayt

Xsot tarafından 48 bayt . Daha da sihirli matematik!

f=lambda n:(2+f(n/10)if n%10==9else 26523308>>n%10*3&7)if n else 2

İdeone gör

Çünkü önceki Python cevabı işe yaramıyor ve optimal olmaktan uzak. Önceki bir ES6 sürümünün basit bir bağlantı noktası . Şimdi bir döküm kesmek için (ES6 alternatif formülasyonundan) bit bükme kullanarak!

Açıkça +1 bayt için floordiv kullanarak Python 3 ile çalışmak için yapılabilir.


sonra boşluk alabilir9
Maltysen

@Maltysen görünüşe göre haklısın. Bunun bir hata olacağını düşündüm çünkü ebir numaranın ardından geçerli bir harf 9e9.
CAD97

Bu benim Java cevabımdan daha uzun ! Bunu nasıl düzeltebiliriz? Dan karşılaştırma tersine o Not n%10==9için n%10<9bu sırayla bir boşluk ihtiyacı yoktur sanki kaydetmez.
CAD97

Ve xsot'un çok daha kısa bir Python sürümü yaptığını görmeye geldim. Aferin!
CAD97 19

2

Jolf, 32 bayt

Ώ?H?<γ%Ht9P."452331541"γ+2Ώc/Ht2

Burada dene!

açıklama

Bu, Neil'in cevabının bir çevirisi.

Ώ?H?<γ%Ht9P."452331541"γ+2Ώc/Ht2
Ώ                                 define a function Ώ of H
 ?H                            2  (when H is zero, return is 2)
      %Ht                         H mod 10
     γ                            γ = ^
   ?<    9                        is it less than 9?
                                  if so:
           ."452331541"γ           get the γth element of that string
          P                        as a number
                                  else
                        +2         add two to
                          Ώ        Ώ over
                           c/Ht    int(H / 10)


0

J, 53 bayt

2:`((2+10$:@<.@%~[)`(6|3045058<.@%6^])@.(9>])10&|)@.*

Aslında @ Neil'in çözümüne dayanıyor . Daha sonra @ Lynn'in çözümünde aynı formülü kullanarak bir byte kaydederek geliştirilmiştir .

Dize dayalı 54 bayt sürümü

2:`((2+10$:@<.@%~[)`('452331541'".@{~])@.(9>])10&|)@.*

kullanım

   f =: 2:`((2+10$:@<.@%~[)`(6|3045058<.@%6^])@.(9>])10&|)@.*
   f 1999
11
   f 1999 12345 999999 5699999 8765210248
11 1 14 15 1

0

Retina , 34 bayt

M!`.9*$
^9
0
T`d`4523315412
.
$*
.

Çevrimiçi deneyin!(İlk satır aynı anda birden fazla test durumunun işlenmesine izin verir.)

açıklama

Şimdiye kadar keşfedilen çoğu yanıt gibi, tüm tabloyu kullanmamıza gerek yok, çünkü 9artış sırasında yalnızca en az anlamlı olmayan rakamlar değişir. Aynı zamanda bu cevap da işe yarıyor.

M!`.9*$

Bu, ( M) regex ile eşleşir , .9*$yani sadece 9s ile sondan ayrılan ilk hane . !7SD etkilemez herşeyi atarak, bu maç ile giriş yerine Retina söyler.

^9
0

Girdi şimdi başlarsa 9o araçlarla giriş kendisi oluşuyordu sadece bir 97 segmentli gösterge ihtiyaçları başa ekleyerek böylece, s 1hangi maliyetleri 2. Bununla başa çıkmanın en basit yolu 9, bu durumda liderin yerini a ile değiştirmektir 0, zira bir 9(to 0) 2artışının maliyeti ve artmanın 0(to 1) artışının maliyeti budur 4, dolayısıyla bu, toplam maliyeti 2gerektiği gibi arttırır .

T`d`4523315412

Şimdi her basamağı artırma maliyeti ile değiştiren bir harf çevirme aşamasına sahibiz ( dgenişlediğinden beri 0123456789). Bunun 7SD tablonun ilk alt köşesi olduğuna dikkat edin.

.
$*

Bu, her bir basamağın kopyaları nile değiştirilir , yani her basamağı birliğe dönüştürür ve ayırıcılar olmadığından bunları hemen ekler.n1

.

Son olarak, sonuçtaki karakter sayısını (yani eşleşme sayısını .) sayarız; bu, normal toplamı tekrar ondalık sayıya dönüştürür.

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.