N Üzerine Bir Not!


32

JE Maxfield aşağıdaki teoremi ispatladı (bakınız DOI: 10.2307 / 2688966 ):

Eğer olan tam sayı pozitif olan basamak, bir pozitif tamsayıyı vardır böylece birinci basamak tamsayısını oluşturur .birmN-mN-!bir

Meydan okuma

bazı karşılık gelen bir N \ geqslant 1 bulması için verilir .bir1N-1

ayrıntılar

  • N-!faktörN-!=123...N- temsil eder ! = 1 \ cdot 2 \ cdot 3 \ cdot \ ldots \ cdot K arasındaN- .
  • Bizim durumumuzda bir rakamının 10 bazında olduğu anlaşılmaktadır .
  • Gönderiminiz, yeterli zaman ve hafıza keyfi için çalışmalıdır . Sadece tamsayıları göstermek için örneğin 32-bit tiplerini kullanmak yeterli değildir.bir1
  • Mümkün olan en az çıktısını almanıza gerek yoktur .N-

Örnekler

A            N
1            1
2            2
3            9
4            8
5            7
6            3
7            6
9           96
12           5
16          89
17          69
18          76
19          63
24           4
72           6
841      12745
206591378  314

Her için mümkün olan en az , https://oeis.org/A076219 adresinde bulunabilir.N-bir


26
Ben ... neden bu teoremi ispatladı? Bir gün uyanıp "Bunu çözeceğim!" Dedi mi? veya bir amaca hizmet etti mi?
Magic Octopus Urn

11
@ MagicOctopusUrn Daha önce hiç bir sayı teorisyeni ile ilgilenmediniz, değil mi?
Brady Gilg

2
İşte herkesin ilgilendiğinin kanıtı.
Esolanging Fruit,

Yanıtlar:


14

Python 2,50 bayt

f=lambda a,n=2,p=1:(`p`.find(a)and f(a,n+1,p*n))+1

Çevrimiçi deneyin!

Bu, 1giriş için geri dönecek şekilde ayarlanmış ve aşağıda açıklanan 47 baytlık bir çözümün bir çeşididir '1'. (Yani, 1özyinelemeli çağrı yerine tam ifadeye ekleriz ve n==2bir derinlik katmanını kaldırmak için saymaya başlarız , tüm '1'girdiler için sonucu dengeleriz .)

Python 2 , 45 bayt (1 ile 1 arası True)

f=lambda a,n=2,p=1:`-a`in`-p`or-~f(a,n+1,p*n)

Bu, @Jo King ve @xnor tarafından girilen, sayı olarak alınan ve Truegirdi için dönen başka bir varyasyondur 1. Bazı insanlar bunun adil bir oyun olduğunu düşünüyor , ama ben şahsen biraz garip buluyorum.

Ancak, buzlu Boole sonucunu kapatarak sadece 3 bayta mal olur +()ve bize daha kısa bir "güzel" çözüm sunar:

Python 2,48 bayt

f=lambda a,n=2,p=1:+(`-a`in`-p`)or-~f(a,n+1,p*n)

Bu benim 0giriş için geri dönen önceki çözümüm '1'. Soru olumsuz olmamaklaN ilgiliyse geçerli olurdu .

Python 2 , 47 bayt (geçersiz)

f=lambda a,n=1,p=1:`p`.find(a)and-~f(a,n+1,p*n)

Çevrimiçi deneyin!

Gibi bir dize girdi olarak alır f('18').

Buradaki hile x.find(y) == 0tam olarak ne zaman x.startswith(y).

and-Anlatım olacak kısa devre `p`.find(a)sonucu 0kısa sürede `p`ile başlar a; Aksi takdirde, -~f(a,n+1,p*n)id est 1 + f(a,n+1,p*n).

Sonuçta 1 + (1 + (1 + (... + 0))), ntabakalar çok derin n.


Bu arada güzel bir çözüm. Aynı yöntem üzerinde çalışıyordum, ancak her bir yinelemede faktoringi hesaplıyordum; yaklaşımını uygulamak +1zaten beni birkaç byte kurtardı .
Shaggy

1
True-in-1 sürümünüz için, temel hal koşulunua sayı alarak kısaltabilirsiniz .
xnor

@xnor ben `` düşünce değil olurdu -aiçinde -pgüzel bir numara :) olduğunu, ``
Lynn

Eğer N eşit değerlerle sınırlandırılmışsa ispat hala geçerliyse, bu 45 baytlık çözüm her zaman bir sayı verir.
negatif yedi

9

Brachylog , 3 5 bayt

ℕ₁ḟa₀

Çevrimiçi deneyin!

Çıktı değişkeni üzerinden girdi alır ve girdi değişkeni üzerinden çıktı verir. (Diğer taraftan, girişin faktörünün rastgele öneklerini buluyor, ki bu hiç de ilginç değil.) TIO'daki ikinci-son test davasında zaman aşımına uğradı, ancak sonuncusu iyi gidiyor . Bunu yazarken birkaç dakika boyunca dizüstü bilgisayarımda 841'de kullanıyorum ve aslında henüz bir cevap bulamadım, ama buna inancım var.

         The (implicit) output variable
   a₀    is a prefix of
  ḟ      the factorial of
         the (implicit) input variable
ℕ₁       which is a positive integer.

Tek girdi ḟa₀çalışmadığı için 1, 1 ise pozitif bir ön ekdir! = 1, aynı şekilde 1|ḟa₀çalışır.

Ayrıca, bu düzenleme itibariyle, 841 yaklaşık üç saattir çalışıyor ve hala bir çıktı üretmedi. Sanırım 1 ile 12745 arasındaki her tamsayı faktörü hesaplamak tam olarak hızlı değil.


2
Brachylog'da faktör belirleyicisinin uygulanması, biraz verimli bir şekilde her iki şekilde de kullanılabilmesi için biraz sarsılmıştır. Biri faktoringi hesaplamak için çok daha hızlı bir algoritma uygulayabilir, ancak öbür tarafa koşmak son derece yavaştır (yani faktörden orijinal sayıyı bulmak).
Nisanda

Oh harika! Bunun kaynağını inceleyerek, tüm bunların ne yaptığını söyleyemem, ama size çok iyi düşünceler verdiğinizi söyleyebilirim.
İlişkisi Olmayan Dize

7

C ++ (gcc) , 107 95 bayt, kullanma -lgmpve-lgmpxx

Aptalca aksiliklere işaret ettikleri için yorum yapan kişilere teşekkür ederiz.

#import<gmpxx.h>
auto f(auto A){mpz_class n,x=1,z;for(;z!=A;)for(z=x*=++n;z>A;z/=10);return n;}

Çevrimiçi deneyin!

n! hesaplar ! çarparak (n-1)!ile n , daha sonra tekrar tekrar ile böler 10 geçirilen tamsayı daha uzun büyük olana kadar. Bu noktada, döngü faktörü geçen tamsayıya eşitse sona erer veya aksi takdirde n ilerler .


Artık bayrak saymaya gerek yok, bu yüzden 107bayt.
AdmBorkBork

Neden daha önce ikinci noktalı virgül gerekiyor return?
Ruslan

İşlev için tek bir karakter adı kullanabilir, birkaç bayt kaydedebilirsiniz.
Shaggy



2

Pyth - 8 bayt

f!x`.!Tz

f              filter. With no second arg, it searches 1.. for first truthy
 !             logical not, here it checks for zero
  x    z       indexof. z is input as string
   `           string repr
    .!T        Factorial of lambda var

Çevrimiçi deneyin .


2

JavaScript, 47 43 bayt

Bir BigInt olarak çıktı alın.

n=>(g=x=>`${x}`.search(n)?g(x*++i):i)(i=1n)

Çevrimiçi Deneyin!

Lynn'in her yinelemede hesaplamak yerine faktörlüğü "inşa etme" yaklaşımını benimseyerek birkaç bayt kurtardı, bu yüzden lütfen bunu yeniliyorsanız çözümünü de geçersiz kılın.


Ne yazık ki, _Ês bU}f1Japt'de işe yaramazsa
Ignorance'ın Uygulaması

@EododimentoFanayi, evet, bende de vardı. Sonra boşluğu kaldırabilirsiniz s.
Shaggy

@EmbodimentofIgnorance, 1eğer 0için iade edilebilir ise kaldırabilirsiniz n=1.
Shaggy

3 bayt daha az:x=i=1n;f=n=>`${x*=++i}`.search(n)?f(n):i
vrugtehagel

@vrugtehagel, bu tekrar kullanılamaz.
Shaggy


1

Jöle , 16 bayt

‘ɼ!³;D®ß⁼Lḣ@¥¥/?

Çevrimiçi deneyin!

açıklama

‘ɼ                | Increment the register (initially 0)
  !               | Factorial
   ³;             | Prepend the input
     D            | Convert to decimal digits
        ⁼   ¥¥/?  | If the input diguts are equal to...
         Lḣ@      | The same number of diguts from the head of the factorial
      ®           | Return the register
       ß          | Otherwise run the link again

1

Perl 6 , 23 bayt

{+([\*](1..*).../^$_/)}

Çevrimiçi deneyin!

açıklama

{                     }  # Anonymous code block
   [\*](1..*)            # From the infinite list of factorials
             ...         # Take up to the first element
                /^$_/    # That starts with the input
 +(                  )   # And return the length of the sequence

1

Kömür , 16 bayt

⊞υ¹W⌕IΠυθ⊞υLυI⊟υ

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

⊞υ¹

İtin 1bir tanımlanmış ürün ile başlar, böylece boş listeye.

W⌕IΠυθ

Giriş, listenin ürününün başında bulunamıyorken tekrarlayın ...

⊞υLυ

... listenin uzunluğunu kendisine itiniz.

I⊟υ

Listeye basılan son değeri yazdır.



1

J , 28 22 bayt

FrownyFrog sayesinde -6 bayt

(]+1-0{(E.&":!))^:_&1x

Çevrimiçi deneyin!

orijinal cevap J , 28 bayt

>:@]^:(-.@{.@E.&":!)^:_ x:@1

Çevrimiçi deneyin!

  • >:@] ... x:@1genişletilmiş bir hassasiyetle başlayarak 1, artmaya devam edin ...
  • -.@ durum böyle değil ...
  • {.@ ilk karaağaç bir başlangıç ​​maçı ...
  • E.&":Tüm alt dizgi (her iki argüman dizildikten sonra &":) içindeki orijinal girişi aramayla eşleşir ...
  • ! Arttığımız sayının faktörü

(]+1-0{(E.&":!))^:_&1x
FrownyFrog

Geleneksel olanı önlemek için "sabit nokta" yu kullanmayı seviyorum.
Jonah

1

C (gcc) -lgmp, 161 bayt

#include"gmp.h"
f(a,n,_,b)char*a,*b;mpz_t n,_;{for(mpz_init_set_si(n,1),mpz_init_set(_,n);b=mpz_get_str(0,10,_),strstr(b,a)-b;mpz_add_ui(n,n,1),mpz_mul(_,_,n));}

Çevrimiçi deneyin!


Öner strstr(b=mpz_get_str(0,10,_),a)-b;mpz_mul(_,_,n))mpz_add_ui(n,n,1)yerineb=mpz_get_str(0,10,_),strstr(b,a)-b;mpz_add_ui(n,n,1),mpz_mul(_,_,n))
ceilingcat



0

Temiz , 88 bayt

import StdEnv,Data.Integer,Text
$a=hd[n\\n<-[a/a..]|startsWith(""<+a)(""<+prod[one..n])]

Çevrimiçi deneyin!

Tanımlar $ :: Integer -> Integer.

Data.IntegerIO için isteğe bağlı boyut tam sayılarını kullanır .





0

Haskell, 89 bayt

import Data.List
a x=head$filter(isPrefixOf$show x)$((show.product.(\x->[1..x]))<$>[1..])

İstenilen ithalatı nasıl atlayacağınızı bilen biri varsa, bana bildirin.


N-!N-
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.