Benim "anahtar deliğim" beni sıkıcı! Minimum tuş vuruşlarını bulmama yardım et


13

Bu soruyu ortaya çıkardığı için @ Agawa001'e verilen krediler .

açıklama

Yeni "anahtar deliğimin" yalnızca 2 düğmesi vardır, +ve -.

Bellekteki sayı şuradan başlar 0.

Art arda +veya düğmesine her basışta, -tam olarak art arda kaç kez basıldığı için bellek artırılır / azaltılır.

Bu nedenle, +4 kez basarsanız , ilk kez 1 eklediğinde, ikinci kez 2 ekler, üçüncü kez 3 ekler, dördüncü kez 4 ekler ve size 10(on) verir.

Şimdi, -3 kez basarsanız , ilk kez 1, ikinci kez 2, üçüncü kez 3 çıkarır ve sizi 4(dört) ile bırakır .

TL; DR

+ Ve - karakter dizisi verildiğinde, karakteri her karakter değişikliğinde bölün. Daha sonra, sonuçta ortaya çıkan her m +simgesi dizisi, m'inci üçgen sayısını ekler ve n -sembollerinin her bir dizisi, n'inci üçgen numarasını çıkarır.

Walk-yoluyla

Şimdi, hala anlamıyorsanız, size nasıl +++--+--yaratıldığını göstereceğim 1.

Program   | Counter | Memory
----------------------------
          |  0      | 0
+         | +1      | 1
++        | +2      | 3
+++       | +3      | 6
+++-      | -1      | 5
+++--     | -2      | 3
+++--+    | +1      | 4
+++--+-   | -1      | 3
+++--+--  | -2      | 1

Görev

  • Fonksiyonel argüman olarak veya STDIN'den girdi olarak pozitif bir tamsayı alırsınız.
  • Ardından, yukarıdaki yöntemi kullanarak bu sayıyı oluşturmak için gereken minimum tuş vuruş sayısını çıkarır / yazdırırsınız.

testcases

+Veya -run'ların yeniden düzenlenmesi aynı sayıyı verdiğinden, bu tür her grup için sadece sözlükbilimsel olarak en erken sekans listelenir.

Input | Output | Possible corresponding sequences
-------------------------------------------------
    4 |      5 | -+++-
    6 |      3 | +++
    9 |      5 | ++++-
   11 |      7 | +++-+++
   12 |      7 | +++++--, ++++-++
   19 |      8 | -++++++-
   39 |     12 | +++++++++---
   40 |     13 | +++++++++---+, ++++++++-+++-
   45 |      9 | +++++++++
   97 |     20 | ++++++++++++++--+---, +++++++++++++-++++--, ++++++++++++-++++++-
  361 |     34 | ++++++++++++++++++++++++++-+++-+++

Ekstra kaynaklar

puanlama

Bu . Baytlarda en kısa çözüm kazanır.


9
Bu ... keybored olduğun anlamına mı geliyor?
busukxuan

Sanırım şimdi 10 test vakası var (benim dahil).
Outgolfer Erik

@ ΈρικΚωνσταντόπουλος 12 test durumu hafif bir modifikasyonla eklenmiştir (çünkü +++++--aynı zamanda bir alternatiftir, ancak ++-++++eşdeğer olduğundan kaldırıldım ++++-++). Eğer bir tane daha verimli bir çözüm bulursa, daha sonra eklemek istiyorum bir dava daha var, eğer ben üretmek yönetmek eğer.
Sp3000

@ Sp3000 ++-++++Kaldırılmasını istemedim . Ayrıca, bu SİZİN düzenlememdi, SİZİN değil.
Outgolfer Erik

@ ΈρικΚωνσταντόπουλος Her eşdeğer çözüm grubundan sadece 1 çözüm listelenmiştir - Tüm minimum çözümler listelenmişse, test senaryolarının gereksiz yere uzun olacağını düşündüm (97 için 40 ve 17 çözüm için 6 çözüm var). Bu niyet net değilse özür dilerim. Ayrıca eksik +++++--(ya da eşdeğer --+++++), bu yüzden ilk etapta düzenleme ihtiyacını hissettim.
Sp3000

Yanıtlar:


2

Python 2, 119 bayt

def g(n,i=0,s=''):
 c=x=t=0
 for d in s:C=int(d)*2-1;t=(c==C)*t+1;c=C;x+=c*t
 return(x==n)*len(s)or g(n,i+1,bin(i)[3:])

Çok yavaş kaba kuvvet yaklaşımı. Üçüncü satır bir dizenin puanını hesaplar x; diğer satırlar, puanı argümana eşit olana kadar tüm olası ikili dizgiler üzerinde döngü yapar.

@Leaky üç bayt kurtardı!


s/x==n and len/(x==n)*len/
Sızdıran Rahibe

Kurtulmak sve sadece tekrarlanan bölümü kullanmak için bazı baytlar kaydedebilir , şöyle:def f(n): \n while n>0:print n%2;n/=2
Leaky Nun

2

Pyth, 25 bayt

ffqyQ.as-Mc*RhdY2{s.pM./T

Çevrimiçi deneyin.

Bu son derece verimsizdir ve f(n)≥ 11 hafızasında f(22)biter. Dizüstü bilgisayarımda yaklaşık 10 saniyede = 10 değerini hesaplar .

açıklama

  • 1'den başlayarak sayılar arasında geçiş yapın T. ( f)
    • Öğesinin tüm bölümlerini oluşturun T. ( ./T)
    • Bunların tüm permütasyonlarını oluşturun. ( .pM)
    • Listeyi düzleştirin. ( s)
    • Listeyi ayır. ( {) Bu adım olabilir kaldırıldı, ama çok daha hızlı kod yapar edilecek.
    • Bölümlerin sonuçtaki permütasyonlarını filtreleyin: ( f)
      • Bölümün d( *R) her sayısını kendi başına artı bir ( hd) ile çarpın . Bu, sonuca eklenecek / çıkarılacak sayının iki katını verir.
      • Listeyi uzunluk 2'ye bölün. ( c2)
      • Bu parçalardaki ikinci sayıları ikinci sayıdan çıkarın. ( -M)
      • Sonuçları toplayın. Bu, bölüm permütasyonu ekleme sayısı, sonra çıkarma vb. Olarak yorumlanırsa, elde edilen sayının iki katını verir.
      • Mutlak değeri al. ( .a) Sonuç negatifse, toplama ve çıkarmaların değiştirilmesi olumlu sonuç alır.
      • Sonucun girişin iki katı olup olmadığını kontrol edin. ( qyQ) Bu durumda, bölüm permütasyonu doğruysa, iade edin.
    • Filtre herhangi bir sonuç döndürürse, bir uzunluk çözümü vardı T. İade ve baskı T.

2

MATL , 43 29 bayt

E:"@TFEqZ^!"@Y'tQ**s]vGE=a?@.

Bu, bellek ve zaman verimsizdir. Çevrimiçi derleyici 45yalnızca girdiyi işleyebilir .

Çevrimiçi deneyin!

İşte tüm test senaryolarına kadar değiştirilmiş bir sürüm40 (çevrimiçi derleyicide neredeyse bir dakika sürer).

açıklama

Bu, geçerli bir dizi bulunana kadar, her bir uzunluğun olası tüm tuş basma dizilerini, artan uzunluk sırasıyla test eder.

E:       % Range [1 2 ... 2*N] where N is implicit input. The required sequence length is
         % less than 2*N, so this is enough
"        % For each
  @      %   Push current value: length of sequence
  TFEq   %   Push array [1 -1]
  Z^     %   Cartesian power. Gives all possible sequences of 1, -1 of that length
  !      %   Transpose. Each sequence is now a row
  "      %   For each sequence
    @    %     Push current sequence
    Y'   %     Run-length decoding: Pushes an array of values 1 and -1, and then an
         %     array of run-lengths
    tQ*  %     Duplicate, add 1, multiply. Gives twice the triangular number for each run
    *    %     Multiply element-wise by 1 or -1 to produce correct sign
    s    %     Sum of array. This is the number produced by the current sequence
  ]      %   End for
  v      %   Concatenate all numbers into an array
  GE=a   %   True if any of those numbers equals twice the input
  ?      %   If so
    @    %     Push current sequence length. This is the final result
    .    %     Break loop
         %   End if
         % End for
         % Implicit display

@ Sp3000 Ben de bir tane ekledim, bu yüzden referans için 4, 6, 9 ve 19 sırayla atıfta bulunulan test vakaları.
Outgolfer Erik

1

Python, 105100 bayt

Önce genişlik verimsiz bir arama kullanır.

def k(n):
 m=t=l=0;h=[]
 while m-n:o=1-2*(t>0);(m,t,l),*h=h+[(m+t-o,t-o,l+1),(m+o,o,l+1)]
 return l
  • h sıra olarak kullanılan bir listedir
  • m listenin başındaki dizinin değeridir
  • t en son eklenen sayıdır m
  • l oluşturulan dizinin uzunluğu m
  • o +/- 1, işareti t

Düzenleme: Sızdıran Rahibe beş bayt tıraş.


s/m,t,l,h=0,0,0,[]/m=t=l=0,h=[]/
Sızdıran Rahibe

s/while m!=n/while m-n/
Sızdıran Rahibe
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.