Eksik sayı nedir (9 ile bölünebilirlik)


22

Meydan okuma

9 ve bir eksik rakam ile bölünebilen bir tam sayı verilirse, eksik rakamı bulun.

Eksik rakam, tutarlı olduğu sürece 0-9 rakamları dışındaki herhangi bir karakterle gösterilebilir.

Eğer eksik rakam 0 veya 9 ise, bunu belirtmek için birşeyler çıktısını alın.

Kullanıcının yalnızca bir tane eksik rakam ve bir tane rakam girecek kadar akıllı olduğunu varsayalım

Test Kılıfları

Test durumlarında eksik rakam bir soru işareti ile gösterilir.

123? -> 3
?999 -> 0 or 9
?0023 -> 4
000?1 -> 8

2
Çıktı yapabilir miyiz 0? Peki ya [0, 9] (dizi veya 2 sayının listesi)?
user202729

1
0 ya da 9 yerine demek istediğinizi varsayarsak, bu koşulu da olabileceğini gösteren herhangi bir değer olarak düzenleyeceğimi düşünüyorum. Teşekkür ederim!
NK1406

3
Sadece ?olası bir girdi mi?
xnor

2
Baştaki sıfırları desteklemek gerekli midir?
mbomb007

1
@ NK1406 Önde gelen sıfırlar gerektirmesini önermiyorum, en azından bazı diller için onu desteklemek için gereken ek baytları görebiliyorum.
Outgolfer Erik,

Yanıtlar:



9

Alice , 12 bayt

/o&
\i@/+R9%

Çevrimiçi deneyin!

Çıkışlar 0sonucu 0 ya da 9 ya da olabilirler.

açıklama

/   Switch to Ordinal mode.
i   Read all input as a string.
&   Fold the next operation over the characters of this strings.
/   Switch to Cardinal mode (not an operation).
+   Add. Implicitly converts each character to the integer value it represents
    and adds it to the top of the stack. The top of the stack is initially, implicitly
    zero. When the character is "?", it is simply discarded, which adds the top of
    the stack to another implicit zero beneath, so the "?" is effectively skipped.
R   Negate. Multiplies the sum by -1.
9%  Modulo 9. This gives the result.
\   Switch to Ordinal mode.
o   Implicitly convert the result to a string and print it.
@   Terminate the program.

&Ana modu en fazla 2 tamsayı itibarıyla orijinal giriş yorumlar için, çıkarılabilir.
Nitrodon

6

JavaScript (ES6), 40 bayt

0 veya 9 olabilirse 9 çıkışı verir.

f=_=>9-([..._].reduce((a,b)=>a+~~b,0)%9)

2
PPCG'ye Hoşgeldiniz! Güzel ilk mesaj!
Rɪᴋᴇʀ

2
Saymana gerek yok f=; adsız işlevler tamamen geçerlidir.
Shaggy

En dış parantezler, operatör önceliği nedeniyle gerekli değildir;)
Shieru Asakoto

5

Japt, 7 bayt

Birkaç çözüm denedim, ancak en kestirme ?başlangıçta değiştirmemize gerek kalmaması hariç çoğu kişiye benzerdi .

Sayısal olmayan karakterleri eksik basamak olarak alabilir. 0Çözümün bu olabileceği zaman çıktılar 9.

¬x*J u9

Dene


açıklama

Dizenin örtük girişi U. ¬tek tek karakter dizisine ayrılır, xsayısal olmayan öğeleri yok sayarak diziyi azaltır, *Jher öğeyi -1 ile çarpar u9ve sonucun pozitif modülünü alır.


5

JavaScript (ES6), 18 bayt

Bir +eksik rakam olarak bekler . 0 veya 99 için döndürür .

s=>9-eval(9+s+9)%9

Test durumları



4

Python 2 , 44 41 35 bayt

RiaD sayesinde -6 bayt

lambda n:-sum(ord(c)-3for c in n)%9

Çevrimiçi deneyin!

]Eksik sayı için kullanıcılar .
Çıkışlar 0eksik haneli 0 veya 9 olabilseydim.


Hm, tüm test vakalarında denedim, o 0zamandan beri anlamlı olan belirsiz bir durum için çıktılar9%9 == 0
kabarık

İhtiyacınız olmayan int (c) -> ord (c) - 3 yaparsanız, kötü karakter için uygun karakteri seçerseniz
RiaD

3

Pyth, 9 7 bayt

%_s-Qd9

Sınırlayıcı olarak boşluk kullanır ve sonuç 0 ya da 9 olabilirse 0 değerini döndürür.

Çevrimiçi deneyin

açıklama

%_s-Qd9
   -Qd   Remove the space from the input.
  s      Convert it to an integer.
%_    9  Negate mod 9.

3

Prolog (SWI) , 59 bayt

0*[].
X*[H|T]:-between(0,9,H),U is mod(X+H,9),U*T.
+X:-0*X.

Çevrimiçi deneyin!

Mantıksal programlama için Yay!

açıklama

İlk önce *sıfıra ve boş listeye uygulandığında geçerli olan bir belirtme yaparız . Tahminimiz ayrıca listenin önü 0 ile 9 arasındayken ve öncü basamak mod 9'u eklediğimizde yüklem tutar.

Daha sonra ilk argüman olarak +sadece bu yordam 0olarak tanımladık . Dijital toplamın 9'un katı olmasını istiyoruz.

Prolog, aslında bizim için çözüm bulma konusundaki tüm heyecan verici çalışmaları yapıyor.


3

Befunge-93 , 16 bayt

1+!_#@3#.--9%~:#

Çevrimiçi deneyin!

James Holderness 'Befunge'ın bir satırlık versiyonu, iki byte'ı tıraş etmeyi başardı . Bu esasen kodu bir satıra sıkıştırır, yönü tersine çevirir ve Befunge'nin hattın sonunda atlamadığı gerçeğinden yararlanır. Bir açıklama ile ayrı bir cevap göndermemi önerdi. Kod, eksik basamağı temsil eden bir * alır ve 0 veya 9 için bir 9 verir.

Nasıl çalışır

1+!_  3  --9% Initialises the pointer going right and initialises the digitsum with 3

1+!_         ~: Gets input and checks whether it is end of input (-1)

      3  - Subtract three from the input. 
           This turns the ASCII values of digits into their mod 9 equivalent ("0"(48)=>45(mod 9)=>0)

          -9% Subtract the value from the digitsum and mod it with 9
              This keeps the digitsum as a negative digit greater than -9
              Repeat this until the input ends

Now this is where it gets tricky.
At the end of input, the stack looks like this:
  -(Digitsum%9), Copy of EOF input (-1)
The pointer is moving left from the _
 +!_ Invert the -1 to get 0 and add it to the digitsum (does nothing but get rid of the -1)
1           %~ Adds 1 mod -1 (no input) = 0 to the stack
         --9 Subtracts 9 from 0, yielding -9 and subtracts that from the digitsum. 
             This makes the digitsum positive and equal to 9-(digitsum%9), our desired value
     @  . Finally, print and exit

* (ASCII değer 42), eksik karakter olarak seçildi, çünkü digitsumun ilk değerini (3) telafi etti.


Bundan hala baytları sıkmaya devam edebileceğine şaşırdım. Aferin!
James Holderness,

2

LaTeX, birçok bayt ( 1000 628 614)

\RequirePackage{expl3}
\ExplSyntaxOn
\tl_new:N \l_divnine_input_tl
\int_new:N \l_divnine_sum_int
\def \getnum {
  \typein [ \l_divnine_input_tl ] { Input\space a\space number }
  \tl_map_function:NN \l_divnine_input_tl \divnine_sum:n
  \int_set:Nn \l_tmpa_int { 9 - \int_mod:nn { \l_divnine_sum_int } { 9 } }
  \typeout
    { The\space missing\space digit\space is:\space
      \int_use:N \l_tmpa_int
      \int_compare:nNnT { \l_tmpa_int } = { 0 } { \space or\space 9 }
    }
}
\cs_new:Nn \divnine_sum:n {
  \regex_match:nnT { \d } { #1 } { \int_add:Nn \l_divnine_sum_int { #1 } }
}
\ExplSyntaxOff
\getnum
\stop

LaTeX, okunaksız ( 348 334 bayt)

\RequirePackage{expl3}\ExplSyntaxOn\int_new:N\1\tl_new:N\2\def\3{\typein[\2]{Input\space a\space number}\tl_map_function:NN\2\4\int_set:Nn\1{9-\int_mod:nn{\1}{9}}\typeout{The\space missing\space digit\space is:\space\int_use:N\1\int_compare:nNnT{\1}={0}{\space or\space9}}}\def\4#1{\regex_match:nnT{\d}{#1}{\int_add:Nn\1{#1}}}\3\stop

LaTeX, 132 bayt

\RequirePackage{expl3}\typein[\1].\newcount\2{\ExplSyntaxOn\int_gset:Nn\2{9-\int_mod:nn\19}}\typeout{\the\2 \ifnum\2=9or 0\fi}\stop

Bu kodda yalnızca boşluk bilinmeyen basamak olarak kabul edilir.


2

J , 14 12 bayt

@BceBussiere sayesinde -2 bayt

9|9-[:+/"."0

Gerçekten neden 0 olarak "."0yorumlandığını bilmiyorum ?ama bunu tercümanımda ve TIO’da da yapıyor, bu yüzden sorgulamayacağım. (Güncelleme: neden bir açıklama için yorumlara bakınız).

Bu yaklaşım çok basit bir şekilde rakamların toplamını alır, 9'dan çıkartarak onu olumsuzlar ve modulo 9'u alır.

Çevrimiçi deneyin!



1
Ayrıca, "." Yorumunu yapmıyor mu? 0 olarak boş bir liste olarak yorumlanır.J uygun hale getirmek için, bu durumda (sayısal bir dizi) 0 olan dolgu karakterleriyle doldurur.
Bolce Bussiere

2

Jöle , 11 9 6 bayt

|0SN%9

açıklama

|0     # Read input while removing non-digits (question marks) and removing leading zeros
  S    # Sum the digits
   N   # Negate
    %9 # Mod by 9

0 çıkışı, sonucun 0 veya 9 olabileceği anlamına gelir.

Çevrimiçi deneyin!

Bay Xcoder sayesinde 2 bayt kurtarıldı . Değerlendirme sırasında Her hızlı ( ) kullanıldığında, sayıyı sayılara bölmek gereksizdir.

Dennis sayesinde 3 byte kurtarıldı . Baştaki sıfırları ve olmayan rakamları kaldırırken girişi elle sayı olarak ayrıştırmak yerine, 0 biti girebilir.


9 bayt . Jelly golfüne hoş geldiniz!
Bay Xcoder

Bu, cevabın 0 veya 9 olabileceği durumla ilgilenmez. Ayrıca, Jelly'e hoş geldiniz. Ben de yeniyim ama şu ana kadar çok eğlenceliydi.
dylnan,

@dylnan bu Ele
Poke

@Poke oh, nevermind, ihtiyacın değiştirildiğini
görmedim

|0yerine çalışır fØDV€.
Dennis,


1

Befunge-93 (PyFunge) , 22 21 bayt

?Bulunamayan basamağı göstermek için kullanmaya ihtiyacım olmadığının farkına vardım , bu yüzden 48'i çıkardıktan sonra 9 katı olan bir tane kullandım: x
Bu, golf oynamama izin verdi 3+, ancak sadece 1 bayt kurtardı. koşulludan önceki ilk satır :(


Benim Befunge-98 Yanıta portu:
biz EOF, ulaştınız eğer daha 5 kontrol etmek için bayt
1 daha bayt 48 (itmek "0"vs '0),
ile cevap yazdırmak için 1 byte daha .@,
ve 1 byte daha saniyede çünkü Satır
toplam 8 baytlık daha fazla alana sahiptir .

~:0`!#|_"0"-+
 @.%9-<

Çevrimiçi deneyin!

Çıkışlar 0eksik haneli 0 veya 9 olabilseydim.

Bu sadece PyFunge tercümanında aşağıda açıklanan sebeplerden dolayı çalışır.

açıklama

Bu açıklamanın çoğu, Befunge-98 açıklamamın kopyalarına yapıştırılmıştır , çünkü bu program buna çok benzer. utanmaz fiş

Programın ilk satırında, ASCII değeri nedeniyle 72 gibi işlem gören x dahil rakamları toplarız. Bununla birlikte, toplam 9 ile modüle edildiğinde toplamı aynı olacak, bu yüzden bu konu dışı.

~:0`!#|_"0"-+    THE FIRST LINE
~                Gets a character from input - If it is negative, we've reached EOF
 :0`!            Pushes 0 if the character is positive, 0 otherwise
     #|_         Goes to the next line if the value if 0
                     This also gets the negative value off the stack by using a |
        "0"-     Subtracts 48 to account for taking in ASCII values
            +    Adds this adjusted value to the sum

Eğer sadece 9 ile modlanmış olsaydık, yanlış rakamla kalırdık, çünkü istiyoruz 9 - (sum % 9). Bununla birlikte, 9\-kalanı 9'dan çıkaracak olandan daha iyisini yapabiliriz : 9'u modlamadan önce toplamı negatif yaparsak, 9 - (sum % 9)bazı tercümanlara eşdeğer bir pozitif sonuç elde edeceğiz . Bu, PyFunge tercümanlarını hem Befunge 93 hem de 98 için kullanmamızı gerektiren şeydi, çünkü bunu yapan TIO'da yalnızca biri. Diğerleri bize 0 ile 8 arasında -8 ile 8 arasında bir değer veriyor.

 @.%9-<    THE SECOND LINE
      <    Redirects the IP onto this line
     -     Subtracts the sum from an implicit 0, making it negative
   %9      Mods the sum by 9
 @.        Prints the digit and exits

Güzel cevap! Ekstra kontrolü önlemek için, eksik rakam için özel bir karakter kullanmayı düşünmeyin. Umarım güncellenmiş cevabımda bu numarayı çalmamın sakıncası yoktur - aynı tercümanı referans tercümanında çalışıp çalışmadığımı görmek istedim.
James Holderness

1

Befunge-98 (PyFunge) , 15 13 bayt

?Bulunamayan basamağı göstermek için kullanmak zorunda olmadığımı fark ettim , bu yüzden 48'i çıkardıktan sonra 9 katı olan bir tane kullandım: x
Bu, golf oynamama izin verdi 3+.

#v~'0-+
q>-9%

Çevrimiçi deneyin!

Bir xeksik rakam olarak kullanır , çünkü ASCII değeri 48 çıkarıldıktan sonra 9 ile bölünebilir (ve genelde matematikte değişken olarak kullanılır).

Çıkış kodu üzerinden çıkışlar (çünkü qbir bayttan daha kısadır .@) Eksik rakam 0 veya 9 ise
çıkışlar 0.

Bu sadece PyFunge tercümanında aşağıda açıklanan sebeplerden dolayı çalışır.

açıklama

Programın ilk satırında xASCII değeri nedeniyle 72 gibi işlem gören rakamlar da dahil olmak üzere rakamları topladık. Bununla birlikte, toplam 9 ile modüle edildiğinde toplamı aynı olacak, bu yüzden bu konu dışı.

#v~'0-+    THE FIRST LINE
#v~        Pushes the next character from input, and goes to the second line on EOF
   '0-     Subtracts 48 to account for taking in ASCII values
      +    Adds this adjusted value to the sum

Eğer sadece 9 tarafından modlanmış olsaydık, yanlış rakamla kalırdık, çünkü istiyoruz 9 - (sum % 9). Bununla birlikte, 9\-kalanı 9'dan çıkaracak olandan daha iyisini yapabiliriz : 9'u modlamadan önce toplamı negatif yaparsak, 9 - (sum % 9) bazı tercümanlara eşdeğer bir pozitif sonuç elde edeceğiz . Bu, PyFunge tercümanlarını hem Befunge 93 hem de 98 için kullanmamızı gerektiren şeydi, çünkü bunu yapan TIO'da yalnızca biri. Diğerleri bize 0 ile 8 arasında -8 ile 8 arasında bir değer veriyor.

q>-9%    THE SECOND LINE
 >       Redirects the IP onto this line
  -      Subtracts the sum from an implicit 0, making it negative
   9%    Mods the sum by 9
q        Outputs via exit code, ending the program

1

Ruby , 22 bayt

Kullanım Alanları '(Buna sahip olan herhangi bir karakter, 0"0" ile bölünebilir, 0kendisi de dahil ).

Bir çıktısı 0ya 0da anlamına gelir 9.

p -(gets.sum+6*~/$/)%9

Çevrimiçi deneyin!

açıklama

p     # print after inspecting
  -(  # unary negative, for reversing result of modulus (a-b%a)
    gets.sum # ascii value of string
    + 6*~/$/ # add six for each size (in chars) of input, so "0" translates to 0
  )%9 # mod 9
      # find remainder after dividing 9
      # except it's inverted so it's remainder to add to divide 9


1

Befunge-93, 28 27 19 18 bayt

Credit , PyFunge'nin cevabı , ASCII değerinin dokuzun katı olduğundan emin olmanız durumunda, eksik rakam karakterleri için özel bir kontrole ihtiyacınız olmadığını gösteren Mistah Figgins'e gitmeli .

Ek olarak , karakterleri tamamen sayısal eşdeğerlerine dönüştürmeniz gerekmediğini ve üs 9'a göre olan bir değer elde etmek için basitçe 3 değerini çıkarabilen Jo King'e teşekkür ederiz (ASCII 0eksi 3 45, 9'un katı) .

3_v#`0:~--
%9_@.+9

Çevrimiçi deneyin!

Bunun çalışması *için, eksik rakam için karakteri kullanmanız gerekir (aynı zamanda çalışabilecek başkaları da vardır, ama en iyisidir).

Çıkışlar 9eksik haneli 0 veya 9 olabilseydim.

açıklama

3             Push 3 onto the stack.
 _            Since this is non-zero, drop the 3 and branch left.
3             Now executing right to left, push 3 again.
        --    Negate twice, leaving the value unchanged as our starting sum.

       ~      Now we start the main loop, reading a character from stdin.
    `0:       Duplicate and check if it's > 0, i.e. not end-of-stream.
 _ #          If so, continue to the left.
3        -    Subtract 3 to make the number relative to base 9.
        -     Then subtract it from the total, and repeat the loop.

  v           Once we reach the end of the input, we go down.
  _           Drop the EOF character from the stack and go left.
%9   +9       Mod the total with 9, and add 9.
   @.         Output the result and exit.

Temel olarak, tüm basamakların toplamını hesaplıyoruz, artı basamak başına 45 (9 ile mod değiştirdiğimizde sonuçta iptal edilecek). Bu toplam 3'ten (başlangıç ​​toplamımız) çıkarılır ve ek bir 39 eksik rakamla (ASCII *eksi üç) çıkarılır . Yine, 3 eksi 39, 9'un katıdır, yani 9 ile mod yaptığımızda iptal edilir.

Sonunda, tüm basamakların negatif toplamını hesaplıyoruz, mod 9, artı 9, yani

9 - (digitsum % 9)

Ve bu bize eksik rakamı verir.


-1 yerine 48 yerine 3 çıkarırsanız. Modülü 9 eklemeye gerek duyarak çoğu iptal edilir
Jo King

@JoKing Teşekkürler! Bunu asla düşünemezdim. Yazık hala + 9'a ihtiyacımız var, ama ondan kurtulmanın bir yolunu göremiyorum.
James Holderness

Bir bayt daha bir satıra sıkıştırılarak kaldırılabilir ! Her döngünün toplamını% 9 olarak değiştirdim ve daha sonra 9'u tekrar kullanmaya başladım.
Jo King,

@JoKing Sadece bir bayt daha kaydettiğimi biliyorum ama bu harika! Bunu yeni bir cevap olarak bildirmeye değer. Kesinlikle başka bir şey yoksa oyumu alırsın.
James Holderness

Gönderdim ! Son bir byte'ı da tıraş etmeyi başardık! Sanırım bu yapabileceğim son kişi
Jo King,


0

PowerShell , 40 bayt

param($a)0..9|?{!(($a-replace'x',$_)%9)}

Çevrimiçi deneyin! veya Tüm test durumlarını doğrula

Gibi '123x'girdi alır $a. Madde ile eşleşen bu tamsayıları çıkarmak 0için bir dizi oluşturur 9ve kullanır Where-Object(burada kısaltılır |?). Yan tümce alır $a, geçerli sayı ile -replacedeğiştirmek için bir regex gerçekleştirir ve mod 9 ile alır . Böylece, 9 eşit şekilde bölünürse, bu sıfır olacaktır. Sıfırlar gerçeğini ve diğer her şeyi falsey yapan Boolean-not'u alıyoruz, böylece Where-Object deyimini yerine getiriyor. Bu sonuçlar boru hattında bırakıldı ve çıktılar kapalı.x$_%9



0

Retina , 35 34 25 bayt

Eğer ?olabilir 0 or 9, sonuç olarak gösterilir 9.

.
$*
1{9}

^
9$*;
+`;1

.

Çevrimiçi deneyin

açıklama

.       Sum of the digits in unary + 1
$*
1{9}    Modulo 9

^       Prepend 9 semicolons, for subtracting
9$*;
+`;1    Subtract from 9

.       Back to decimal

\dKutunun sadece .ve sonraki satırda değiştirilebileceğine inanıyorum $*.
Kritixi Lithos,

Ah doğru. Bunu ?yazarken henüz çıkarmamıştım .
mbomb007



@totallyhuman Ah, evet. Daha önceki bir sürümden başka bir kalıntı.
mbomb007


0

Tcl, 53 bayt

puts [expr 9-([regsub -all (\\d)\\D? 0$argv +\\1])%9]

Diğer cevaplarda olduğu gibi, bu açıkça “0 veya 9” demediği için daha kısa yapılır.
Bunun yerine, “9” sonucu ya 0 ya da 9 anlamına gelir.

Çevrimiçi deneyin!

açıklama

Oldukça basit çalışıyor. Düzenli bir ifade kullanır:

  • argümanı bireysel sayılara bölmek
  • Basamak olmayan soru işaretlerini kaldırın
  • Rakamları artı işaretleriyle serpiştirin

Daha sonra, 9 - (sum_of_digits mod 9) 'u 1..9 değerinde bir son değere varmak için değerlendirir, o zaman ki puts.

Önde gelen 0 (inç 0$argv), soru işaretinin girişte önce gelmesi durumunda gereklidir; Dönüştürülen dizideki öncü artı işareti için sorun değildir expr.




0

brainfuck , 50 bayt

+>,[---[<-[<<]>[<+++++++++<]>>-],]-[<+>-----]<---.

Çevrimiçi deneyin!

0 veya 9 için 9 yazdırır. Eksik karakter ile gösterilir:

Nasıl çalışır

Tape Format:
    0 Total Input 0

The total is represented as 9-digitSum%9

+>,[ Start loop with 1 as the total
    --- Subtract 3 from the inputted byte to make the value%9 equal to the digit
    [   While the input byte exists
      <-                 Decrement the total
      [<<]>[<+++++++++<] If the total is 0, reset it to 9
      >>-                Decrement the input byte
    ]
,] Continue loop until there is no input
-[<+>-----]<---. Add 48 to the total to convert the digit to the ascii value and output it

Kayıp karakterin 9, 4'lük bir mod 9'a sahip bir karakter olması gerekir, çünkü toplamı normal rakamlardan 3, toplamı 1 olarak başlatmak için + 1 çıkarırız.

Bir yandan not olarak, golf oynamak adına kodda çok fazla verimsizlik var, çünkü her rakam 3 yerine 48 çıkardığımda sadece bir kez yerine her biri toplam 5 kez sıfırlayacaktır.


0

> <> , 35 33 25 21 15 bayt

Bir çıktı 0, sonucun 0 veya 9 olabileceği anlamına gelir .

0i:&0(?n&3--9%!

Çevrimiçi deneyin!

Eksik haneleri temsil etmek için kullanarak Jo King sayesinde 6 byte kurtarıldı '.


Bir 'karakter yerine bir karakter kullanıyorsanız 15 bayt?
Jo King

0

Java 8, 36 34 bayt

s->9-s.map(c->c>57?0:c-48).sum()%9

İade 9hem 0ve 9geçerlidir.

Açıklama:

Çevrimiçi deneyin.

s->                               // Method with IntStream parameter and int return-type
   9-                             //  Return 9, minus:
     s.map(c->c>57?0:c-48).sum()  //   The sum of the digits (ignoring the question mark)
     %9                           //   modulo-9
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.