Rosetta Stone Challenge: Bir dizinin kuralını bulun


15

Rosetta Stone Challenge'ın hedefi mümkün olduğunca çok dilde çözüm yazmaktır. Programlama çokdilliliğinizi gösterin!

Meydan okuma

Zorluklarınız, sayıların bir listesini girecek ve serideki birbirini takip eden her sayıyı üretmek için kullanılan kuralı mümkün olduğunca çok programlama dilinde çıkaracak bir program uygulamaktır . Çoğunlukla bir dil vitrini olduğundan, dilinizin sahip olduğu her türlü standart kitaplık işlevini kullanmanıza izin verilir.

"Seri" nedir?

Seri, tamsayıların sıralı bir listesidir. Serideki birbirini takip eden her sayı, serideki önceki sayıya basit bir kural uygulanarak oluşturulabilir. Bu zorlukta kural, sayının bir sabitle çarpılması ve ardından ikinci bir sabitin eklenmesinden oluşur. Her iki sabit de herhangi bir tam sayı olabilir. Bu zorluğun amacı bu iki sabitin çıktısını almaktır.

Seri 2 5 11için kural şu ​​şekilde yazılabilir:2 1 . Bu, her sayının önceki sayı, çarpı 2, artı 1 olduğu anlamına gelir. Önemli bir gerçek, çoğu serinin tam olarak bir kuralı olmasıdır. Bazı serilerin sonsuz bir sayısı vardır veya hiç yoktur, ancak bununla uğraşmak zorunda kalmazsınız.

Giriş

Girdi, dizideki sayılar olan üç farklı tamsayının bir listesi olacaktır. Sayılar boşluk, virgül veya satır sonu olabilir, ancak lütfen hangisini belirtin. Bu dil konusunda esnek olacağım çünkü bazı dillerde giriş kısıtlamaları olabilir. Dört girdi örneği:

0 7 14
2 5 11
2 0 -4
5 -19  77

Çıktı

Çıktı, seriyi oluşturmak için kullanılan kuralı temsil eden iki tamsayı olacaktır. İlk sayı çarpım sabiti, ikinci sayı ise katkı sabiti olacaktır. Çıktının biçimlendirmesi boşluk, virgül veya satırsonu olabilir. Ben de bu sınırlama konusunda esnekim. Çıktının karşılık gelen örnekleri:

1 7
2 1
2 -4
-4 1

Amaç Kazanma Kriteri

Objektif bir kazanma ölçütüne gelince, işte: Her dil, en kısa girişi kimin yazabileceği konusunda ayrı bir yarışmadır, ancak genel kazanan, bu alt yarışmaların çoğunu kazanan kişi olacaktır. Bu, nadir olmayan birçok dilde cevap veren bir kişinin avantaj sağlayabileceği anlamına gelir. Code-golf, bir dilde birden fazla çözüm olduğunda çoğunlukla bir çığır açıcıdır: en kısa programa sahip olan kişi bu dil için kredi alır.

Kurallar, Kısıtlamalar ve Notlar

Programınız 9 Nisan 2012 tarihinden önce mevcut olan herhangi bir dilde yazılabilir. Ayrıca, daha nadir / ezoterik dillerin bazılarında yazılan bazı yanıtları doğrulamak için topluluğa güvenmek zorunda kalacağım, çünkü test edemiyorum onlar.


Mevcut Büyük Şerit

Bu bölüm, dillerin sayısını ve her birinin önde gelenlerini göstermek için periyodik olarak güncellenecektir.

  • AWK (32) - mellamokb
  • bash (31) - Peter Taylor
  • Befunge (29) - Howard
  • bc (39) - kernigh
  • beyin sikişi (174) - CMP
  • C (78) - l0n3_shArk
  • C ++ (96) - artık
  • Yaygın Lisp (88) - kernigh
  • Cray Şapeli (59) - Kyle Kanos
  • csh (86) - kernigh
  • Cuda (301) - Leftaroundabout
  • dc (30) - kernigh
  • DOS BATCH (54) - mellamokb
  • Öğe (27) - Howard
  • es (95) - kernigh
  • Faktör (138) - kernigh
  • Felix (86) - Kirbyfan64sos
  • Fortran (44) - Kyle Kanos
  • Git (101) - Howard
  • GolfScript (16) - Howard
  • Golflua (44) - Kyle Kanos
  • Haskell (35) - Leftaroundabout
  • J (23) - Gareth
  • Java (141) - Howard
  • JavaScript (47) - mellamokb
  • Julia (71) - ML
  • Lua (51) - Howard
  • Merkür (319) - Leftaroundabout
  • MoonScript (48) - kirbyfan64sos
  • Nemrut (146) - leftaroundabout
  • Baykuş (22) - Res
  • Pascal (88) - Leftaroundabout
  • Perl (57) - Gareth
  • PHP (61) - mellamokb
  • PicoLisp (72) - kernigh
  • Piet (56) - ML
  • PostScript (61) - Howard
  • Python (40) - Howard
  • Q (36) - tmartin
  • QBasic (34) - mellamokb
  • R (50) - çözünürlük
  • Yakut (44) - Howard
  • Scala (102) - Gareth
  • SQL (57) - Aman ZeeK Verma
  • TI-83 TEMEL (25) - mellamokb
  • Sınırsız Kayıt Makinesi (285) - Paxinum
  • VBA (57) - Gaffi
  • Boşluk (123) - res
  • zsh (62) - kernigh

Mevcut Kullanıcı Sıralaması

Eşit dereceler alfabetik olarak sıralanır.

  1. Howard (9): Befunge (29), Element (27), Go (101), GolfScript (16), Java (141), Lua (51), PostScript, (61) Python, (40) Yakut (44)

  2. kernigh (8): bc (39), Ortak Lisp (88), csh (86), dc (30), es (95), Faktör (138), PicoLisp (72), zsh (62)

  3. solda (6): C ++ (96), Cuda (301), Haskell (35), Merkür (319), Nemrut (146), Pascal (88)

  4. mellamokb (6): AWK (32), DOS BATCH (54), JavaScript (47), PHP (61), QBasic (34), TI-83 BASIC (41)

  5. Gareth (3): J (23), Perl (57), Scala (102)

  6. Kyle Kanos (3): Cray Şapeli (59), Fortran (44), Golflua (44)

  7. res (3): Baykuş (22), R (50), Boşluk (123)

  8. kirbyfan64sos (2): Felix (86), MoonScript (48)

  9. ML (2): Julia (71), Piet (56)

  10. Aman Zeek verma (1): SQL (57)

  11. CMP (1): beyin sikişi (174)

  12. Gaffi (1): VBA (57)

  13. Ar0 (1): C (78)

  14. Paxinum (1): Sınırsız Kayıt Makinesi (285)

  15. Peter Taylor (1): bash (31)

  16. tmartin (1): Q (36)


İnsanlar gerçekten etiketleri veya diğer açıklamaları okumak gibi görünmüyor ...
9c12

@leftaroundabout: Bunu neden söyledin? (Örneğin) benim çözüm dizi girişi almaz ve daha sonra düzeltmek planlıyor farkında değilim. Ve şu anda birden fazla çözüm göndermek için çok tembelim :) Object Winning Criterio'ya göre, kod-golf aynı dilde iki gönderi için kravat kırıcı, bu nedenle kolay için karakter sayısını ekledim bir başkasının JavaScript çözümü yayınlaması durumunda başvuru. Aslında bu, bir sorunun hem code-golf ve code-challenge etiketlerini hak ettiği nadir anlardan biri olabilir .
mellamokb

Evet, haklısın: birisi alışılmadık olmayan dilleri de yapmak zorunda.
counterclockwis'i

3
Mevcut Lider Tablosunu
mellamokb

1
En yeni sürümüm ( jsfiddle.net/bk2WM/4 ), bir gönderiye kopyalayabileceğiniz / yapıştırabileceğiniz ham bir çıktı (textarea'da) sağlar ve yazımda yaptığım gibi biçimlendirir. Düzeni değiştirmekten / oynamaktan çekinmeyin.
mellamokb

Yanıtlar:


9

GolfScript, 16 karakter

~1$- 1$3$-/.p@*-

Girdi, boşlukla ayrılmış liste olarak verilir.

JavaScript, 56 karakter

p=prompt;x=alert;a=p();b=p();x(m=(p()-b)/(b-a));x(b-a*m)

Giriş istemi üzerine verilir.

Ruby, 44 karakter

a,b,c=eval("[#{gets}]");m=c-b;p m/=b-a,b-m*a

Girdi burada virgülle ayrılmış liste olarak verilir.

Python, 40 karakter

a,b,c=input();m=c-b;m/=b-a;print m,b-m*a

Giriş yine virgülle ayrılır.

Java, 141 karakter

enum E{E;static int s(){return new java.util.Scanner(System.in).nextInt();}{int a=s(),b=s(),m=s()-b;m/=b-a;System.out.print(m+" "+(b-a*m));}}

Girdi yeni satırla ayrıldı.

Lua, 51 karakter

r=io.read
a,b=r(),r()
m=(r()-b)/(b-a)
print(m,b-m*a)

Girdi yeni satırla ayrıldı.

Git, 101 karakter

package main
import"fmt"
var a,b,c int
func main(){fmt.Scan(&a,&b,&c)
c-=b
c/=b-a
fmt.Print(c,b-a*c)}

Girdi yeni satırla ayrıldı.

Fortran, 90 karakter

      PROGRAM X
      READ(*,*)I,J,K
      K=(K-J)/(J-I)
      WRITE(*,*)K,J-I*K
      END

Girdi yeni satırla ayrıldı.

Befunge, 29 karakter

&01p&:11p:&-01g11g-/:.01g*-.@

PostScript, 61 karakter

2 5 14
1 index sub 1 index 3 index sub idiv dup = 3 2 roll mul sub =

Baykuş, 23 karakter

<%<%<$-1`4'-/%.32)2'*-.

Girdi yeni satırla ayrıldı.

Öğe , 27 karakter

_-a;_3:'-_+"a~+/2:`a~*+\ ``

Girdi yeni satırla ayrıldı.


JavaScript çözümümün
utanmaz

1
Peki iki bu oyunu oynayabilir ...: P
mellamokb

@mellamokb İyi biri. Ama cevabınızı zaten aldım ;-) Peki bizim için geriye kalan: 48 karakteri yendi ...
Howard

2
Vay be, benim dilimde golf oynadın. Onur duydum. Ayrıca sizi dövmek zorunda hissediyorum. :)
PhiNotPi

1
Element çözümünüz hakkında, son `işaretinin gerekli olmadığı anlaşılıyor. Bu sizin tarafınızdan bir hata mı yoksa yorumcumda Pastebin'e gönderdiğim bir hata mı? Oh, 27 karakterli bir çözümüm var.
PhiNotPi

8

Brainfuck - 174

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

Piet - 82 mi?

Burada rekabetçi golf nasıl ölçüleceğinden emin değilim. Toplam görüntü boyutuyla (kod olarak) gideceğim Benimki 41x2: enter image description here

Befunge - 34

&00p&10p&10g-10g00g-/:.00g*10g\-.@

İngilizce - 278

The multiplier is the quotient of the difference of the second 
and third values and the second and first values. 
To generate a new term, multiply the current term by the multiplier
and add the difference of the first value and the product of the 
multiplier and the second value.

Bunun önemli olup olmadığından emin değilim, ama bir şans vereceğimi düşündüm. Basit bir algoritmayı bile doğru bir şekilde tanımlamak oldukça zordur. İngilizce'nin önceliği oluşturmak için bir çeşit gruplama sembolünü desteklemesini diliyorum.


Beni bir tercümana bağla (tüm dili anlayan ve sadece bu sorunu çözmeye yönelik değildir) ve kabul edebilirim.
PhiNotPi


1
Tamam, başka bir kişi LaTeX'te matematiksel bir kanıt yazdı. Sayılmadı, ancak çeşitliliğe katkıda bulunuyor.
PhiNotPi

Piet çözümünüzü npiet ile denersem şu sonucu alırım: D:\Software\Programming\Piet\npiet-1.3a-win32>npiet series2.png ? 5 ? -19 ? 77 05 Çözüm şu şekilde olmalı-4 1
ML

Gönderdiğiniz görüntü, sağ tarafta bir piksel (morina değil!) İle büyütülmedikçe çalışmaz. 461 piksel 11 ile bölünemez, bu arada oldukça sıradışı bir codel boyutu;)
ML

8

QBasic, 42

INPUT "",a,b,c
m=(c-b)/(b-a)
PRINT m;b-m*a

Virgülle giriş, boşluklu çıkışlar gerektirir (bu uygun mu?)


Civa, 319

:-module r.
:-interface.
:-import_module io,list,int,char,string.
:-pred main(io::di,io::uo)is det.
:-implementation.
main(!IO):-io.read_line_as_string(J,!IO),(if J=ok(I),[A,B,C]=list.map(string.det_to_int,string.words_separator(char.is_whitespace,I)),M=(C-B)/(B-A)then io.format("%d %d",[i(M),i(B-M*A)],!IO)else true).

Haskell, 85 81

f[a,b,c]|m<-(c-b)`div`(b-a)=[m,b-m*a]
main=getLine>>=mapM_ print.f.map read.words

Şimdi boşluklu girdiler, satırsonu ile çıktılar.


C, 80

main(a,b,c,m){scanf("%d %d %d",&a,&b,&c);m=(c-b)/(b-a);printf("%d %d",m,b-m*a);}

C ++, 96

#include<iostream>
main(){int a,b,c,m;std::cin>>a>>b>>c;m=(c-b)/(b-a);std::cout<<m<<' '<<b-m*a;}

Nemrut, 146

import strutils
var
 q:array[0..3,int]
 b,m:int
for i in 0..2:q[i]=ParseInt(readLine(stdin))
b=q[1]
m=(q[2]-b)div(b-q[0])
echo($m,",",$(b-m*q[0]))

Yeni satırlarla giriş, virgül ile çıkış.


Bu sayılmaz, ama yine de bir şekilde uyduğunu hissediyorum:

Matematiksel teorem, LaTeX'in 713 karakteri

\documentclass{article}\usepackage{amsmath}\usepackage{amsthm}\begin{document}Theorem: for a sequence $(a_i)_i$ of integers with $a_2\neq a_1$ where $a_3-a_2$ is divisible by $a_2-a_1$, $m:=\frac{a_3-a_2}{a_2-a_1},\ p:=a_2-m\cdot a_1$ give rise to a sequence\[b_i:=\begin{cases}a_1&\text{for }i=1\\b_{i-1}\cdot m+p&\text{else}\end{cases}\] such that $b_i=a_i\ \forall i\leq 3$.

Proof: $i=1$ is trivial,\[\begin{aligned}b_2=&b_1\cdot m+p=a_1\frac{a_3-a_2}{a_2-a_1}+a_2-\frac{a_1a_3-a_1a_2}{a_2-a_1}=a_2,\\b_3=&b_2\cdot m+p=\frac{a_2a_3-a_2^2}{a_2-a_1}+a_2-\frac{a_1a_3-a_2^2}{a_2-a_1}\\=&\frac{a_2a_3-a_1a_3+(a_2-a_1)a_2-a_2^2+a_1a_2}{a_2-a_1}\\=&\frac{a_2-a_1a_3+0}{a_2-a_1}=a_3.\end{aligned}\]\qed\end{document}

Output of the LaTeX mathematical-theorem solution


Biz :=tanımları yazarken ...

Pascal, 90 88

program r;var a,b,c:integer;begin;read(a,b,c);c-=b;c:=c div(b-a);write(c,' ',b-c*a);end.

Cuda, 301

#include<stdio.h>
__global__ void r(int*q){if(!(blockIdx.x|threadIdx.x)){q[1]-=*q;q[1]/=(*q-q[2]);*q-=q[1]*q[2];}}
main(){int p[3],*q;scanf("%d%d%d",p+2,p,p+1);cudaMalloc(&q,24);cudaMemcpy(q,p,24,cudaMemcpyHostToDevice);r<<<1,1>>>(q);cudaMemcpy(p,q,24,cudaMemcpyDeviceToHost);printf("%d %d",p[1],*p);}

1
Elimine ederek mve yeniden kullanarak C çözümüne iki karakter cve c-=b;c/=b-a;yerine kullanarak iki karakter kaydedebilirsiniz c=(c-b)/(b-a);.
Peter Taylor

C çözümünde, scanf()biçim dizesindeki boşluklara ihtiyacınız yoktur .
Reto Koradi

7

AWK, 35 karakter

{m=($3-$2)/($2-$1);print m,$2-$1*m}
  • Giriş biçimi: 2 0 -4

bc, 39 karakter

define f(a,b,c){
m=(c-b)/(b-a)
m
b-a*m}
  • Giriş biçimi: z=f(2, 0, -4)
  • Girdi bir bcifadedir. Sonra bckaynak dosyasını okur, standart girdi okur. Bu nedenle giriş bir işlev çağrısı gibi görünmelidir.
  • Ben bcsonra bir satırsonu gerektiren OpenBSD kullanın {.

Ortak Lisp, 88 karakter

(let*((a(read))(b(read))(c(read))(m(/(- c b)(- b a))))(format
t "~A ~A" m (- b(* a m))))
  • Giriş biçimi: 2 0 -4

csh, 86 karakter

set i=(`cat`)
@ m=($i[3] - $i[2]) / ($i[2] - $i[1])
@ n=$i[2] - $i[1] * $m
echo $m $n
  • Giriş biçimi: 2 0 -4
  • 86. karakter dosyanın sonundaki satırsonu. cshdosya sonunda satırsonu saydığım tek dildir. Bunun nedeni csh, yeni satır olmadığı sürece asla son komutu çalıştırmamasıdır.
  • set i=($<) çalışmıyor, çünkü $< kelime bölme yok.

dc, 30 karakter

?scsbsalclb-lbla-/psmlblalm*-p
  • Giriş biçimi: 2 0 _4_ alt çizgi nerede .

es, 95 karakter

i=(`cat)
b=$i(2)
m=`{expr \( $i(3) - $b \) / \( $b - $i(1) \)}
echo $m `{expr $b - $i(1) \* $m}
  • Giriş biçimi: 2 0 -4
  • esolan uzayabilir kabuk Paul Haahr ve Byron Rakitzis tarafından.

Faktör, 138 karakter

USING: eval formatting io kernel locals math ;
contents eval( -- a b c ) [let :> ( a b c )
c b - b a - / dup a * b swap - "%d %d" printf ]
  • Giriş biçimi: 2 0 -4

PicoLisp, 74 72 karakter

(in()(let(r read a(r)b(r)c(r)m(/(- c b)(- b a)))(print
m (- b(* a m)))))
  • Giriş biçimi: 2 0 -4
  • DÜZENLEME: değiştirerek 2 karakter Kayıp a(read)b(read)c(read)için r read a(r)b(r)c(r).

TI-83 BASIC, 63 61 karakter

:Input A
:Input B
:Input C
:(C-B)/(B-A)→M
:Disp M
:Disp B-A*M
  • Giriş biçimi: 2ENTER 0ENTER ¯4ENTER, burada¯ hesap makinesinin tekli eksi konumu.
  • Unicode karakterleri saydım; (sağ ok) U + 2192 olarak sayılır. Örneğin, hesap makinesi Input A2 karakter olarak sayılır , ancak Input A7 karakter olarak sayılır . Ben de :1 karakter olarak sayıyorum .
  • EDIT: Yanlış anlattım: 63 değil, 61 karakter var.

zsh, 62 karakter

i=(`cat`)
((b=i[2],m=(i[3]-b)/(b-i[1]),n=b-i[1]*m))
echo $m $n
  • Giriş biçimi: 2 0 -4

7

AWK (32)

{m=$3-$2;print m/=$2-$1,$2-$1*m}

Demo: http://ideone.com/kp0Dj


bash (38)

awk '{m=$3-$2;print m/=$2-$1,$2-$1*m}'

Demo: http://ideone.com/tzFi8


DOS / BATCH (54 55 )

set/a m=(%3-%2)/(%2-%1)&set/a n=%2-%m%*%1&echo %m% %n%

Parametreleri boşlukla ayrılmış argümanlar listesi olarak alır.


Java (143 185 )

enum R{R;{int a=0,b=0,c,i=2;for(;(c=new java.util.Scanner(System.in).nextInt()+b*--i)+i>=c;b=c)a+=c*i;c/=b-a;System.out.print(c+" "+(b-a*c));}}


JavaScript (48 61 67 )

p=prompt;m=p(b=p(a=p()))-b;alert([m/=b-a,b-a*m])

Demo: http://jsfiddle.net/BT8bB/6/


PHP (61 77 )

<?list(,$a,$b,$c)=$argv;$c-=$b;echo($c/=$b-$a).' '.$b-=$c*$a;

Demo: http://ideone.com/CEgke


QBasic (34)

INPUT a,b,c
m=(c-b)/(b-a)
?m;b-m*a

TI-83 Temel (25 41 )

:Prompt A,B,C
:(C-B)/(B-A
:Disp Ans,B-AAns

Evet, eksik sağ parantez bilerek yapılmıştır. TI-83 Temel programlamasında STO işlemi öncesinde parantezlerin kapatılmasının iyi bilinen bir optimizasyon tekniğidir.


1
JS biri Firefox'ta benim için çalışmıyor - pundefined bir hata alıyorum . JS spesifikasyonu, işlev çözülmeden önce işlev bağımsız değişkenlerinin değerlendirilmesi gerektiğini söylüyor mu?
Peter Taylor

Hmm. Evet haklısın. Spesifikasyona göre, bu benzer SO sorusunda açıklandığı gibi çalışmamalıdır: stackoverflow.com/questions/9941736/… . İşlevlerin, bağımsız değişkenleri değerlendirilmeden önce bağlanması gerekiyor ve Chrome görünüşte tersine yapıyor.
mellamokb

Yukarıda görebileceğiniz tamamen farklı bir yaklaşımla en yüksek Java çözümünü yenmek için uzun ve zor denedim. 143 en yakın olanı. Herkesin bir fikri var, lütfen yolumu gönderin!
mellamokb

6

Boşluk, 123

    





















I / O satırsonu ile ayrılmıştır. (Kaynak kodunu elde etmek için düzenleme moduna girin ve boşlukları ön biçimlendirme etiketleri arasına kopyalayın veya çevrimiçi görün Ideone'daki örneğe bakın .)

S, T, L'nin Space, Tab, Linefeed'i temsil ettiği açıklama:

Pseudocode     Whitespace
----------     ----------
push 0         SS SSL
readn          TLTT
push 1         SS STL
readn          TLTT
push 2         SS STSL
dup            SLS
readn          TLTT
retr           TTT
push 1         SS STL
retr           TTT
-              TSST
push 1         SS STL
retr           TTT
push 0         SS SSL
retr           TTT
-              TSST
/              TSTS
dup            SLS
outn           TLST
push 10        SS STSTSL
outc           TLSS
push 0         SS SSL
retr           TTT
*              TSSL
push 1         SS STL
retr           TTT
swap           SLT
-              TSST
outn           TLST
exit           LLL

R, 50

x=scan(n=3);y=diff(x);z=y[2]/y[1];c(z,x[2]-x[1]*z)

I / O boşlukla ayrılmıştır.


Baykuş

--- 22 ---

< <%<-2`2`-/%.10)2'*-.

I / O satırsonu ile ayrılmıştır.

--- 19 --- (bu sürüme izin veriliyorsa; \ n yürütülebilir kod olduğu için hile olduğunu düşünüyorum):

1`-1`3`-/%.32)2'*-.

I / O boşlukla ayrılmıştır. Komut satırı kullanımı: owl prog 5 19\ 77(\, Baykuş'da bir postfix tekli eksi olarak çalışır).


Baykuş girişinizle, 19 karakterlik çözümünüzün yargısını askıya alabilirim, çünkü 22 karakterlik çözümünüz zaten dil için kazanıyor.
PhiNotPi

5

J, 23 karakter

(],1{x-0{x*])%~/2-/\x=:

Kullanımı:

   (],1{x-0{x*])%~/2-/\x=: 5 _19 77
_4 1

Negatif sayılar J'de alt çizgi ile temsil edilir.

PHP, 88 karakter

<?php
list($x,$y,$z)=split(' ',fgets(STDIN));
$a=($z-$y)/($y-$x);
echo$a." ".($y-$a*$x);

Scala, 102 karakter

val x=readLine.split(" ").toList.map(_.toInt)
val a=(x(2)-x(1))/(x(1)-x(0))
print(a+" "+(x(1)-x(0)*a))

Perl, 57 karakter

s!(.+) (.+) (.+)!$a=($3-$2)/($2-$1);$a." ".($2-$1*$a)!e

2 karakter eklediğim '-p' seçeneğini gerektirir. Girişin bazı karakterleri kaydetmek için geçerli olduğunu varsayar.

Tüm cevaplarım boşlukla ayrılmış sayılar alıyor.


J programları hakkında ... Girişin kullanıcıdan istenmek yerine doğrudan kaynak dosyaya kodlanmasına izin veriliyor mu?
res

@ Res Komut satırında çağırdığım şekilde verdim. 1!:1]3İfadenin sağına eklendiğinde STDIN'den giriş okunacaktır. Bence bu konuya izin verilip verilmeyeceği konusunda meta veya bazı J cevaplarına yapılan yorumlar tartışılmıştır. Biraz kararsızım - J'nin en küçük alanda istediğimi yapmasını nasıl sağladığımı anlamaktan hoşlanıyorum, eğer herkesin istediği buysa STDIN'den girdi için 6 karakter cezasını alacağım.
Gareth

J için izin verilirse, diğer bazı girişlerin de benzer şekilde kısaltılabileceğini düşünüyordum. (BTW, önerilen ifadenizi çalıştıramadım, ancak(],1{x-0{x*])%~/2-/\x=:".1!:1]1 konsol modunda iyi görünüyor.)
res

@res Oh evet, ben bir dizeden bir sayı listesine dönüştürmeyi unuttum (sonunda 3 normalde benim için iyi çalışıyor olsa da?)
Gareth

($a=($_[1]-pop)/($_[0]-$_[1])).$/.($_[1]-$_[0]*$a)
Perl'i

4

PHP, 74,72 , 69

<?fscanf(STDIN,'%d%d%d',$a,$b,$c);echo($d=($c-$b)/($b-$a)).' '.($b-$d*$a);

Girdi bağımsız değişken olarak iletildiğinde:

<?echo($d=($argv[3]-$argv[2])/($b=$argv[2]-$a=$argv[1])).' '.($b-$d*$a);

Şimdi, @mellamokb'un önerdiği gibi, $ n = $ argv kullanarak:

<?$n=$argv;echo($d=($n[3]-$n[2])/($b=$n[2]-$a=$n[1])).' '.($b-$d*$a);

C, 77 , 78

main(a,b,c,d){printf("%d %d",d=(c-b)/(b-a),b-d*a,scanf("%d%d%d",&a,&b,&c));}

^ çalışmıyor, işte burada: [@ugoren sayesinde farkettiğiniz için teşekkürler]

main(a,b,c,d){printf("%d %d",d,b-a*(d=(c-b)/(b-a)),scanf("%d%d%d",&a,&b,&c));}

1 Vay, sen yapabildiğini bilmiyordum fscanfve scanfboşluksuz. Müthiş!
mellamokb

1
İkinci PHP çözümünüzde, yeniden adlandırarak $argv, yani $n=$argvbaşlangıçta birkaç karakter daha kaydedemediniz mi?
mellamokb

@ mellamokb- evet! Bunu düşünmedim! Teşekkürler! :)
l0n3sh4rk

C kodunuz çalışmıyor (Linux'ta denedim). Çok garip bir parametre değerlendirme sırasına güveniyorum - neden scanfönce o d=..zaman yapılsın b-d*a?
ugoren

1
Söyleyebileceğim kadarıyla, bu çoğu ortamda (ör: ideone.com/I2cPg ) keyfi olarak "gerçekleşir" , ancak C'deki parametre değerlendirme sırası tanımlanmamış davranıştır ve bu nedenle teknik olarak güvenilmemelidir: orangejuiceliberationfront .com /…
mellamokb

3

VBA, 57 karakter

Sub x(a,b,c)
y=(c-b)/(b-a)
MsgBox y & " " & b-a*y
End Sub

( Bu temel olarak diğer 'BASIC' işlevleriyle aynıdır, ancak orada daha önce VBA gönderimi görmedim. )


3 numaralı satırı 3 olarak değiştirerek 8 bayt düşürebilirsinizDebug.?y;b-a*y
Taylor Scott

3

bash (42 karakter)

Saf bash:

((m=($3-$2)/($2-$1),c=$2-m*$1));echo $m $c

bash (31 karakter)

Başka bir şeye bombardımanı:

owl -p"<%<%<$-1`4'-/%.32)2'*-."

(Howard'ın BAYKUŞ uygulaması )


3

Bu, burada açıklanan sınırsız kayıt makinesi için (optimize edilmemiş) koddur: http://www.proofwiki.org/wiki/Definition:Unlimited_Register_Machine

Giriş, program 1,2 ve 3'te olmalı ve program tamamlandıktan sonra çıkış 1, 2 kaydında olacaktır. Negatif olmayan ve tamsayı olmayan sayılar ele alınmaz, ancak 0,7,14 ve 2,5,11 girdileri doğru şekilde işlenir.

Zero[8] Trans[2,11] Jump[3,11,7] Succ[11] Succ[8] Jump[11,11,3] Zero[5] Trans[1,12] Jump[2,12,13] Succ[12] Succ[5] Jump[12,12,9] Zero[17] Trans[8,13] Jump[13,17,25] Zero[16] Trans[5,14] Jump[13,14,22] Succ[14] Succ[16] Jump[14,14,18] Succ[9] Trans[16,13] Jump[17,17,15] Zero[6] Zero[20] Jump[9,6,40] Zero[7] Trans[1,21] Jump[20,7,36] Succ[21] Trans[21,19] Trans[19,21] Succ[7] Jump[7,7,30] Trans[21,18] Trans[18,20] Succ[6] Jump[6,6,27] Trans[20,4] Zero[10] Trans[4,15] Jump[2,15,47] Succ[15] Succ[10] Jump[15,15,43] Trans[9,1] Trans[10,2]

EDIT: parantezleri kaldırarak ve talimat adlarını kısaltarak:

URM 285

Z8 T2,11 J3,11,7 S11 S8 J11,11,3 Z5 T1,12 J2,12,13 S12 S5 J12,12,9 Z17 T8,13 J13,17,25 Z16 T5,14 J13,14,22 S14 S16 J14,14,18 S9 T16,13 J17,17,15 Z6 Z20 J9,6,40 Z7 T1,21 J20,7,36 S21 T21,19 T19,21 S7 J7,7,30 T21,18 T18,20 S6 J6,6,27 T20,4 Z10 T4,15 J2,15,47 S15 S10 J15,15,43 T9,1 T10,2


(+1) Ama ... "Negatif olmayan ve tamsayı olmayan sayılar ele alınmıyor" ... Sanırım negatif sayıların ele alınmadığını söylemek istediniz . (OP tüm giriş ve çıkış tamsayıdır söylüyor.)
çözünürlüklü

Ah, bu çıkışın tam sayı olduğunu okumadım ...
Per Alexandersson

Bunu karakter sayısına veya talimat sayısına göre saymalı mıyım?
PhiNotPi

Belki düzenlenmiş sürümdeki karakterleri sayın ...
Per Alexandersson

3

DOS-BATCH, 98

@ECHO OFF&SET/P p=&SET/P q=&SET/P r=&SET/A m=(%r%-%q%)/(%q%-%p%)&SET/A n=%q%-%p%*%m%&ECHO %m% %n%

Ayrı satırlarda giriş

Bash, 51

m=$((($3 - $2)/($2 - $1)))
echo $m $(($2 - $m*$1))

Misal : sh prog.sh 2 0 -4 (boşlukla ayrılmış bağımsız değişkenler)

Perl, 84

@s=split(/ /,&lt;STDIN&gt;);$m=($s[2]-$s[1])/($s[1]-$s[0]);print $m." ".($s[1]-$s[0]*$m);

Java, 297

import java.util.*;public class A{public static void main(String a[]){StringTokenizer s=new StringTokenizer(new Scanner(System.in).nextLine());int i=4;int[] p=new int[i];while(i-->1)p[3-i]=Integer.parseInt(s.nextToken());p[3]=(p[2]-p[1])/(p[1]-p[0]);System.out.print(p[3]+" "+(p[1]-p[0]*p[3]));}}

Boşlukla ayrılmış girdi, boşlukla ayrılmış çıktı.

SQL, 57

select (&3-&2)/(&2-&1),&2-((&3-&2)/(&2-&1)*&1) from dual

Bu üzücü bir giriş, ama 'sadece' amacı çözüyor. 1,2,3 çalışma zamanında sorgu bağlamaları girdi sırasına göre değişkenlerdir.


Diğerleri zaten bashçözümünüzü yenmiş olsa da , tüm bu fazladan boşlukları kaldırıp 6 karakterden tasarruf edebileceğinizi önermek istedim.
mellamokb

Teşekkürler mellamokb, farkettim ki, sonradan biraz göz ardı ettim. Ayrıca, dos / toplu çözüm düşünmekten kendimden nefret ediyorum, bu kafamı tıklamalı ... args ahh!
Aman ZeeK Verma

2

Q, 36

{a,x[2]-x[1]*a:%[x[2]-x 1;x[1]-x 0]}

kullanım

q){a,x[2]-x[1]*a:%[x[2]-x 1;x[1]-x 0]}each(0 7 14;2 5 11;2 0 -4;5 -19 77)
1  7 
2  1 
2  -4
-4 1

2

Fortran 44

read*,i,j,k;k=(k-j)/(j-i);print*,k,j-i*k;end

Giriş tek bir satırda olacak (virgül veya boşlukla ayrılmış)

Cray Şapeli 59

var i,j,k:int;read(i,j,k);k=(k-j)/(j-i);write(k," ",j-i*k);

Giriş tek satırda olacak, satırsonu olmayacak ( writelnyerine kullanarak 2 karakter ekleyin write).

Golflua 44

r=I.r;a,b=r(),r();m=(r()-b)/(b-a);w(m,b-m*a)

Newline sınırlamalı girdi, alan sınırlamalı çıktı


2

Julia, 71 karakter

Alan sınırlı giriş ve çıkış.

i,j,k=int(split(readline(STDIN)));println("$(l=div(k-j,j-i)) $(j-i*l)")

Örnek giriş ve çıkış:

julia> i,j,k=int(split(readline(STDIN)));println("$(l=div(k-j,j-i)) $(j-i*l)")
5 -19 77
-4 1

Piet, 86 60 56 kodlu (14x4), daha iyi görünürlük için 10 kodek boyutu

Aslında codels miktarını% 35 oranında küçülttüm. Böyle iyi bir sonuç beklemiyordum. Bu programı geriye doğru kodlamak beklediğim gibi oldukça başarılıydı. Bundan daha kısa olabileceğinden şüpheliyim, ancak daha küçük bir çözüm bulabilirse gerçekten ilgilenirim.

Zorluk, programın sonucu gösterdikten sonra durdurulması gerekip gerekmediğini belirtmez, bu nedenle en küçük (56 kodlu) programım geçerli olmalıdır. Sonucu gösterdikten sonra başlangıca geri döner ve yeni bir tamsayı üçlüsü ister. Sıkı paketleme nedeniyle iki yeni satır karakterinin çıktısı için yer yoktur, ancak npiet yorumlayıcıda sorun yoktur, çünkü her zaman bir '?' girişi bekliyorsa.

Döngülü bir sürüm oluşturmak için iki boyut vardır, ancak en az 64 kodlu (16x4) büyük bir programda yalnızca bir kez çalışan bir sürüm mümkündür. Aşağıdaki sürümler bunun nedenini göstermektedir. Belki de Piet'i bilenler için de ilginçtir.

Bir döngü ile son, en sıkı paketlenmiş 56 kodlu sürüm :

A Serisi 56 kodlu için Kural Bul

İkinci versiyon (60 kodlu), bir döngü ile

A Serisi 60 kodlu için Kural Bul

56 kodlu sürüm kurallara aykırı ise, burada yalnızca bir kez çalışan son 64 kodlu sürüm bulunur :

64 Serisi İçin Kural Bul, bir kez çalıştır

İlk versiyonum (86 kodlayıcı)

A Serisi 86 kodlu için Kural Bul

Girdi ve çıktı satırsonu ile sınırlandırılmıştır.

Örnek giriş ve çıkış:

D:\codegolf\npiet-1.3a-win32>npiet ml_series.png
? 5
? -19
? 77
-4
1

Döngülü sürümler için biraz daha çirkin görünüyorsun:

D:\codegolf\npiet-1.3a-win32>npiet ml_series_56_codels.png"
? 5
? -19
? 77
-4
1? 5
? -19
? 77
-4
1? 5
? -19
? 77
-4
1?

Sınırlayıcı olarak newline'ı seçtim çünkü ASCII 10 (\ n) kodlaması, 8 kodlu ve hatta 9 kodlu ASCII 40 (,) gerektiren ASCII 32 () ile karşılaştırıldığında sadece 7 koda ihtiyaç duyuyor.

Sonuçtan ilk girişe geriye doğru kodlama, ROL işlemleri için kodel kullanımını azaltmanın harika bir yoludur. Başlangıçtaki ve sondaki yığın sırası bilinir, geri kalanlar elle kolayca yapılır.

İşte benim makyaj steno, 64 kodlu programın (yığın ile) bir metin versiyonu. Kısa programlar sona ermez, ancak başlangıca geri döner.

NOP ADD DIV GRT DUP INC END
 0   +   /   >   =   c   ~
PSH SUB MOD PTR ROL OUN
 X   -   %   #   @   N
POP MUL NOT SWI INN OUC
 ?   *   !   $   n   C

                   1
        1    1   2 2     1                   a,b,c: input for series
      5 5  3 3 c c cb  3 3                       D: c-b
    b b bb b bbb b bcD D Da                      E: b-a
   bb b bb b baa a aaa a abE F                   F: D/E, (c-b)/(b-a), mul. const.
  bbb b ba a abb b bbb b bDDFFF    5             G: a*F, a(c-b)/(b-a)
 aaaa a aa a aaa a aaa a aaaaaaG  55 10          H: b-G, b-a*F, add. const.
aaaaa a ab b bbb b bbb b bbbbbbbH HH  H H
n=n==5X1X@3X1X@n2X1X@-3X1X@-/=N*-5X=  + CN~
| |            |     |     || |||\____/ ||
| |            |     |     || |||  |    |+———— output add. const.
| |            |     |     || |||  |    +————— output newline character
| |            |     |     || |||  +—————————— 5 DUP + =10, ASCII for \n
| |            |     |     || ||+————————————— H, add. const.
| |            |     |     || |+—————————————— G
| |            |     |     || +——————————————— output mul. const.
| |            |     |     |+————————————————— F, mul. const.
| |            |     |     +—————————————————— E
| |            |     +———————————————————————— D
| |            +—————————————————————————————— input c
| +——————————————————————————————————————————— input b
+————————————————————————————————————————————— input a

1

MoonScript (48 karakter, satırsonu sınırlandırılmış girdi, alan sınırlamalı çıktı)

r=io.read
a,b=r!,r!
m=(r!-b)/(b-a)
print m,b-m*a

Felix (86 karakter, satırsonu sınırlanmış girdi, virgülle ayrılmış çıktı)

gen r()=>int $ readln stdin;
var a,b=r(),r();
var m=(r()-b)/(b- a);
println(m,b- m*a);

Julia (84 karakter, alan sınırlı girdi, alan sınırlı çıktı)

a,b,c=tuple(map(int,split(readline(STDIN)))...)
m=(c-b)/(b-a)
println("$m $(b-m*a)")

Julia çözümünüz bir hata veriyor. HATA: d: \ codegolf \ series.jl yüklenirken, tuple.jl: 19 dizininde indexed_next dosyasında BoundsError () (2 kez yinelenir), satır 1'den başlayarak
ML

@ML Bu çok garip. Julia'nın en yeni versiyonunda değişen bir şey olabilir. Deneyeceğim.
kirbyfan64sos

Konsolda denersem hatayı ilk satırdan hemen sonra alırım. Bir şekilde çizgi bir tuple oluşturur, bu her zaman (a, b, 0) .jl dosyası aracılığıyla eklersem çıktıyı oluşturur, ancak Julia REPL'i geri almak için enter tuşuna basarsam hatayı atar. Julia> include ("happy_birthday_codegolf.jl") 5 -19 77-4 1 HATA: d: \ codegolf \ series.jl dosyasını yüklerken d: \ codegolf \ series.jl dosyasını yüklerken d: \ codegolf \ series.jl dosyasını yüklerken BoundsError () satır 1 Yorumlara satır kesmeleri eklemenin bir yolu var mı? Dağınıklık için özür dilerim.
ML

@ML Bir dosyaya koymak ve onu çalıştırmak julia file.jlaynı hatayı veriyor mu?
kirbyfan64sos

Sanırım yukarıdaki cevabımın karışıklığında okunamıyor. Evet, hem konsolu denedim hem de .jl dosyasıyla dahil ettim. “Bir .jl dosyası aracılığıyla eklersem çıktıyı oluşturur ancak Julia REPL'i geri almak için enter tuşuna basarsam hatayı atar.” Örneğinizi .jl dosyası aracılığıyla çalıştırırsam, julia> REPL / istemi geri gelmeden önce program bazı girişleri bekler.
ML
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.