Steckdose

23

Dies ist ein Problem von NCPC 2005 . Roy hat eine Wohnung mit nur einer Steckdose, aber er hat ein paar Steckdosenleisten. Berechnen Sie mit den vorhandenen Steckdosenleisten die maximale Anzahl an Steckdosen. Die Anzahl der Steckdosen pro Steckdosenleiste wird als Eingabe angegeben.

Es stellt sich heraus, dass die Anzahl der Auslässe der Streifen jeweils ist

p1,p2,,pn

dann ist die Anzahl der Ausgänge ,

1n+ipi

oder

1+p11+p21++pn1
.

Die Eingabe für das Programm oder die Funktion ist eine nicht leere Reihe positiver Ganzzahlen.

Beispiele

2 3 4
> 7
2 4 6
> 10
1 1 1 1 1 1 1 1
> 1
100 1000 10000
> 11098
Pål GD
quelle
17
Und ich dachte, Sie sollten keine Steckdosenleisten verketten ...
Joey
Soweit ich weiß, ist meine Retina-Antwort die einzige Antwort, die eine unäre Eingabe verwendet. Vielleicht möchten Sie einen Blick auf die Kommentardiskussion werfen : codegolf.stackexchange.com/questions/71047/electrical-outlet/… ... Wenn Sie der Meinung sind, dass die unäre Lösung zu viel Hack ist, ist das nicht im Sinne von Zur Herausforderung freue ich mich, dass Sie angeben, dass die Eingabe dezimal erfolgen soll (und dann meine Antwort entsprechend korrigieren wird).
Martin Ender
7
Weil Strom so teuer ist, sollte Ihr Code so kurz wie möglich sein, um nicht mehr Energie
cat
1
@cat Zeit, die alte hamstergetriebene Turingmaschine und die mechanischen Computer auszuheben.
Pharap
1
@immibist sicher, aber die Ausgabe würde als die im Bytestream enthaltenen Informationen behandelt und nicht als das, was von Ihrem Terminal gerendert wird.
Martin Ender

Antworten:

29

Netzhaut , 3 Bytes

 1

Der Zeilenvorschub am Ende ist signifikant.

Die Eingabe ist eine durch Leerzeichen getrennte Liste von unären Zahlen .

Probieren Sie es online!

Erläuterung

Der Code entfernt einfach alle Leerzeichen sowie die folgenden 1aus der Zeichenfolge. Hier ist, warum das funktioniert:

Das Hinzufügen in unary ist einfach: Verketten Sie einfach die Zahlen, was dem Entfernen der Trennzeichen entspricht. Das Verringern um 1 ist ebenfalls einfach: Entfernen Sie einfach ein 1von jeder Zahl. Wir wollen 1 mehr als die Summe der dekrementierten Eingaben, also entfernen wir einfach nur die 1s, die wir nach Leerzeichen finden, und dekrementieren dadurch alle Eingaben außer der ersten.

Martin Ender
quelle
1
Ich frage mich, ob die Eingabe in unary zulässig sein sollte.
John Dvorak
@JanDvorak ist es standardmäßig, es sei denn, die Abfrage gibt ausdrücklich eine Dezimaleingabe an. (Siehe den Link in der Antwort.) Egal, Jelly gewinnt trotzdem.
Martin Ender
@ MartinBüttner Es gibt Beispieldaten sowohl in dieser Frage als auch in der ursprünglichen Zuordnung. Denken Sie nicht (sofern nicht anders angegeben), dass es ein notwendiges (wenn auch nicht ausreichendes) Kriterium für die Übergabe sein sollte, dass der Code mit den wörtlichen Beispieldaten funktioniert?
Nitro2k01
1
@ nitro2k01 Nein (in diesem Fall wären die meisten Antworten wahrscheinlich ungültig). Sofern die Abfrage nicht ausdrücklich ein bestimmtes Eingabeformat angibt, gehen wir normalerweise davon aus, dass Listen in einem beliebigen nativen Listenformat erstellt werden können . Gleiches gilt für Zahlenformate (zumindest unär und die Verwendung von ganzen Zahlen als Bytewerte sind im Konsens zulässig, sofern die Abfrage dies nicht verbietet). Es ist so gut wie unmöglich, Beispieldaten in jedes erdenkliche native Eingabeformat in die Herausforderung einzubeziehen.
Martin Ender
@ MartinBüttner Imo, das ist nicht das Problem, das die Empfehlung anspricht. Was immer noch dagegen spricht, ist, dass (sofern ich mich nicht irre) dies nicht funktioniert, da Unary ein unterstütztes oder natives Zahlenformat in Retina ist, aber es funktioniert, wenn Sie den String als String-Daten verarbeiten. Es ist ein Hack. Es ist sogar ein kluger Hack, aber ich bin immer noch nicht davon überzeugt, dass er den Regeln entspricht. Wenn durch Leerzeichen getrennte unäre Zahlen in Retina ein systemeigenes Format wären, so wie eine Liste von Bytes in bf ein systemeigenes Format ist, würde ich der Empfehlung zustimmen und eine andere Meinung vertreten.
Nitro2k01
9

Hexagony , 18 14 Bytes

.?<_(@'")>{+.!

Entfaltet:

  . ? <
 _ ( @ '
" ) > { +
 . ! . .
  . . .

Probieren Sie es online!

Ich denke nicht, dass Seitenlänge 2 möglich ist, aber es muss eine effizientere Lösung für Seitenlänge 3 geben.

Dies ist der übliche Ansatz zum Dekrementieren aller, Summieren und Inkrementieren, aber ich muss später Diagramme hinzufügen, um zu zeigen, wie genau dies in Hexagony funktioniert.

Martin Ender
quelle
7

Python, 24 Bytes

lambda*n:1-len(n)+sum(n)

Probieren Sie es online aus

Mego
quelle
1
Dies setzt voraus, dass die Funktion zuerst zugewiesen und dann auf die Eingabe einer anderen Variablen angewendet wird.
Juandesant
1
@juandesant ... das ist völlig in Ordnung. Es ist ein Funktionsliteral, das eine gültige Form der Einreichung ist.
FlipTack
7

Mathematica, 9 Bytes

Tr[#-1]+1&
Ein Simmons
quelle
7

Haskell, 17-15 Bytes

foldl1$(+).pred

Anwendungsbeispiel: ( foldl1$(+).pred ) [2,4,6]-> 10.

Alte Version, anderer Ansatz, 17 Bytes succ.sum.map pred.

nimi
quelle
6

J, 6 Bytes

+/+1-#

Summe plus eins minus Länge. Klammern Sie es ein und wenden Sie es wie folgt an:

   (+/+1-#) 2 3 4
7
Lynn
quelle
6

Labyrinth , 9 Bytes

"?;)!@
+(

Probieren Sie es online!

Die übliche Grundierung:

  • Labyrinth ist 2D und stapelbasiert. Stapel haben eine unendliche Anzahl von Nullen am unteren Rand.
  • Wenn der Anweisungszeiger eine Kreuzung erreicht, prüft er die Oberseite des Stapels, um festzustellen, wohin er als nächstes abbiegen soll. Negativ ist links, Null ist vorwärts und positiv ist rechts.

Hier fangen wir oben links an ", ein No-Op, und gehen nach rechts. Der nächste ist? ein Int aus STDIN gelesen (wirft Zeichen weg, die nicht als Integer analysiert werden können, z. B. Leerzeichen). Jetzt haben wir zwei Fälle:

Wenn die Eingabe positiv ist, biegen wir nach rechts ab und führen Folgendes aus:

(            decrement top of stack
+            add top two stack elements
             [continue loop]

Wenn die Eingabe Null ist (was bei EOF auftritt), gehen wir geradeaus und führen Folgendes aus:

;            pop zero from EOF
)            increment top of stack
!            output top of stack as number
@            halt program
Sp3000
quelle
5

Pyth, 5 Bytes

hstMQ

Inkrement (Summe (Karte (Dekrement, Eingabe)))

Lynn
quelle
5

ES6, 25 Bytes

a=>a.map(n=>r+=n-1,r=1)|r
Neil
quelle
4
Ich wollte posten: "Einer der seltenen Fälle, in denen Reduce das Spiel gewinnt" ... und es sind auch 25 l=>l.reduce((a,b)=>a+b-1).
Edc65
@ edc65 Ja, das (,b)ist teuer, aber ich mag diese Version auch.
Neil
4

05AB1E , 4 Bytes

Code:

E<O>

Erläuterung:

E     # Evaluates input
 <    # Decrement on list
  O   # Compute the total sum
   >  # Increment on the sum
      # Implicit: output top of the stack

Nimmt Eingaben wie ein Array (zB [3, 4, 5]) auf.

Adnan
quelle
Sehr elegant für eine
Golflang
4

Sternenklar , 26 24 Bytes

, + '`      + ** `, +'*.

Erwartet durch Zeilenumbrüche getrennte Ganzzahlen. Probieren Sie es online!

Danke an @ MartinBüttner für -2 Bytes.

,           Read line as integer
 + '        Dupe and jump to label 1 if nonzero
`           Set label 0
      +     Push 1
 *          Sub
*           Add
 `          Set label 1
,           Read line as integer
 + '        Dupe and jump to label 0 if nonzero
*           Add
.           Output as integer

Die Schleife wird abgerollt, sodass die erste Zahl nicht dekrementiert wird, sodass keine Inkrementierung erforderlich ist. Zahlen pushen ist teuer in Starry ...

Sp3000
quelle
Ich zähle nur 20 Bytes.
Addison Crump
1
@VoteToClose Hast du die führenden Leerzeichen gezählt? (Ich
nehme an
4

Bash + GNU-Dienstprogramme, 16

Wenn es NSteckdosenleisten gibt, sollte N-1die durch Kommas getrennte Eingabeliste Trennzeichen enthalten. Alles was wir tun müssen, ist die Trennzeichen zu ersetzen - 1 +und arithmetisch auszuwerten:

sed s/,/-1+/g|bc

Oder mit dem gleichen Trick:

Pure Bash (keine externen Dienstprogramme), 19

echo $[${1//,/-1+}]
Digitales Trauma
quelle
3

APL (NARS 2000), 13 10 Bytes

{1+(+/⍵)-⍴∊⍵}

Edit: Runter auf 10 mit Lynns (besserem) Ansatz.

{1++/1-⍨⍵}

Koneke
quelle
3

gs2, 5 bytes

(CP437-codiert.)

W&Φd'

Das ist read-nums dec m1 sum inc.

Lynn
quelle
3

CJam, 7 Bytes

q~:(:+)

Teste es hier.

Gleicher Ansatz wie bei Lynn (Alles dekrementieren, Summe, Inkrementieren). Dies funktioniert auch für 8 Bytes (und ist vielleicht etwas interessanter):

q~{(+}*

Dies faltet "Dekrementieren, Hinzufügen" über die Liste. Auf diese Weise wird das Dekrement nur auf alle Elemente mit Ausnahme des ersten angewendet, sodass wir uns nicht um das Inkrement separat kümmern müssen.

Martin Ender
quelle
3

C 60 59 55 Bytes

x;main(s){while(~scanf("%i",&x))s+=x-1;printf("%i",s);}
stmbgr1
quelle
3

Perl 6, 14 Bytes

{1+[+] --«@_}

Verwendung

my &f = {1+[+] --«@_}

say f([2,3,4]) # 7
say f([2,4,6]) # 10
say f([1,1,1,1,1,1,1,1]) # 1
say f([100,1000,10000]) # 11098
Hotkeys
quelle
Ich wollte unbedingt meine Antwort auf das Gleiche
ändern
11 Bytes:{.sum-$_+1}
Nwellnhof
3

Im Ernst, 7 Bytes

,;l@Σ-u

Probieren Sie es online!

Erläuterung:

,;l@Σ-u
,        push input
 ;       dupe
  l@     push length (n), swap
    Σ-u  push sum, subtract n, add one
Mego
quelle
2

Perl 6 , 20 Bytes

put 1+sum --«@*ARGS

(Sie können <<anstelle von verwenden «)

Verwendung:

$ perl6 -e 'put 1+sum --«@*ARGS' 100 1000 10000
11098
Brad Gilbert b2gills
quelle
«Ist ein Perl-Operator?
user253751
@immibis Tatsächlich ist es Teil mehrerer Perl 6-Operatoren. @arraya »+« @arrayb ++«@array @array».method @array»++ « a 'space separated' list of words »Einige dieser Operatoren werden als Meta-Operatoren bezeichnet, da sie mit anderen Operatoren kombiniert werden. (Perl 5 hat diese Operatoren derzeit nicht.)
Brad Gilbert b2gills
2

Perl 5 23 + 2 = 25 oder 19 + 2 = 21

Benötigt -apFlaggen:

map{$.+=($_-1)}@F;$_=$.

In einer Datei gespeichert und ausgeführt als

perl -ap file.pl

BEARBEITEN: Eine andere Antwort, kleiner (19 + 2), aber im Grunde von dev-null-Antwort kopiert:

$.+=$_-1for@F;$_=$.
ChatterOne
quelle
2

F #, 25 Bytes

Seq.fold(fun s n->s+n-1)1

Dies ist eine Funktion, die ein Array / eine Liste / eine Folge von Ganzzahlen aufnimmt und das erforderliche Ergebnis zurückgibt.

Wie es funktioniert:

Seq.foldErmöglicht es Ihnen, eine Funktion auf jedes Element einer Sequenz anzuwenden, während Sie dabei einen Zustand mit sich herumtragen. Das Ergebnis der auf das erste Element angewendeten Funktion gibt den Zustand an, der in die Funktion für das zweite Element eingefügt wird, und so weiter. Um die Liste zusammenzufassen [1; 3; 4; 10], schreiben Sie sie beispielsweise folgendermaßen:

Seq.fold (fun sum element -> sum + element) 0 [1; 3; 4; 10]
         (       function to apply        ) ^ (sequence to process)
                                     ( initial state )

Welches würde so angewendet werden:

// First, initial state  + first element
0 + 1  = 1
// Then, previous state + next element until the end of the sequence
1 + 3  = 4
4 + 4  = 8
8 + 10 = 18

Der letzte Status ist der Rückgabewert von Seq.fold.

Roujo
quelle
2

𝔼𝕊𝕄𝕚𝕟, 5 Zeichen / 7 Bytes

ï⒭+‡_

Try it here (Firefox only).

Verwendet eine benutzerdefinierte Codierung mit 10-Bit-Zeichen (danke @Dennis!). Führen Sie encode('ï⒭+‡_')die JS-Konsole aus, um das verschlüsselte Formular abzurufen, unddecode(/*ENCODED TEXT HERE*/) abzurufen das codierte Formular zu decodieren.

Erläuterung

Übersetzt in Javascript ES6 als:

i=>i.reduce(($,_)=>$+--_)
Mama Fun Roll
quelle
Interessante Kodierung.
Lirtosiast
Es funktioniert auch ganz gut.
Mama Fun Roll
2

Mornington Crescent , 1909 1873 1839 Bytes

Take Northern Line to Stockwell
Take Victoria Line to Seven Sisters
Take Victoria Line to Victoria
Take Circle Line to Victoria
Take Circle Line to Bank
Take Circle Line to Hammersmith
Take Circle Line to Cannon Street
Take Circle Line to Hammersmith
Take Circle Line to Cannon Street
Take Circle Line to Bank
Take Circle Line to Hammersmith
Take District Line to Upminster
Take District Line to Hammersmith
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Turnham Green
Take District Line to Hammersmith
Take District Line to Turnham Green
Take District Line to Notting Hill Gate
Take Circle Line to Notting Hill Gate
Take Circle Line to Bank
Take Circle Line to Embankment
Take Northern Line to Stockwell
Take Northern Line to Embankment
Take Circle Line to Temple
Take Circle Line to Hammersmith
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Blackfriars
Take Circle Line to Embankment
Take District Line to Parsons Green
Take District Line to Bank
Take Circle Line to Hammersmith
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Parsons Green
Take District Line to Embankment
Take Circle Line to Blackfriars
Take Circle Line to Bank
Take Northern Line to Angel
Take Northern Line to Bank
Take Circle Line to Bank
Take District Line to Upminster
Take District Line to Bank
Take Circle Line to Bank
Take Northern Line to Mornington Crescent

Probieren Sie es online!

Pfeffer
quelle
"90% aller Anweisungen beziehen sich auf die District Line." Das liegt daran, dass sich in District alle arithmetischen Stationen befinden. Unter TIO scheint dies jedoch für keines der Beispiele zu funktionieren .
NieDzejkob
1873 Bytes mit kürzeren
Zeilennamen,
Der Interpreter von TIO hat einen Fehler und implementiert Turnham Green nicht
pppery
Schöner Fang. Ich habe eine PR gesendet, die das Problem im Vorfeld behebt.
NieDzejkob
1

Python 3, 79 Bytes

import sys
print(sum(map(lambda x: int(x)-1, sys.stdin.readline().split()))+1)
Pål GD
quelle
Sieht so aus, als würdest du eine Newline als zwei Bytes zählen. Ersetzen Sie es möglicherweise durch ein Semikolon, um ein Byte zu speichern. Einige Leerzeichen können auch entfernt werden.
Daffy
1

Ruby, 30 Bytes

$*.inject(1){|s,v|s+=v.to_i-1}

Einfach genug - beginnend mit 1 addieren Sie die angegebenen Zahlen zu je -1 (Befehlszeilenargumente sind in $*). Schande injectist so ein langes Wort.

Chowlett
quelle
1

PowerShell, 19 Byte

$args-join'-1+'|iex

Beachten Sie, dass dies 1 + p1-1 + p2-1 + ... + pn-1äquivalent zu istp1-1 + p2-1 + ... + pn .

Nimmt Eingaben als separate Befehlszeilenargumente mit an $args. Wir -joindie zusammen mit einem -1+Begrenzer einen String erstellen, wie z 2-1+3-1+4. Die Zeichenfolge wird dann an Invoke-Expression(ähnlich wie eval) weitergeleitet und gibt das Ergebnis aus.

AdmBorkBork
quelle
1

Perl, 21 + 2 = 23 Bytes

$a+=$_-1for@F;say++$a

Benötigt -aund -E:

$ perl -aE'$a+=$_-1for@F;say++$a'<<<'2 3 4'
7
undlrc
quelle
Sie können das -aFlag verwenden, um eine @FVariable mit bereits geteilten Elementen zu erhalten, und -n durch -p ersetzen, damit Sie es nicht benötigen say, und es auf 21 + 2 reduzieren:$a+=$_-1for@F;$_=++$a
ChatterOne
Verwenden -pstatt sayist das gleiche, weil ich es $_=trotzdem verwenden muss.
andlrc
@ ChatterOne -aist eine gute Idee!
andlrc
1

Brainfuck, 15 Bytes

Annahme: Der Operator, gibt 0 zurück, wenn alle Eingaben erschöpft sind und keine Verlängerungskabel mit 0 Steckern vorhanden sind. Außerdem muss die E / A in Byte-Werten anstelle von ASCII-Zeichencodes vorliegen.

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

Erläuterung: Dies verwendet 2 Register. Ein "Value" -Akkumulatorregister, das die Anzahl der Geräte darstellt, die angeschlossen werden können, und ein "Current Cord" -Register, das den Wert des aktuellen Kabels protokolliert. Zunächst wird der Wert für die vorhandene Steckdose um 1 erhöht. Dann subtrahiert es für jedes Verlängerungskabel eins vom Wert, seit ein Stecker aufgenommen wurde, und erhöht dann den Wert um die Anzahl der Stecker.

Die meisten Online-Interpreter arbeiten nicht im Raw-Byte-Eingabemodus. Verwenden Sie diesen Code, um es online zu testen:

+>,[->-[>+<-----]>---[-<+>]<[-<->]<[-<+>],]<.
Ethan
quelle
Kann ich das Programm irgendwo testen?
Pål GD
Danke, korrigiert diese Fehler. Mir sind keine Online-Dolmetscher bekannt, die im Byte-Modus arbeiten. Ich kann eine Implementierung zusammenfassen, die '0' von den Eingaben subtrahiert, die auf jedem Online-Interpreter ausgeführt werden.
Ethan
Wenn Sie den Code testen möchten, führen Sie ihn hier aus: copy.sh/brainfuck Fügen Sie keine Leerzeichen zwischen die numerischen Werte ein. Da der Demo-Code im ASCII-Modus ausgeführt wird, funktioniert er leider nur mit einstelligen Werten. Die 15-Byte-Version funktioniert jedoch ordnungsgemäß mit einem Wert <= 255. Nachdem Sie sie ausgeführt haben, zeigen Sie den Speicherauszug an, um den endgültigen Wert anzuzeigen.
Ethan
Eines Tages wird BF die richtigen Standards für erwartete E / A haben, und wir können nur sagen, dass Standard 3 verwendet wird, anstatt z.
Pharap