Çarpın ve Bölün


10

Bir değer verilen X daha küçük sayısal değer daha yüksek bulmak y çarpılır ve bölünmesi olma yeteneğine sahip x orijinal basamak koruyarak.

  • Yeni sayılar rakamları kaybetmez.
  • Yeni sayılar rakam kazanmaz.

Örneğin:

Giriş: x = 2, y = 250000

  • Orijinal: 285714
    • Bölüm: 142857
    • Çarpma: 571428

Çünkü bu durum geçerlidir 285.714 daha büyük olan y ; Daha sonra bölündüğü zaman X sonuçların 142857 ve ile çarpıldığında x sonuçları 571428 . Her iki testte de 285714 orijinal basamakların tümü mevcuttur ve fazladan basamak eklenmemiştir.


Kurallar

  • Daha yüksek bir şeyin hesaplanması çok uzun sürdüğü için X 2 veya 3 olmalıdır .
  • Y , sıfırdan büyük bir tam sayı olmalıdır .
  • En kısa kod kazanır.

Test Durumları

Bunlar en yaygın test senaryolarım, çünkü test etmek en hızlı olanlar.

  • x = 2, y = 250000 = 285714
  • x = 2, y = 290000 = 2589714
  • x = 2, y = 3000000 = 20978514
  • x = 3, y = 31000000 = 31046895
  • x = 3, y = 290000000 = 301046895

Açıklamalar

  • Bölümün türü önemli değil. Eğer bir şekilde 2.05, 0.25 ve 5.20 alabilirsiniz , o zaman çekinmeyin.

Hepinize iyi şanslar!


4
" X, 2 ile 5 arasında bir değer olmalıdır ." - X> = 4 ise, X ile çarpılan sayı, X'e bölünen sayıdan en az 16 kat daha büyük olacaktır, bu yüzden mutlaka daha fazla basamağa sahip olacaktır
ngn 27:18

2
x, 2 veya 3 dışında bir şey olamaz çünkü ürün bölümün x ^ 2 katıdır ve her ikisinde de aynı sayıda rakam olmalıdır. x = 1 önemsiz bir durum olacaktır. IMO, x = 3 için herhangi bir çözüm yok.
Jatin Sanghvi

2
Bölme kayan veya tamsayı bölme mi?
Outgolfer Erik

3
Test
Stephen

3
Şüphe ediyorum ki yeniden oy kullanmaktan kaçınan tek kişi ben değilim, çünkü açıklama aslında zorluğu daha belirsiz hale getiriyor , çünkü doğru cevap kayan nokta çıktısının dikkate alınıp alınmamasına bağlı olarak değişebilir. Ben @EriktheOutgolfer 'ın sorusu kayan nokta çıkmasını sağlayan hakkında sormuyordum şüpheli, ama olmadığı hakkında kullanmak için izin verildiği kesiliyor tamsayı bölme. (Yorumlarım karışıklığa eklendiğinde özür dilerim.)
Ørjan Johansen

Yanıtlar:


4

Kabuk , 14 bayt

ḟ§¤=OoDd§¤+d*/

Çevrimiçi deneyin!

açıklama

ḟ§¤=O(Dd)§¤+d*/  -- example inputs: x=2  y=1
ḟ                -- find first value greater than y where the following is true (example on 285714)
 §               -- | fork
         §       -- | | fork
              /  -- | | | divide by x: 142857
                 -- | | and
             *   -- | | | multiply by y: 571428
                 -- | | then do the following with 142857 and 571428
                 -- | | | concatenate but first take
           +     -- | | | | digits: [1,4,2,8,5,7] [5,7,1,4,2,8]
          ¤ d    -- | | | : [1,4,2,8,5,7,5,7,1,4,2,8]
                 -- | and
       d         -- | | digits: [2,8,5,7,1,4]
      D          -- | | double: [2,8,5,7,1,4,2,8,5,7,1,4]
                 -- | then do the following with [2,8,5,7,1,4,2,8,5,7,1,4] and [1,4,2,8,5,7,5,7,1,4,2,8]
   =             -- | | are they equal
  ¤ O            -- | | | when sorted: [1,1,2,2,4,4,5,5,7,7,8,8] [1,1,2,2,4,4,5,5,7,7,8,8]
                 -- | : truthy
                 -- : 285714

Daha yakın bir başlangıç ​​noktası elde etmek için y değerini ayarladım ve sonuç x = 3, y = 25000000 için yanlıştı .
Emma - PerpetualJ

@PerpetualJ: Sonra sonucunu biliyorsanız sadece ayarlayabilirsiniz y , ve bu sürüm olmalıdır hafifçe daha hızlı (yalnızca olsa tip denetimi).
ბიმო

Bazı düşüncelerden sonra ayarladım ve ilk yorumumu düzenledim.
Emma - PerpetualJ

@PerpetualJ: Düzeltdim: -hangisinin yanlış olduğu hakkında bir varsayım yaptım .
ბიმო

1
@PerpetualJ: Programı yazdım;) Bir açıklama ekledim, şimdi herkes neler olduğunu anlamalı.
ბიმო

5

Brachylog v2, 15 bayt

t<.g,?kA/p.∧A×p

Çevrimiçi deneyin!

Formda girdi alır [x,y].

açıklama

t<.g,?kA/p.∧A×p
t                  Tail (extract y from the input)
 <                 Brute-force search for a number > y, such that:
  .                  it's the output to the user (called ".");
   g                 forming it into a list,
    ,?               appending both inputs (to form [.,x,y]),
      k              and removing the last (to form [.,x])
       A             gives a value called A, such that:
        /              first ÷ second element of {A}
         p             is a permutation of
          .            .
           ∧         and
            A×         first × second element of {A}
              p        is a permutation of {.}

yorum

Brachylog'un birden çok değeri birden çok kez tekrar kullanmadaki zayıflığı burada görünür; Bu program neredeyse tüm sıhhi tesisat ve çok az algoritma.

Bu nedenle, y'nin değerini basitçe kodlamak daha uygun görünebilir (bu soruda, 2'nin tek olası değer olduğu varsayımı vardır). Bununla birlikte, aslında y = 3 için çözümler vardır, bu da maalesef sıhhi tesisatın y değerini de ele alması gerektiği anlamına gelir . Farkında olduğum en küçük şey şudur:

                         315789473684210526
315789473684210526 × 3 = 947368421052631578
315789473684210526 ÷ 3 = 105263157894736842

(Bu sayıyı bulmak için kullandığım teknik tamamen genel değil, bu nedenle başka bir yaklaşım kullanarak daha küçük bir çözüm olması mümkündür.)

Ancak bunu bu programla doğrulamanız pek olası değildir . Brachylog'lar p, özel durumlar için (hem giriş hem de çıktının zaten bilindiği gibi) optimizasyona sahip olmayan çok genel bir şekilde yazılır, yani O ( n log n ) ' de doğrulamayı sıralama yoluyla yapabilirsiniz. kullandığından şüphelendiğim kaba kuvvet yaklaşımı için O ( n !) Sonuç olarak, 105263157894736842'nin 315789473684210526'nın bir permütasyonu olduğunu doğrulamak çok uzun zaman alıyor (açık bir ilerleme olmadan birkaç dakika çalışıyorum.)

(EDIT: Brachylog kaynağını bu nedenle kontrol ettim. pBilinen iki tamsayı kullanırsanız, kullanılan algoritmanın algoritma olarak çıkış tamsayıya eşit olanı bulana kadar söz konusu tamsayı için olası tüm permütasyonları ürettiği ortaya çıkar. "girdi → indigits, permüde indigits → outdigits, outdigits → çıktı" dır. İlk önce outdigits / çıktı ilişkisini kurmak için daha verimli bir algoritma olacaktır , böylece permütasyon içindeki geri takip hangi basamakların mevcut olduğunu hesaba katabilir .)


Çatal kullanmak kodunuzu 1 bayt azaltabilir. Çevrimiçi deneyin!
Kroppeb

Ayrıca dokümanlara göre, bilinen iki listenin bir permütasyon olup olmadığını kontrol etmek gibi görünüyor O (n²) swi-prolog.org/pldoc/man?predicate=permutation/2
Kroppeb

@Kroppeb: sorun, Brachylog'un bilinen iki tamsayı argüman olarak verildiğinde bile bilinen iki listeyle pçalışmadığıdır permutation/2; Bu (kullanarak ilk tamsayı tüm permütasyonlarını oluşturur permutation/2ile bir bilinen listesi) ve daha sonra ikinci tamsayı karşı karşılaştırmaktadır.
ais523

4

Perl 6 , 56 54 bayt

->\x,\y{(y+1...{[eqv] map *.comb.Bag,$_,$_*x,$_/x})+y}

Çevrimiçi deneyin!

İlginç bir alternatif, k = -1,0,1 için n * x k hesaplaması :

->\x,\y{first {[eqv] map ($_*x***).comb.Bag,^3-1},y^..*}

3

Temiz , 92 bayt

import StdEnv
$n m=hd[i\\i<-[m..],[_]<-[removeDup[sort[c\\c<-:toString j]\\j<-[i,i/n,i*n]]]]

Çevrimiçi deneyin!

Gayet basit. Bir süre sonra açıklama geliyor.


3

q, 65 bayt

{f:{asc 10 vs x};while[not((f y)~f y*x)&(f y*x)~f"i"$y%x;y+:1];y}

Sayıyı 10 tabanına ayırın, her artan değeri sıralayın ve eşit olup olmadığını kontrol edin. Değilse, y'yi artırın ve tekrar gidin


3

JavaScript (ES6), 76 73 69 bayt

eval()@ShieruAsakoto tarafından önerildiği gibi, kullanılarak 3 bayt kaydedildi

Girişi alır (x)(y).

x=>y=>eval("for(;(g=x=>r=[...x+''].sort())(y*x)+g(y/x)!=g(y)+r;)++y")

Çevrimiçi deneyin!

Özyinelemeli sürüm 62 bayt olur , ancak çok sayıda gerekli yineleme nedeniyle burada uygun değildir.

Nasıl?

yardımcı işlevi girdi olarak bir tamsayıyı alır, onu bir dizi karakter dizisine dönüştürür ve bu diziyi sıralar.g

Misal:

g(285714) = [ '1', '2', '4', '5', '7', '8' ]

Rakamlarını karşılaştırmak ve bu kişilerce karşı , biz birleştirme olmadığını test ile arasında birleştirme eşittir kendisi ile.y×xy/xyg(y×x)g(y/x)g(y)

İki dizi birlikte eklenirken, her biri örtük olarak virgülle ayrılmış bir dizeye zorlanır. İlk dizinin son basamağı, aralarında virgül olmadan ikinci dizinin ilk basamağıyla doğrudan birleştirilecek ve bu da bu biçimi açık hale getirecektir.

Misal:

g(123) + g(456) = [ '1', '2', '3' ] + [ '4', '5', '6' ] = '1,2,34,5,6'

Fakat:

g(1234) + g(56) = [ '1', '2', '3', '4' ] + [ '5', '6' ] = '1,2,3,45,6'

Yorumlananlar

x => y =>                   // given x and y
  eval(                     // evaluate as JS code:
    "for(;" +               //   loop:
      "(g = x =>" +         //     g = helper function taking x
        "r =" +             //       the result will be eventually saved in r
          "[...x + '']" +   //       coerce x to a string and split it
          ".sort() + ''" +  //       sort the digits and coerce them back to a string
      ")(y * x) +" +        //     compute g(y * x)
      "g(y / x) !=" +       //     concatenate it with g(y / x)
      "g(y) + r;" +         //     loop while it's not equal to g(y) concatenated with
    ")" +                   //     itself
    "++y"                   //   increment y after each iteration
  )                         // end of eval(); return y

66: x=>F=y=>(g=x=>r=[...x+''].sort()+'')(y*x)!=g(y)|r!=g(y/x)?F(y+1):yy çözelti tho'dan uzaksa yığın taşmasına neden olabilir.
Shieru Asakoto

veya 75 kullanarak eval:x=>y=>eval("for(;(g=x=>r=[...x+''].sort()+'')(y*x)!=g(y)|r!=g(y/x);y++);y")
Shieru Asakoto

@ShieruAsakoto eval()Fikir için teşekkürler . İlk girişimim özyinelemeliydi, ancak çok sayıda gerekli yinelemeden vazgeçtim.
Arnauld

3

Haskell, 76 74 bayt

Lynn'in yorumu sayesinde iki bayt tıraş oldu

import Data.List
s=sort.show
x#y=[n|n<-[y+1..],all(==s n)[s$n*x,s$n/x]]!!0

1
Aynı bayt sayımı için folabilir, f x y=[n|n<-[y+1..],all(==s n)[s$n*x,s$n/x]]!!0ancak daha sonra bir operatör olarak cevabınızı tanımlamak iki bayt kazandırır: x!y=…ve sonra cevabınız (!):)
Lynn

Liste kavrayışlarını kullanmayı düşünmedim! Öneri için teşekkürler: D
umnikos

2

Japt, 24 bayt

Birkaç bira üzerinde oldukça naif bir çözüm; Eminim daha iyi bir yol vardır.

@[X*UX/U]®ì nÃeeXì n}a°V

Dene


Ne yazık ki bu, x = 3 ve y = 25000 olduğunda yanlış sonuç verir .
Emma - PerpetualJ

@PerpetualJ varsayarsak 315789473684210526ilk çözümdür x=3, JavaScript veya Japt olamaz o çift hassasiyet uymuyor çünkü doğru hesaplamak.
Bubbler

@PerpetualJ, bunu daha önce düzeltti. Ancak bu test durumu, Bubbler'ın yukarıda bahsettiği için asla tamamlanmayacak.
Shaggy

@Shaggy Bu artık doğru bir sonuç üretir ve Bubbler işaret bu çözelti, yukarıdaki birinci doğru bir sonuç değildir 25000 . Eğer merak ediyorsanız test durumlarıma bakın. +1
Emma - PerpetualJ

1

Python 2 , 69 bayt

S=sorted
x,y=input()
while(S(`y`)==S(`y*x`)==S(`y/x`))<1:y+=1
print y

Çevrimiçi deneyin!


f=lambda x,y,S=sorted:y*(S(`y`)==S(`y*x`)==S(`y/x`))or f(x,y+1)çalışmalı, ancak özyineleme sınırına oldukça hızlı bir şekilde ulaşıyor ve PPCG kurallarının bu konuda ne söylemesi gerektiğini bilmiyorum.
Lynn

1

Jöle ,  14  13 bayt

-1 Outgolfer Erik sayesinde (`` make_digits kullanıyor, bu yüzden Dgerekli değildi)
+2 bir hatayı düzeltiyor (Outgolfer'a Erik bir konuyu işaret ettiği için tekrar teşekkürler)

×;÷;⁸Ṣ€E
‘ç1#

Sonucu basan tam bir program (ikili bir bağlantı olarak 1 uzunluğunun bir listesi verilir).

Çevrimiçi deneyin!

Nasıl?

×;÷;⁸Ṣ€E - Link 1, checkValidity: n, x               e.g. n=285714,  x=2
×        -     multiply -> n×x                       571428
  ÷      -     divide -> n÷x                         142857
 ;       -     concatenate -> [n×x,n÷x]              [571428,142857]
    ⁸    -     chain's left argument = n             285714
   ;     -     concatenate -> [n×x,n÷x,n]            [571428,142857,285714]
     Ṣ€  -     sort €ach (implicitly make decimals)  [[1,2,4,5,7,8],[1,2,4,5,7,8],[1,2,4,5,7,8]]
        E    -     all equal?                        1

‘ç1# - Main link: y, x
‘    - increment -> y+1
   # - count up from n=y+1 finding the first...
  1  - ...1 match of:
 ç   -   the last link (1) as a dyad i.e. f(n, x)

Bölme kesin olmadığında D, sıralamadan önce uygulanan örtülü ondalık komutunun (a'ya eşdeğer ) kesirli bir parça verdiğini unutmayın,
örneğin: 1800÷3D-> [6,0,0]
while 1801÷3D->[6.0,0.0,0.33333333333337123]


Bu cevabın geçerli olduğundan emin değilim; meydan okuma, sonucun "kesinlikle Y'den büyük" olarak yorumladığım " y'den büyük" olmasını gerektirir . Ayrıca, ihtiyacınız yok . D
Outgolfer Erik

Ah iyi nokta >=ben tamamen özledim! Hiçbir fikrim yoktu make_digits üzerine kurulmuş - teşekkürler. Daha sonra düzeltmek ve güncellemek zorunda
Jonathan Allan

1

Mathematica, 82 74 bayt

x=Sort@*IntegerDigits;Do[If[x[i#]==x@Floor[i/#]==x@i,Break@i],{i,#2,∞}]&

Tsh sayesinde -8 bayt

Bağımsız değişkenleri olarak alan işlev [x,y]. Etkili bir kaba kuvvet için rakamları sıralama listesinin eğer kontrolleri arama y, y/xve xyaynıdır.

Çevrimiçi deneyin!


Mathematica'ya aşina değilim. Ancak, bölünmenin kesirli kısmını düşürürseniz cevabın hala doğru olduğu kanıtlanabilir: Tüm ans, ans / x, ans * x, 9 ile bölünebilir olmalıdır. Ve bu , çözümünüzü kısaltabilir.
tsh

@tsh Bu işe yarıyor x=3, ama bunun doğru olduğundan emin değilim x=2.
Ørjan Johansen

@ ØrjanJohansen Let v = a[1]*10^p[1] + a[2]*10^p[2] + ... + a[n]*10^p[n], u = a[1] * 10^q[1] + ... + a[n] * 10^q[n]. Ve u-v = a[1]*(10^p[1]-10^q[1]) + ... + a[n]*(10^p[n]-10^q[n])beri 10^x-10^y=0 (mod 9)her zaman tutar. u-v=0 (mod 9)hep tutar. Yanlış bir cevap varsa w, o zaman w*x-w=0 (mod 9), ve w-floor(w/x)=0 (mod 9): var floor(w/x)=0 (mod 9). eğer floor(w/x)*x <> w, w-floor(w/x)*x>=9ama bu w-floor(w/x)*x<xx 2 veya 3 olabileceği
gerçeğiyle çelişiyorsa

@tsh Teşekkürler! Bu noktayı elde etmek için çok uzun süren başkalarının yararı için, 3'ten bölünemez çünkü w=0 (mod 9)aşağıdakilerden kaynaklanır :w*x-w=0 (mod 9)x-1
Ørjan Johansen

IntegerQTesti hariç tutarsam, IntegerDigitskesirler üzerinde yapmaya çalıştığında birkaç hata üretir , ancak Mathematica hala onları geçer ve doğru cevabı üretir. Son cevap doğru olsa bile, hesaplama sırasında hataların eklenmesine izin verilip verilmediğinden emin değilim.
numbermaniac

0

APL (NARS), 490 karakter, 980 bayt

T←{v←⍴⍴⍵⋄v>2:7⋄v=2:6⋄(v=1)∧''≡0↑⍵:4⋄''≡0↑⍵:3⋄v=1:5⋄⍵≢+⍵:8⋄⍵=⌈⍵:2⋄1}
D←{x←{⍵≥1e40:,¯1⋄(40⍴10)⊤⍵}⍵⋄{r←(⍵≠0)⍳1⋄k←⍴⍵⋄r>k:,0⋄(r-1)↓⍵}x}
r←c f w;k;i;z;v;x;y;t;u;o ⍝   w  cxr
   r←¯1⋄→0×⍳(2≠T c)∨2≠T w⋄→0×⍳(c≤1)∨w<0⋄→0×⍳c>3
   r←⌊w÷c⋄→Q×⍳w≤c×r⋄r←r+c
Q: u←D r⋄x←1⊃u⋄y←c×x⋄t←c×y⋄o←↑⍴u⋄→0×⍳o>10⋄→A×⍳∼t>9
M:                     r←10*o⋄⍞←r⋄→Q
A: u←D r⋄→M×⍳x≠1⊃u⋄→B×⍳∼(t∊u)∧y∊u⋄z←r×c⋄v←D z⋄→C×⍳(⍳0)≡v∼⍦u
B: r←r+1⋄→A
C: k←z×c⋄⍞←'x'⋄→B×⍳(⍳0)≢v∼⍦D k
   ⎕←' '⋄r←z

Ölçek

  2 f¨250000 290000 3000000
xxxx 
1000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
10000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
285714 2589714 20978514 
 3 f¨ 31000000 290000000 
xxxxxxxxx 
100000000xxxxxxxxxxxxxxxxxxxxxxxxxx 
31046895 301046895 

Ben bir r 3 r r, r * x, r * x * x r * x y y yakın bir değere başlar (burada x ve y girdi ana yazı ile aynı harfleri kullanarak sorunun). R'nin ilk basamağı d'den r'den daha fazlaysa, r (veya daha iyi r * x) bir çözüm yapmak için de d * x ve d * x * x basamaklarının görünmesi gerektiği gözlemini kullandım.


0

05AB1E , 16 bayt

[>©Ð²÷s²*)€{Ë®s#

Çevrimiçi deneyin. (NOT: Çok verimsiz bir çözüm, bu nedenle sonuca yakın girişleri kullanın. Yerel olarak da daha büyük girişler için çalışır, ancak TIO'da 60 saniye sonra zaman aşımına uğrar.)

Açıklama:

[                   # Start an infinite loop
 >                  #  Increase by 1 (in the first iteration the implicit input is used)
  ©                 #  Store it in the register (without popping)
   Ð                #  Triplicate it
    ²÷              #  Divide it by the second input
      s             #  Swap so the value is at the top of the stack again
       ²*           #  Multiply it by the second input
         )          #  Wrap all the entire stack (all three values) to a list
          €{        #  Sort the digits for each of those lists
             ®s     #  Push the value from the register onto the stack again
            Ë       #  If all three lists are equal:
               #    #   Stop the infinite loop
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.